@rentman/rm-core 4.0.0 → 4.0.1
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/changelog.md +4 -0
- package/dist/rm-core.js +18 -4
- package/dist/rm-core.min.js +2 -2
- package/dist/types/models/ItemResource.d.ts +1 -1
- package/package.json +1 -1
package/dist/rm-core.js
CHANGED
|
@@ -8011,8 +8011,22 @@ var ItemResource_ItemResource = /** @class */ (function () {
|
|
|
8011
8011
|
* @deprecated
|
|
8012
8012
|
* Use {@link TransactionCache.applyChangesDelta transaction.applyChangesDelta} instead
|
|
8013
8013
|
*/
|
|
8014
|
-
ItemResource.prototype.callOnChange = function () {
|
|
8015
|
-
|
|
8014
|
+
ItemResource.prototype.callOnChange = function (previous) {
|
|
8015
|
+
var _this = this;
|
|
8016
|
+
var _a;
|
|
8017
|
+
var onChangeCallbacks = (_a = this.transaction.itemHandler.fieldChangeCallbacks[this.entry.itemType]) === null || _a === void 0 ? void 0 : _a[this.entry.itemId];
|
|
8018
|
+
if (onChangeCallbacks === undefined) {
|
|
8019
|
+
return;
|
|
8020
|
+
}
|
|
8021
|
+
for (var _i = 0, onChangeCallbacks_1 = onChangeCallbacks; _i < onChangeCallbacks_1.length; _i++) {
|
|
8022
|
+
var callback = onChangeCallbacks_1[_i];
|
|
8023
|
+
try {
|
|
8024
|
+
callback(this.entry, function (columnId) { return _this.factory.apiFormatter.compareFields(_this.entry.columns.response[_this.entry.itemType][columnId].type, _this.fields[columnId], previous[columnId]); }, this.fields, false, previous);
|
|
8025
|
+
}
|
|
8026
|
+
catch (error) {
|
|
8027
|
+
this.factory.exceptionHandler(error);
|
|
8028
|
+
}
|
|
8029
|
+
}
|
|
8016
8030
|
};
|
|
8017
8031
|
/**
|
|
8018
8032
|
* @description
|
|
@@ -9463,7 +9477,7 @@ var ChangesProcessorFactory = __webpack_require__(18);
|
|
|
9463
9477
|
|
|
9464
9478
|
var core_RmCore = /** @class */ (function () {
|
|
9465
9479
|
function RmCore(_apiRequestService, authInterface, errorHandler, exceptionHandler, promiseLibrary, linkTreeService) {
|
|
9466
|
-
this.version = '4.0.
|
|
9480
|
+
this.version = '4.0.1';
|
|
9467
9481
|
this.noop = noop;
|
|
9468
9482
|
// Create variables for each service in order to get a TypeScript error when a dependency hasn't been
|
|
9469
9483
|
// initialized yet.
|
|
@@ -10621,4 +10635,4 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
10621
10635
|
/***/ })
|
|
10622
10636
|
/******/ ]);
|
|
10623
10637
|
});
|
|
10624
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SbUNvcmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1JtQ29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlGb3JtYXR0ZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQXBpUmVxdWVzdFNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQXBpUmVzcG9uc2VQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ2hhbmdlc0NvbXBpbGF0aW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvSXRlbUhhbmRsZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uTWF0Y2hlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sbGVjdGlvbk1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25DYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uSW5mby50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5TZXQudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uU3Vic2V0Q2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uVXRpbC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db252ZXJzaW9uTWFwU2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DcmVhdGVSZXF1ZXN0LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5UGFyc2VyQmFzZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9RdWVyeUNvbHVtbkV4dHJhY3Rvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9Db2xsZWN0aW9uSGFuZGxlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvc2VydmVyL1NlcnZlckNvbGxlY3Rpb25IYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0l0ZW1FbnRyeVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvS2V5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Mb2NrU2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlNYXRjaGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5UGFyc2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1NvY2tldE1lc3NhZ2VIYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25WYWxpZGF0b3IudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvVXRpbC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0l0ZW1FbnRyeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtRW50cnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtUmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uRW50cnlPcHRpb25zLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25FbnRyeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25SZXNvdXJjZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL1RlbXBsYXRlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL1JtQ29yZS9leHRlcm5hbCBcIm1vbWVudFwiIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbGxlY3Rpb25DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uRW50cnlGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtbkV4cGFuc2lvbkZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2x1bW5JbmZvRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtblNldEZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DcmVhdGVSZXF1ZXN0RmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0l0ZW1DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9JdGVtRW50cnlGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvSXRlbVJlc291cmNlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1RyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1F1ZXJ5TWF0Y2hlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9RdWVyeVBhcnNlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1RlbXBsYXRlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL2luZGV4LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy90eXBlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9UZW1wbGF0ZUNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jb3JlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DcmVhdGVkQ2hhbmdlc0RlbHRhLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0ludGVybmFsQ2hhbmdlc0RlbHRhLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUNyZWF0ZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL3R5cGVzL0l0ZW1UeXBlc0NvbGxlY3Rpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ludGVyZmFjZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFD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O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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WSxFQUNqQixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsNkJBQTZCLEVBQ2xDLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixXQUFXLEVBQ1gsZUFBZSxFQUNmLHFCQUFxQixDQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUNGLDhCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7O0FDWkQ7QUFBQTtBQUFBLElBQVksWUFHWDtBQUhELFdBQVksWUFBWTtJQUN2QiwyQkFBVztJQUNYLHVDQUF1QjtBQUN4QixDQUFDLEVBSFcsWUFBWSxLQUFaLFlBQVksUUFHdkI7QUFrUUQsa0RBQWtEO0FBRWxELElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUMxQiwwQ0FBdUI7SUFDdkIsb0NBQWlCO0FBQ2xCLENBQUMsRUFIVyxlQUFlLEtBQWYsZUFBZSxRQUcxQjs7Ozs7Ozs7Ozs7Ozs7QUNuVEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMEM7QUFDRjtBQUNJO0FBQ1o7QUFDYTtBQUNKO0FBQ0U7QUFDUTtBQUNTO0FBQ007QUFDakIiLCJmaWxlIjoicm0tY29yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIm1vbWVudFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJtb21lbnRcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUm1Db3JlXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibW9tZW50XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJSbUNvcmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJtb21lbnRcIl0pO1xufSkod2luZG93LCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181X18pIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gOSk7XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgY29weSwgZXF1YWxzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIEFwaUZvcm1hdHRlciB7XG5cblx0TU9NRU5UX0lOVkFMSUQgPSAnSW52YWxpZCBkYXRlJztcblx0U0VSVkVSX0RBVEVUSU1FX0ZPUk1BVCA9ICdZWVlZLU1NLUREW1RdSEg6bW06c3NaJztcblx0U0VSVkVSX1RJTUVfRk9STUFUID0gJ0hIOm1tOnNzJztcblx0U0VSVkVSX0RBVEVfRk9STUFUID0gJ1lZWVktTU0tREQnO1xuXG5cdGNvbnN0cnVjdG9yICgpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIGlmIGEgY29sdW1uIHR5cGUgaXMgYW4gJ2V4cGVuc2l2ZScgdHlwZSwgbWVhbmluZyB0aGF0IHRoZSBhY3Rpb24gdG8gZm9ybWF0IHRoZSBmaWVsZCB0YWtlcyBzaWduaWZpY2FudCBDUFUgdGltZVxuXHQgKlxuXHQgKiAtLS0tXG5cdCAqIEByZW1hcmtzXG5cdCAqIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIE1vbWVudCBvYmplY3RzXG5cdCAqL1xuXHRwdWJsaWMgaXNFeHBlbnNpdmVGb3JtYXQgKGNvbHVtblR5cGU6IHN0cmluZykge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogT3ZlcndyaXRlcyB0aGUgdmFsdWVzIGluICdjaGFuZ2VzJyBpZiB0aGUgdmFsdWVzIGluICdpbml0aWFsJyBhbmQgJ2NoYW5nZXMnIGFyZSB0aGUgc2FtZSAobGVhdmluZyB1c2VyIGNoYW5nZXMgaW50YWN0KVxuXHQgKi9cblx0cHVibGljIG1lcmdlQ29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRuZXdJbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW4ucGF0aDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRuZXdJbml0aWFsW2NvbHVtblBhdGhdICE9PSB1bmRlZmluZWRcblx0XHRcdFx0JiYgKFxuXHRcdFx0XHRcdGNvbHVtblBhdGggPT09ICdpZCcgfHxcblx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0XHR0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdLFxuXHRcdFx0XHRcdFx0aW5pdGlhbFtjb2x1bW5QYXRoXSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdID0gdGhpcy5jbG9uZShcblx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0bmV3SW5pdGlhbFtjb2x1bW5QYXRoXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlcztcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblx0XHRcdGNvbnN0IGNvbHVtblR5cGUgPSBhcGlDb2x1bW4udHlwZTtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdGNvbHVtblR5cGUsXG5cdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRtb2RpZmllZFtjb2x1bW5JZF0sXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSB0aGlzLmZvcm1hdFJlcXVlc3RWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3RMb2NhbDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuZm9ybWF0UmVxdWVzdFZhbHVlKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBoYXNDaGFuZ2VzIChcblx0XHRpbml0aWFsOiBGaWVsZE1hcCxcblx0XHRtb2RpZmllZDogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0XHRpbmNsdWRlUmVhZE9ubHlDb2x1bW5zOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblxuXHRcdFx0Ly8gUGFyZW50IGNvbHVtbnMgYXJlbid0IHdyaXRhYmxlIGN1cnJlbnRseSBiZWNhdXNlIHdlIHVzZSBMaW5rVG8gcmVxdWVzdHNcblx0XHRcdC8vIGJ1dCBpbiB0aGUgY29yZSB0aGV5J3JlIGFscmVhZHkgdHJlYXRlZCBhcyBub3JtYWwgZmllbGRzXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFwaUNvbHVtbi50eXBlICE9PSAnbGluaydcblx0XHRcdFx0JiYgYXBpQ29sdW1uLnR5cGUgIT09ICdwYXJlbnR0eXBlJ1xuXHRcdFx0XHQmJiBhcGlDb2x1bW4udHlwZSAhPT0gJ3BhcmVudGlkJ1xuXHRcdFx0XHQmJiAoIWluY2x1ZGVSZWFkT25seUNvbHVtbnMgJiYgYXBpQ29sdW1uLnJlYWRPbmx5KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRcdG1vZGlmaWVkLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBtb21lbnQgZ2V0dGVyIGhhc24ndCBiZWVuIHRyaWdnZXJlZCBvciBvdmVyd3JpdHRlbiB5ZXQsIHdlIGNhbiBhc3N1bWUgdGhlcmUgYXJlIG5vIGNoYW5nZXNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGRlc2MgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MudmFsdWUgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IG9iamVjdFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdGlmIChhcGlDb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0aW5pdGlhbFtjb2x1bW5JZF0sXG5cdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0b2xkVmFsdWU6IGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdFx0bmV3VmFsdWU6IG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0XHRcdGNvbHVtbjogY29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHNvdXJjZTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5QYXRoKVxuXHRcdFx0XHR8fCAoXG5cdFx0XHRcdFx0Ly8gcHJldmVudCB0cmlnZ2VyaW5nIGdldHRlciBmb3IgZXhwZW5zaXZlIGZvcm1hdHNcblx0XHRcdFx0XHQhdGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpXG5cdFx0XHRcdFx0JiYgc291cmNlW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWRcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5QYXRoXSA9IHRoaXMuY2xvbmUoXG5cdFx0XHRcdGNvbHVtbi5hcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0c291cmNlW2NvbHVtblBhdGhdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2hhbGxvd0NvcHlGaWVsZHMgKFxuXHRcdHNoYWxsb3dTb3VyY2U6IEZpZWxkTWFwLFxuXHRcdGRlZXBTb3VyY2U6IEZpZWxkTWFwLFxuXHRcdGRlc3RpbmF0aW9uOiBGaWVsZE1hcCxcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcCB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbi5wYXRoO1xuXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5QYXRoXSA9IHNoYWxsb3dTb3VyY2VbY29sdW1uUGF0aF0gIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHNoYWxsb3dTb3VyY2VbY29sdW1uUGF0aF0gOlxuXHRcdFx0XHR0aGlzLmNsb25lKFxuXHRcdFx0XHRcdGNvbHVtbi5hcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkZWVwU291cmNlW2NvbHVtblBhdGhdLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZXN0aW5hdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBzZXREZWZhdWx0VmFsdWVzIChcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXAge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbi5pZF0gPSB0aGlzLmdldERlZmF1bHRWYWx1ZShjb2x1bW4uYXBpQ29sdW1uLnR5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZXN0aW5hdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ29tcGFyZXMgdGhlIGdpdmVuIGZpZWxkcywgcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZmllbGRzIGFyZSBlcXVhbFxuXHQgKi9cblx0cHVibGljIGNvbXBhcmVGaWVsZHMgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHRmaXJzdD86IGFueSxcblx0XHRzZWNvbmQ/OiBhbnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gc2Vjb25kID09PSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHNlY29uZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlTW9tZW50T2JqZWN0cyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbXBhcmVEdXJhdGlvbnMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnaWQnOiAvLyBpZCB0eXBlc1xuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRyZXR1cm4gZmlyc3QgPT0gc2Vjb25kOyAvLyB1c2Ugbm9uLXN0cmljdCBjb21wYXJpc29uXG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdkaXN0YW5jZSc6XG5cdFx0XHRjYXNlICdkb3VibGUnOiAvLyBmbG9hdGluZyBwb2ludCB0eXBlc1xuXHRcdFx0Y2FzZSAnZmlsZXNpemUnOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ3Bvd2VyJzpcblx0XHRcdGNhc2UgJ3F1YW50aXR5Jzpcblx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAnY29vcmRpbmF0ZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZUZsb2F0cyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdpbnQnOiAvLyBpbnRlZ2VyIHR5cGVzXG5cdFx0XHRjYXNlICdib29sJzogLy8gYm9vbGVhbiB0eXBlc1xuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRjYXNlICdlbWFpbCc6IC8vIHN0cmluZyB0eXBlc1xuXHRcdFx0Y2FzZSAncGhvbmUnOlxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0XHRyZXR1cm4gZmlyc3QgPT09IHNlY29uZDtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBlcXVhbHMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlRmxvYXRzIChcblx0XHRhOiBudW1iZXIsXG5cdFx0YjogbnVtYmVyLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBhYnNBID0gTWF0aC5hYnMoYSk7XG5cdFx0Y29uc3QgYWJzQiA9IE1hdGguYWJzKGIpO1xuXHRcdGNvbnN0IGRpZmYgPSBNYXRoLmFicyhhIC0gYik7XG5cblx0XHRjb25zdCBFUFNJTE9OID0gMS4xOWUtMDc7XG5cblx0XHQvLyBzaG9ydGN1dCwgaGFuZGxlcyBpbmZpbml0aWVzXG5cdFx0aWYgKGEgPT09IGIpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoYSA9PT0gMCB8fCBiID09PSAwIHx8IGRpZmYgPCBOdW1iZXIuTUlOX1ZBTFVFKSB7XG5cdFx0XHQvLyBhIG9yIGIgaXMgemVybyBvciBib3RoIGFyZSBleHRyZW1lbHkgY2xvc2UgdG8gaXRcblx0XHRcdC8vIHJlbGF0aXZlIGVycm9yIGlzIGxlc3MgbWVhbmluZ2Z1bCBoZXJlXG5cdFx0XHRyZXR1cm4gZGlmZiA8IChFUFNJTE9OICogTnVtYmVyLk1JTl9WQUxVRSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHVzZSByZWxhdGl2ZSBlcnJvclxuXHRcdFx0cmV0dXJuIGRpZmYgLyBNYXRoLm1pbihcblx0XHRcdFx0KGFic0EgKyBhYnNCKSxcblx0XHRcdFx0TnVtYmVyLk1BWF9WQUxVRSxcblx0XHRcdCkgPCBFUFNJTE9OO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlTW9tZW50T2JqZWN0cyAoXG5cdFx0Zmlyc3Q6IG1vbWVudC5Nb21lbnQsXG5cdFx0c2Vjb25kOiBtb21lbnQuTW9tZW50LFxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAoIWZpcnN0LmlzVmFsaWQoKSkge1xuXHRcdFx0cmV0dXJuICFzZWNvbmQuaXNWYWxpZCgpO1xuXHRcdH1cblxuXHRcdGlmICghc2Vjb25kLmlzVmFsaWQoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gLy8gZmlyc3QgSVMgdmFsaWRcblxuXHRcdHJldHVybiBmaXJzdC5pc1NhbWUoc2Vjb25kKTtcblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlRHVyYXRpb25zIChcblx0XHRmaXJzdDogbW9tZW50LkR1cmF0aW9uLFxuXHRcdHNlY29uZDogbW9tZW50LkR1cmF0aW9uLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmlyc3QuYXNNaWxsaXNlY29uZHMoKSA9PT0gc2Vjb25kLmFzTWlsbGlzZWNvbmRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlRGF0ZSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlQ29sb3IodmFsdWUpO1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXNwb25zZUR1cmF0aW9uKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlO1xuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSAwID8gbnVsbCA6IHZhbHVlO1xuXHRcdFx0Y2FzZSAnZmlsZXNpemUnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgLyAxMDAwMDAwO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0VmFsdWUgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHQpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdERhdGVUaW1lKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXF1ZXN0RGF0ZSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3RDb2xvcih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3REdXJhdGlvbih2YWx1ZSk7XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IDAgPyBudWxsIDogdmFsdWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlc3BvbnNlRGF0ZSAodmFsdWU6IG51bGwgfCBhbnkpOiBtb21lbnQuTW9tZW50IHtcblx0XHRyZXR1cm4gdmFsdWUgPT09IG51bGwgPyBtb21lbnQuaW52YWxpZCgpIDogbW9tZW50KHZhbHVlKTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZUR1cmF0aW9uICh2YWx1ZTogbnVsbCB8IG51bWJlcik6IG1vbWVudC5EdXJhdGlvbiB7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihcblx0XHRcdHZhbHVlID09PSBudWxsID8gMCA6IHZhbHVlLFxuXHRcdFx0J3NlY29uZHMnLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VDb2xvciAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHZhbHVlLmNoYXJBdCgwKSA9PT0gJyMnID8gdmFsdWUgOiAnIycgKyB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RGF0ZVRpbWUgKHZhbHVlOiBtb21lbnQuTW9tZW50KTogc3RyaW5nIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlLmZvcm1hdCh0aGlzLlNFUlZFUl9EQVRFVElNRV9GT1JNQVQpIDogbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RGF0ZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdmFsdWUuaXNWYWxpZCgpID8gdmFsdWUuZm9ybWF0KHRoaXMuU0VSVkVSX0RBVEVfRk9STUFUKSA6IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdER1cmF0aW9uICh2YWx1ZTogbW9tZW50LkR1cmF0aW9uKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdmFsdWUuYXNTZWNvbmRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdENvbG9yICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdmFsdWUuY2hhckF0KDApID09PSAnIycgPyB2YWx1ZS5zdWJzdHJpbmcoMSkgOiB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXREZWZhdWx0VmFsdWUgKGNvbHVtblR5cGU6IHN0cmluZyk6IGFueSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdpbnQnOlxuXHRcdFx0Y2FzZSAnZG91YmxlJzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdGNhc2UgJ2l0ZW0nOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRjYXNlICdjaGlsZCc6XG5cdFx0XHRjYXNlICdzaWJsaW5nJzpcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRcdHJldHVybiAnMCc7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0XHRyZXR1cm4gbW9tZW50LmludmFsaWQoKTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbigpO1xuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdFx0cmV0dXJuICcjMDAwMDAwJztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdC8vIFx0XHRcdFx0XHRlbWFpbFxuXHRcdFx0Ly8gXHRcdFx0XHRcdHVybFxuXHRcdFx0Ly8gXHRcdFx0XHRcdGh0bWxcblx0XHRcdC8vIFx0XHRcdFx0XHRqc29uXG5cdFx0XHQvLyBcdFx0XHRcdFx0ZGF0YVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0dmFsdWUsXG5cdFx0XHR0aGlzLmdldERlZmF1bHRWYWx1ZShjb2x1bW5UeXBlKSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsb25lIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KTogYW55IHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xvbmVEdXJhdGlvbih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIG1vbWVudCh2YWx1ZSk7XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdFx0cmV0dXJuIGNvcHkodmFsdWUpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBnZXRDbG9uZUZ1bmN0aW9uIChjb2x1bW5UeXBlOiBzdHJpbmcpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xvbmVEdXJhdGlvbjtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jbG9uZURhdGU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVEdXJhdGlvbiAoZHVyYXRpb246IG1vbWVudC5EdXJhdGlvbikge1xuXHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24oZHVyYXRpb24pO1xuXHR9XG5cblx0cHVibGljIGNsb25lRGF0ZSAoZGF0ZTogbW9tZW50Lk1vbWVudCk6IG1vbWVudC5Nb21lbnQge1xuXHRcdHJldHVybiBkYXRlLmNsb25lKCk7XG5cdH1cblxuXHRwdWJsaWMgaWRlbnRpdHk8VD4gKGlucHV0OiBUKTogVCB7XG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXF1ZXN0SXRlbU1hcCwgQXBpUmVxdWVzdExpbWl0LCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEFwaVJlcXVlc3RTZXJ2aWNlIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeVxuXHQpIHtcblxuXHR9XG5cblx0dGVtcGxhdGUgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgcGFyYW1zOiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS50ZW1wbGF0ZShpdGVtVHlwZSwgcGFyYW1zKSk7XG5cdH1cblxuXHRjcmVhdGUgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgaXRlbUlkOiBJdGVtSWQsIHZhbHVlczogYW55LCBwYXJlbnRUeXBlPzogSXRlbVR5cGUsIHBhcmVudElkPzogSXRlbUlkKTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuY3JlYXRlKGl0ZW1UeXBlLCBpdGVtSWQsIHZhbHVlcywgcGFyZW50VHlwZSwgcGFyZW50SWQpKTtcblx0fVxuXG5cdGRlbGV0ZSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBpdGVtSWRzOiBJdGVtSWRbXSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLmRlbGV0ZShpdGVtVHlwZSwgaXRlbUlkcykpO1xuXHR9XG5cblx0dXBkYXRlSXRlbXMgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgaXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwLCBjb2x1bW5zOiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS51cGRhdGVJdGVtcyhpdGVtVHlwZSwgaXRlbXMsIGNvbHVtbnMpKTtcblx0fVxuXG5cdHJlcXVlc3RTa2VsZXRvbiAocGFyYW1zOiBhbnksIHJlcXVlc3RDYW5jZWxlcj86IFByb21pc2VJbnRlcmZhY2U8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihwYXJhbXMsIHJlcXVlc3RDYW5jZWxlcikpO1xuXHR9XG5cblx0bW92ZUl0ZW1zIChwYXJlbnRUeXBlOiBJdGVtVHlwZSwgcGFyZW50SWQ6IEl0ZW1JZCwgaXRlbXM6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdfSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLm1vdmVJdGVtcyhwYXJlbnRUeXBlLCBwYXJlbnRJZCwgaXRlbXMpKTtcblx0fVxuXG5cdGNvbHVtbnMgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgY29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCwgcGFyYW1zPzogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuY29sdW1ucyhpdGVtVHlwZSwgY29sdW1ucywgcGFyYW1zKSk7XG5cdH1cblxuXHRxdWVyeSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBxdWVyeTogYW55LCBjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBsaW1pdD86IEFwaVJlcXVlc3RMaW1pdCk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnF1ZXJ5KGl0ZW1UeXBlLCBxdWVyeSwgY29sdW1ucywgbGltaXQpKTtcblx0fVxuXG5cdHByb2Nlc3NSZXNwb25zZSAocmVxdWVzdDogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiByZXF1ZXN0LnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHRoaXMuYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5LmNvbnN0cnVjdChyZXNwb25zZSkpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlLCBJdGVtVHlwZU1hcCwgUmVzcG9uc2VDb2x1bW4gfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vIHRvZG9bY2FjaGVdIGV4dGVuZCBiYXNlIGNsYXNzIHBlciByZXF1ZXN0IChkZWxldGUgaGFzIGRpZmZlcmVudCBzdHJ1Y3R1cmUpXG5leHBvcnQgY2xhc3MgQXBpUmVzcG9uc2VQcm9jZXNzb3Ige1xuXG5cdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGU7XG5cblx0Y29sdW1uczogSXRlbVR5cGVNYXA8UmVzcG9uc2VDb2x1bW5bXT47XG5cdGxpbmtzOiBJdGVtVHlwZU1hcDxJdGVtSWRbXT47XG5cdGNhY2hlYWJsZTogYm9vbGVhbjtcblx0bWFwOiBhbnk7XG5cblx0aXRlbXM6IGFueTtcblxuXHRjb2x1bW5JbmRleE1hcDoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0W2NvbHVtbklkOiBzdHJpbmddOiBudW1iZXJcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRjb2x1bW5NYXA6IGFueSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIHJlc3BvbnNlOiBhbnksXG5cdCkge1xuXHRcdHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnM7XG5cdFx0dGhpcy5pdGVtcyA9IHJlc3BvbnNlLml0ZW1zO1xuXHRcdHRoaXMubGlua3MgPSByZXNwb25zZS5saW5rcztcblx0XHR0aGlzLmNhY2hlYWJsZSA9IHJlc3BvbnNlLmNhY2hlYWJsZTtcblx0XHR0aGlzLm1hcCA9IHJlc3BvbnNlLm1hcDtcblx0XHR0aGlzLml0ZW1UeXBlID0gcmVzcG9uc2UuaXRlbVR5cGU7XG5cblx0XHR0aGlzLmNyZWF0ZUNvbHVtbk1hcHMoKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbHVtbk9iamVjdCAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUmVzcG9uc2VDb2x1bW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV07XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hWYWx1ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdCkge1xuXHRcdGlmICh0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdW2NvbHVtbklkXTtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY29sdW1uSW5kZXhNYXBbaXRlbVR5cGVdW2NvbHVtbklkXTtcblxuXHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHR0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdLmRhdGFbaW5kZXhdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2x1bW5BcnJheSAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUmVzcG9uc2VDb2x1bW5bXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGFwaUNvbHVtbiBvZiB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdKSB7XG5cdFx0XHRyZXN1bHQucHVzaChhcGlDb2x1bW4pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hEZXJpdmVkT2JqZWN0IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0cm9vdENvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2Ygcm9vdENvbHVtbnMpIHtcblx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHR0aGlzLmZldGNoVmFsdWUoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdFx0KSxcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hEZXJpdmVkVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IGFueSxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdGxldCBjaGlsZFZhbHVlO1xuXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0Y2hpbGRWYWx1ZSA9IG51bGw7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NoaWxkQ29sdW1uLnBhdGhdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZ2V0RGVmYXVsdFZhbHVlKGNoaWxkQ29sdW1uLmFwaUNvbHVtbi50eXBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNoaWxkVmFsdWUgPSB0aGlzLmZldGNoVmFsdWUoXG5cdFx0XHRcdFx0Y29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdGNoaWxkQ29sdW1uLmlkLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjaGlsZENvbHVtbi5wYXRoXSA9IGNoaWxkVmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGlsZENvbHVtbi5pc0xlYWYpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHRjaGlsZFZhbHVlLFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmZXRjaE9iamVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBzdHJpbmcgfCBJdGVtSWQsXG5cdFx0aW5jbHVkZUxpbmtzOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4gfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLml0ZW1zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0aWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBkYXRhID0gdGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXS5kYXRhO1xuXHRcdGNvbnN0IHJlc3VsdDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdW2ldO1xuXG5cdFx0XHRpZiAodGhpcy5hcGlGb3JtYXR0ZXIuaXNFeHBlbnNpdmVGb3JtYXQoY29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdHRoaXMuYWRkTGF6eUZvcm1hdHRpbmdGdW5jdGlvbjxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkYXRhW2ldLFxuXHRcdFx0XHRcdHJlc3VsdCxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW4uaWRdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVzcG9uc2VWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkYXRhW2ldLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbmNsdWRlTGlua3MpIHtcblx0XHRcdGNvbnN0IGxpbmtzID0gdGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXS5saW5rcztcblx0XHRcdHJlc3VsdC5fX2xpbmtzID0ge307XG5cblx0XHRcdGZvciAoY29uc3QgbGlua1R5cGUgaW4gbGlua3MpIHtcblx0XHRcdFx0cmVzdWx0Ll9fbGlua3NbbGlua1R5cGVdID1cblx0XHRcdFx0XHR0aGlzLmZldGNoT2JqZWN0QXJyYXkoXG5cdFx0XHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdFx0XHRcdGxpbmtzW2xpbmtUeXBlXSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hPYmplY3RBcnJheTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aW5jbHVkZUxpbmtzPzogYm9vbGVhbixcblx0XHRpZEFycmF5PzogSXRlbUlkW10gfCBudWxsLFxuXHQpOiBBcnJheTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG5cdFx0aWYgKGlkQXJyYXkgPT09IG51bGwpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIHRoaXMuaXRlbXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdFx0KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0aWYgKGlkQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWRBcnJheSA9IHRoaXMubGlua3NbaXRlbVR5cGVdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGlkQXJyYXkpIHtcblx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2x1bW5zT2JqZWN0ICgpOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtbn0ge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbk1hcDtcblx0fVxuXG5cdHByaXZhdGUgYWRkTGF6eUZvcm1hdHRpbmdGdW5jdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdGluaXRpYWxWYWx1ZTogYW55LFxuXHRcdGRlc3RpbmF0aW9uOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdGNvbHVtbklkLFxuXHRcdFx0e1xuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdHNldDpcblx0XHRcdFx0XHR2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHRkZWxldGUgZGVzdGluYXRpb25bY29sdW1uSWRdO1xuXG5cdFx0XHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JZF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgZGVzdGluYXRpb25bY29sdW1uSWRdO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRcdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0XHRcdFx0aW5pdGlhbFZhbHVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbHVtbk1hcHMgKCkge1xuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5jb2x1bW5zKSB7XG5cdFx0XHR0aGlzLmNvbHVtbkluZGV4TWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0dGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdID0ge307XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdW2ldO1xuXG5cdFx0XHRcdHRoaXMuY29sdW1uSW5kZXhNYXBbaXRlbVR5cGVdW2NvbHVtbi5pZF0gPSBpO1xuXHRcdFx0XHR0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV1bY29sdW1uLmlkXSA9IGNvbHVtbjtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudCwgSXRlbUVudHJ5TWFwLCBJdGVtTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDcmVhdGVEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5pbXBvcnQgeyBjcmVhdGVQYXRoIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgQ3JlYXRlQ29tcGlsYXRpb24gPSB7XG5cdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0W3BhcmVudElkOiBudW1iZXJdOiBJdGVtTWFwPEludGVybmFsQ3JlYXRlRGVsdGE+XG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIERlbGV0ZUNvbXBpbGF0aW9uID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZT4+XG59O1xuXG5leHBvcnQgdHlwZSBVcGRhdGVDb21waWxhdGlvbiA9IEl0ZW1FbnRyeU1hcDxJdGVtVHlwZT47XG5cbmV4cG9ydCB0eXBlIE1vdmVDb21waWxhdGlvbiA9IHtcblx0W3BhcmVudFR5cGU6IHN0cmluZ106IHtcblx0XHRbcGFyZW50SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVtdXG5cdH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzQ29tcGlsYXRpb24ge1xuXG5cdGNvbXBpbGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBDcmVhdGVDb21waWxhdGlvbixcblx0XHRkZWxldGU6IERlbGV0ZUNvbXBpbGF0aW9uLFxuXHRcdHVwZGF0ZTogVXBkYXRlQ29tcGlsYXRpb24sXG5cdFx0bW92ZTogTW92ZUNvbXBpbGF0aW9uXG5cdH0gPSB7XG5cdFx0Y3JlYXRlOiB7fSxcblx0XHRkZWxldGU6IHt9LFxuXHRcdHVwZGF0ZToge30sXG5cdFx0bW92ZToge30sXG5cdH07XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHRoaXMucHJvY2Vzc0RlbHRhKCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NEZWx0YSAoKTogdm9pZCB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5nZXREZWx0YSgpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0Y29uc3QgZW50cmllc1RvQmVEZWxldGVkID0gY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBlbnRyaWVzVG9CZURlbGV0ZWQpIHtcblx0XHRcdFx0aWYgKGl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYWRkRGVsZXRlRW50cnkoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLmNyZWF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLmFkZENyZWF0ZUVudHJ5KHR1cGxlKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRVcGRhdGVFbnRyeSh0dXBsZS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLm1vdmVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRNb3ZlRW50cnkoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS50byxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXREZWZhdWx0UGFyZW50ICgpOiBFbnRyeVBhcmVudCB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGl0ZW1UeXBlOiAnVm9pZCcsXG5cdFx0XHRpdGVtSWQ6IDAsXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgYWRkTW92ZUVudHJ5IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoPEl0ZW1FbnRyeVtdPihcblx0XHRcdHRoaXMuY29tcGlsYXRpb24ubW92ZSxcblx0XHRcdFtcblx0XHRcdFx0bmV3UGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRuZXdQYXJlbnQuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdFtdLFxuXHRcdFx0XSxcblx0XHQpXG5cdFx0XHQucHVzaChpdGVtRW50cnkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGREZWxldGVFbnRyeSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoPEl0ZW1FbnRyeVtdPihcblx0XHRcdHRoaXMuY29tcGlsYXRpb24uZGVsZXRlLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHRbXSxcblx0XHRcdF0sXG5cdFx0KVxuXHRcdFx0LnB1c2goXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFkZFVwZGF0ZUVudHJ5IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZT4pOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi51cGRhdGUsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRdLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFkZENyZWF0ZUVudHJ5IChjcmVhdGVEZWx0YTogSW50ZXJuYWxDcmVhdGVEZWx0YSk6IHZvaWQge1xuXHRcdGxldCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChjcmVhdGVEZWx0YS5lbnRyeSk7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRwYXJlbnQgPSB0aGlzLmdldERlZmF1bHRQYXJlbnQoKTtcblx0XHR9XG5cblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi5jcmVhdGUsXG5cdFx0XHRbXG5cdFx0XHRcdHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0cGFyZW50Lml0ZW1JZCxcblx0XHRcdFx0Y3JlYXRlRGVsdGEuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGNyZWF0ZURlbHRhLmVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGNyZWF0ZURlbHRhLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7XG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDaGFuZ2VzQ29tcGlsYXRpb24sXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbHVtbkluZm8sXG5cdERlbGV0ZUNvbXBpbGF0aW9uLFxuXHRoYXNQcm9wZXJ0aWVzLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRNb3ZlQ29tcGlsYXRpb24sXG5cdFNlcnZlckNhY2hlLFxuXHRVcGRhdGVDb21waWxhdGlvbixcbn0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQge1xuXHRDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RNb3ZlSXRlbXMsXG5cdEFwaVJlc3BvbnNlLFxuXHRDcmVhdGVSZXF1ZXN0RW50cnksXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgZ2V0UGF0aCwgaW5BcnJheSB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayA9IChjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwKSA9PiB2b2lkO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgdGhlIGNoYW5nZXMgZnJvbSBhIHNwZWNpZmljIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufSBhbmQgcmV0dXJucyBhIHtAbGluayBDaGFuZ2VzRGVsdGEgQ2hhbmdlc0RlbHRhfVxuICovXG5leHBvcnQgY2xhc3MgQ2hhbmdlc1Byb2Nlc3NvciB7XG5cblx0cHJpdmF0ZSBpdGVtSWRDb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge307XG5cdHByaXZhdGUgc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbi5nZXRTZXJ2ZXJDYWNoZSgpO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRwcml2YXRlIGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0cHJpdmF0ZSBvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCkge1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFeGVjdXRlcyB0aGUgcmVxdWVzdHMgaW4gdGhlIG9yZGVyIG9mOlxuXHQgKiAxLiBjcmVhdGVcblx0ICogMi4gbW92ZVxuXHQgKiAzLiBkZWxldGVcblx0ICogNC4gdXBkYXRlXG5cdCAqL1xuXHRwdWJsaWMgZXhlY3V0ZSAoKTogUHJvbWlzZUludGVyZmFjZTxJdGVtSWRDb252ZXJzaW9uTWFwPiB7XG5cdFx0Y29uc3QgY2hhbmdlc0NvbXBpbGF0aW9uID0gdGhpcy5jaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbXBpbGF0aW9uID0gY2hhbmdlc0NvbXBpbGF0aW9uLmNvbXBpbGF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5leGVjdXRlQ3JlYXRlUmVxdWVzdHMoY2hhbmdlc0NvbXBpbGF0aW9uKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZU1vdmVSZXF1ZXN0cyhjb21waWxhdGlvbi5tb3ZlKSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZVVwZGF0ZVJlcXVlc3RzKGNvbXBpbGF0aW9uLnVwZGF0ZSksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLmV4ZWN1dGVEZWxldGVSZXF1ZXN0cyhjb21waWxhdGlvbi5kZWxldGUpLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZE1vdmVSZXF1ZXN0IChjb21waWxhdGlvbkVudHJpZXM6IEl0ZW1FbnRyeVtdKTogQXBpUmVxdWVzdE1vdmVJdGVtcyB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0TW92ZUl0ZW1zID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBjb21waWxhdGlvbkVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0XHRpZiAocmVzdWx0W2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdFtpdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGdldE1hcFZhbHVlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0bWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0gdGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBJdGVtSWQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChtYXAgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAobWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVDcmVhdGVSZXF1ZXN0cyAoXG5cdFx0Y2hhbmdlc0NvbXBpbGF0aW9uOiBDaGFuZ2VzQ29tcGlsYXRpb24sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8YW55W10+IHtcblx0XHRjb25zdCByZXF1ZXN0cyA9IHRoaXMuY3JlYXRlUmVxdWVzdEZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdGNoYW5nZXNDb21waWxhdGlvbi5jb21waWxhdGlvbi5jcmVhdGUsXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0XHRcdHRoaXMuYnJlYWtVcEJ5UGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnJ1bigpO1xuXG5cdFx0Y29uc3QgcmVzcG9uc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcblx0XHRcdHJlc3BvbnNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzXG5cdFx0XHRcdFx0LmV4ZWN1dGVDcmVhdGVSZXF1ZXN0KHJlcXVlc3QpXG5cdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRyZXN1bHQgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5vbkFmdGVyQ3JlYXRlQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMub25BZnRlckNyZWF0ZUNhbGxiYWNrKHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVzcG9uc2VzKTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIHRlc3QgY3JlYXRlIHJlcXVlc3RzXG5cdHByaXZhdGUgZXhlY3V0ZUNyZWF0ZVJlcXVlc3QgKFxuXHRcdHJlcXVlc3RSZXNvdXJjZTogQ3JlYXRlUmVxdWVzdEVudHJ5PGFueT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VNYXAgPSByZXNwb25zZS5tYXA7XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gcmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCk7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXMgPSByZXF1ZXN0UmVzb3VyY2UuaXRlbXM7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLnJlcXVlc3QuY29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1FbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cmllc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3SXRlbUlkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRwYXJzZUludChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0XHRcdDEwLFxuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VNYXAsXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG5ld0l0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdFx0J0NyZWF0ZSBmYWlsZWQhJyxcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB3ZSdyZSBzdXJlIHRoZSBlbnRyeSBleGlzdHMsIGJlY2F1c2Ugb3RoZXJ3aXNlIHlvdSBjb3VsZG4ndCBzYXZlIGl0IGluIHRoZSBmaXJzdCBwbGFjZVxuXHRcdFx0XHRcdFx0XHRjb25zdCBsb2NhbEl0ZW1FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdFx0XHRsb2NhbEl0ZW1FbnRyeS5pdGVtSWQgPSBuZXdJdGVtSWQ7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tsb2NhbEl0ZW1FbnRyeS5pZF0gPSB0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmNvcHlUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tsb2NhbEl0ZW1FbnRyeS5pZF0sXG5cdFx0XHRcdFx0XHRcdFx0bG9jYWxJdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmFkZChsb2NhbEl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyQnlJdGVtSWQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZCksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbUVudHJ5Lml0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtRW50cnkuaXRlbVR5cGVdW25ld0l0ZW1JZF0gPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZpZWxkQ2hhbmdlQ2FsbGJhY2tzW2l0ZW1FbnRyeS5pdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtRW50cnkuaXRlbVR5cGVdW2l0ZW1JZF07XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdE51bWJlcihuZXdJdGVtSWQpLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBleHRlbmQgY29udmVyc2lvbiBtYXBcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHJlc3BvbnNlTWFwKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gcmVzcG9uc2VNYXBbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV1baXRlbUlkXSA9IHJlc3BvbnNlTWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLnRvQXJyYXkoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwYXJlbnQgPSBjb2xsZWN0aW9uRW50cnkucGFyZW50O1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Lml0ZW1JZCxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAobmV3UGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHBhcmVudC5pdGVtSWQgPSBuZXdQYXJlbnRJZDtcblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25DaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5nZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkub3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbGxlY3Rpb25DaGFuZ2VzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuc2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkNoYW5nZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCB1cGRhdGVkQ29sdW1uczoge1tjb2x1bW5JZDogc3RyaW5nXTogQ29sdW1uSW5mbzxhbnk+fSA9XG5cdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5nZXRVcGRhdGVkSXRlbUNvbHVtbnModGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwKTtcblxuXHRcdFx0XHRcdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHVwZGF0ZWRDb2x1bW5zKSkge1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHVwZGF0ZWRDb2x1bW5zLmlkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5vbkl0ZW1FbnRyaWVzQ3JlYXRlZChcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZVVwZGF0ZVJlcXVlc3RzIChcblx0XHRjb21waWxhdGlvbjogVXBkYXRlQ29tcGlsYXRpb24sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3RzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdHJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZVVwZGF0ZVJlcXVlc3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29tcGlsYXRpb25baXRlbVR5cGVdLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVxdWVzdHMpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlVXBkYXRlUmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IHtbaXRlbUlkOiBudW1iZXJdOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPn0sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3Q6IHtbaXRlbVR5cGU6IHN0cmluZ106IHtbaXRlbUlkOiBudW1iZXJdOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+fX0gPSB7fTtcblx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB2ZXJpZnkgaWYgd2Ugc2hvdWxkIGNhbGwgZ2V0Q29sbGVjdGlvbk1hdGNoZXIgb24gU2VydmVyQ2FjaGUgb3IgVHJhbnNhY3Rpb25DYWNoZVxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5nZXRDb2xsZWN0aW9uTWF0Y2hlcigpO1xuXG5cdFx0cmVxdWVzdFtpdGVtVHlwZV0gPSB7fTtcblxuXHRcdC8vIHdlIG5lZWQgdG8gZG8gdGhlIGZvcm1hdFJlcXVlc3QgY2FsbCBoZXJlIChmaWVsZHMgbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQpXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyaWVzW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBpdGVtUmVxdWVzdDogYW55ID0gcmVxdWVzdFtpdGVtVHlwZV1baXRlbUlkXSA9IHt9O1xuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhdGgoXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24udGFiUmVxdWVzdFBhcmFtZXRlcnMsXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdF0sXG5cdFx0XHQpO1xuXG5cdFx0XHRpdGVtUmVxdWVzdC52YWx1ZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZvcm1hdFJlcXVlc3QoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpdGVtUmVxdWVzdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdENvbHVtbnMuZXhwYW5kKGl0ZW1FbnRyeS5jb2x1bW5zKTtcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gdGVzdFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXIuZXhwYW5kKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMgPSBjb2xsZWN0aW9uTWF0Y2hlci5nZXRDb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbiBvZiBjb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5zLmV4cGFuZChjb2xsZWN0aW9uLmNvbHVtbnMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFwaVJlcXVlc3RDb2x1bW5zID0gcmVxdWVzdENvbHVtbnMuZ2V0KCk7XG5cblx0XHRyZXR1cm4gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnVwZGF0ZUl0ZW1zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdCxcblx0XHRcdFx0YXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4gdGhpcy5zZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0YXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0KSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZURlbGV0ZVJlcXVlc3RzIChcblx0XHRjb21waWxhdGlvbjogRGVsZXRlQ29tcGlsYXRpb24sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3RzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPHZvaWQ+PiA9IFtdO1xuXG5cdFx0Ly8gY2xlYXJpbmcgbm90IG5lY2Vzc2FyeVxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdHJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZURlbGV0ZVJlcXVlc3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29tcGlsYXRpb25baXRlbVR5cGVdLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVxdWVzdHMpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlRGVsZXRlUmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cmllcy5tYXAoXG5cdFx0XHRcdFx0ZW50cnkgPT4gZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VJZEFycmF5ID0gcmVzcG9uc2UuaXRlbXM7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXNUb0JlRGVsZXRlZDogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdCFpbkFycmF5KFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VJZEFycmF5LFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdCdEZWxldGUgZmFpbGVkIScsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpdGVtRW50cmllc1RvQmVEZWxldGVkLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbXNEZWxldGVkKGl0ZW1FbnRyaWVzVG9CZURlbGV0ZWQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZU1vdmVSZXF1ZXN0cyAoXG5cdFx0Y29tcGlsYXRpb246IE1vdmVDb21waWxhdGlvbixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdHM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8dm9pZD4+ID0gW107XG5cblx0XHRjb25zdCBleGVjdXRlTW92ZVJlcXVlc3QgPSAoXG5cdFx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0KSA9PiB7XG5cdFx0XHQvLyBvbmx5IHRoZSBwYXJlbnQgaWQgY291bGQgaGF2ZSBiZWVuIHVwZGF0ZWRcblx0XHRcdGNvbnN0IGNvbXBpbGF0aW9uRW50cmllcyA9IGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdW3BhcmVudElkXTtcblx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXF1ZXN0cy5wdXNoKFxuXHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHRcdFx0Lm1vdmVJdGVtcyhcblx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRuZXdQYXJlbnRJZCAhPT0gdW5kZWZpbmVkID8gbmV3UGFyZW50SWQgOiBwYXJlbnRJZCxcblx0XHRcdFx0XHRcdHRoaXMuYnVpbGRNb3ZlUmVxdWVzdChjb21waWxhdGlvbkVudHJpZXMpLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdFx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSB3aHkgZG9uJ3Qgd2UgdXNlIHRoZSByZXNwb25zZSA/XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNvbXBpbGF0aW9uRW50cmllcykge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZTogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtSWQ6IG5ld1BhcmVudElkICE9PSB1bmRlZmluZWQgPyBuZXdQYXJlbnRJZCA6IHBhcmVudElkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRUeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdKSB7XG5cdFx0XHRcdGV4ZWN1dGVNb3ZlUmVxdWVzdChcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdCtwYXJlbnRJZCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVxdWVzdHMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtQ2FjaGVGYWN0b3J5LCBJdGVtRW50cnlGYWN0b3J5LCBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL0FwaUZvcm1hdHRlcic7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlLCBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9Db2x1bW5JbmZvJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSB9IGZyb20gJy4uL0NyZWF0ZWRDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUNhY2hlIH0gZnJvbSAnLi4vSXRlbUNhY2hlJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcyB9IGZyb20gJy4vc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyB9IGZyb20gJy4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25JdGVtSGFuZGxlcic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJdGVtSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyByZWFkb25seSBlbnRyaWVzOiBJdGVtQ2FjaGU7XG5cdHB1YmxpYyBhYnN0cmFjdCBpdGVtQ2hhbmdlczogU2VydmVySXRlbUVudHJ5Q2hhbmdlcyB8IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcztcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcm90ZWN0ZWQgaXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmVudHJpZXMgPSBpdGVtQ2FjaGVGYWN0b3J5LmNvbnN0cnVjdCh0aGlzLnRyYW5zYWN0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ29waWVzIHRoZSBwYXNzZWQgSXRlbUVudHJ5Q2hhbmdlcyBpbnRvIGEgZm9ybWF0IHRoZSBpbXBsZW1lbnRpbmcgSXRlbUhhbmRsZXIgY2FuIHB1dCBpbiBoaXMgSXRlbUNoYW5nZXNcblx0ICogQHBhcmFtIGl0ZW1FbnRyeUNoYW5nZXNcblx0ICogQHBhcmFtIGVudHJ5XG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdCk7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBJdGVtRW50cmllcyBmb3IgdGhlIGdpdmVuIHF1ZXJ5LCBkb2VzIG5vdCBsb29rIGluIHRoZSBjYWNoZSwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBJdGVtSWRzIGJlbG9uZyB0byB0aGUgcXVlcnkgIVxuXHQgKlxuXHQgKiB0b2RvOiBXZSBjb3VsZCBzdG9yZSBjb2xsZWN0aW9ucyBieSB0aGVpciBxdWVyeSBzdHJpbmcsIGFuZCB0aGVuIHNlZSBpZiB0aGUgcXVlcnkgaXMgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgSXRlbUVudHJpZXMgZm9yIHRoZSBnaXZlbiBJdGVtSWRzXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbiBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gaXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUHJvY2Vzc2VzIHRoZSBwYXNzZWQge0BsaW5rIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSB1cGRhdGUgZGVsdGF9IG9uIHRoZSB0cmFuc2FjdGlvbiwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlc1R1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEsXG5cdFx0Zm9yY2VPdmVyd3JpdGU6IGJvb2xlYW4sXG5cdFx0dXBkYXRlSW5pdGlhbDogYm9vbGVhbixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHRcdGNyZWF0ZUl0ZW1DaGFuZ2VzSWZOb25lRXhpc3Q6IGJvb2xlYW4sXG5cdCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBUcmF2ZXJzZXMgdGhlIGNvbHVtbiBwYXRoIGFuZCByZXR1cm5zIHRoZSBmaWVsZHMgb2YgdGhlIGRlcml2ZWQgaXRlbSwgcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGl0ZW0gaXNuJ3QgZm91bmRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgZGVyaXZlZCBpdGVtJ3MgdmFsdWVzIGFyZSBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZXMgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdLFxuXHQpOiBSZWFkb25seTxGaWVsZE1hcD4gfCB1bmRlZmluZWQge1xuXHRcdGxldCBkZXJpdmVkSXRlbUVudHJ5OiBJdGVtRW50cnkgfCB1bmRlZmluZWQgPSBpdGVtRW50cnk7XG5cdFx0bGV0IGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBvZiBjb2x1bW5QYXRoKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSBkZXJpdmVkSXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbZGVyaXZlZEl0ZW1FbnRyeS5pdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJyR7Y29sdW1uSWR9JyBub3QgZm91bmQgb24gZW50cnkgaW4gSXRlbVJlc291cmNlLmdldERlcml2ZWRWYWx1ZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29sdW1uLml0ZW1UeXBlID09PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke2NvbHVtbklkfScgZG9lc24ndCBoYXZlIGNoaWxkcmVuIGluIEl0ZW1SZXNvdXJjZS5nZXREZXJpdmVkVmFsdWVgKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaXRlbUlkID0gZmllbGRzW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGl0ZW1JZCA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXJpdmVkSXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkKFxuXHRcdFx0XHRjb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChkZXJpdmVkSXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBEZXJpdmVkIGl0ZW1FbnRyeSAke2NvbHVtbi5pdGVtVHlwZX06JHtpdGVtSWR9IGNvdWxkbid0IGJlIGZvdW5kYCk7XG5cdFx0XHR9XG5cblx0XHRcdGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0ZGVyaXZlZEl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaWVsZHM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW5QYXRoLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcGF0aCBjb3VsZG4ndCBiZSB0cmF2ZXJzZWRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgcm9vdCBlbnRyeSB0byBzdGFydCB0aGUgcGF0aCBmcm9tXG5cdCAqIEBwYXJhbSBjb2x1bW5QYXRoIENhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgY29sdW1uSWRzIChbJ2NvbHVtbicsICdjb2x1bW4yJ10pIG9yIGEgY29uZmlnIGNvbHVtbiBzdHJpbmcgKCdjb2x1bW4+Y29sdW1uMicpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlPFQgZXh0ZW5kcyBhbnkgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRjb2x1bW5QYXRoOiBzdHJpbmdbXSB8IHN0cmluZyxcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHR5cGVvZiBjb2x1bW5QYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y29sdW1uUGF0aCA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZUNvbmZpZ0NvbHVtbihjb2x1bW5QYXRoKTtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZHMgPSB0aGlzLmdldERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLnNsaWNlKFxuXHRcdFx0XHQwLFxuXHRcdFx0XHQtMSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmllbGRzW2NvbHVtblBhdGhbY29sdW1uUGF0aC5sZW5ndGggLSAxXV07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENsZWFycyB0aGUgZW50cnkgZnJvbSB0aGlzIHRyYW5zYWN0aW9uLCByZW1vdmluZyBpdCBmcm9tIHRoZSB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX0gYW5kIHJlbW92aW5nIGFsbCBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtRW50cnkgKGVudHJ5OiBJdGVtRW50cnkpOiB2b2lkIHtcblx0XHR0aGlzLmVudHJpZXMuY2xlYXIoZW50cnkpO1xuXHRcdGRlbGV0ZSB0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVjdXJzaXZlbHkgZmV0Y2hlcyBkZXJpdmVkIHZhbHVlcyBhcyBzZXBhcmF0ZSByZXF1ZXN0cywgaW5zdGVhZCBvZiBhcyBjb2x1bW5zIG9mIGEgcHJpbWFyeSBpdGVtXG5cdCAqIENhbiBiZSB1c2VkIHdoZW4gZGVyaXZlZCB2YWx1ZXMgb2YgYSBsb2NhbCBpdGVtIGhhdmUgdG8gYmUgZmV0Y2hlZCwgc2luY2UgYSBsb2NhbCBpdGVtIGNhbid0IGJlIHVzZWQgYXMgcm9vdCBpdGVtIG9mIGEgcXVlcnlcblx0ICovXG5cdHB1YmxpYyBmZXRjaERlcml2ZWRWYWx1ZXNCeUNvbHVtbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cm9vdENvbHVtbjogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+LFxuXHRcdGNoYW5nZXNEZWx0YT86IENoYW5nZXNEZWx0YUJhc2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZCB8IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGNoaWxkQ29sdW1ucyA9IHJvb3RDb2x1bW4uY2hpbGRyZW47XG5cblx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpcnN0Q2hpbGQgPSBjaGlsZENvbHVtbnNbMF07XG5cblx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiBmaXJzdENoaWxkLmFwaUNvbHVtbi50eXBlID09PSAnaWQnKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFlvdSBzaG91bGQgdXNlIGZpZWxkc1tjb2x1bW5JZF0gaW5zdGVhZCBvZiBkZXJpdmVkWydjb2x1bW5JZD5pZCddIHRvIGdldCB0aGUgaWQgb2YgYSBkZXJpdmVkIGl0ZW1gKTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtSWRNYXA6IHtbaXRlbUlkOiBzdHJpbmddOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWRCeUNvbHVtbihcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRyb290Q29sdW1uLFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoaXRlbUlkID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbUlkTWFwW2l0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpdGVtSWRNYXBbaXRlbUlkXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRpdGVtSWRNYXBbaXRlbUlkXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKGl0ZW1JZE1hcCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtSWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbUlkTWFwKSB7XG5cdFx0XHRpdGVtSWRzLnB1c2goK2l0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY2hpbGRDb2x1bW5zKSB7XG5cdFx0XHRjb2x1bW5JZHMucHVzaChjb2x1bW4uaWQpO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIHdlIGhhdmUgdGhlc2UgdmFsdWVzIGNhY2hlZCBhbHJlYWR5XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoSXRlbUVudHJpZXMoXG5cdFx0XHRcdHJvb3RDb2x1bW4uaXRlbVR5cGUhLFxuXHRcdFx0XHRpdGVtSWRzLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyh7Y29sdW1uczogY29sdW1uSWRzfSksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0XHRjaGlsZENvbHVtbnMsXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlRGVyaXZlZFZhbHVlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pixcblx0XHRjaGFuZ2VzRGVsdGE/OiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLmZldGNoRGVyaXZlZFZhbHVlc0J5Q29sdW1uKFxuXHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdGNvbHVtbixcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiBpdGVtRW50cmllcyxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gZnJvbSB0aGUgcGFzc2VkIHtAbGluayBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhfSBhbmQgc3RvcmVzIGl0IGluIHRoaXMgdHJhbnNhY3Rpb24ncyB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX1cblx0ICovXG5cdHByb3RlY3RlZCBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtRW50cnlGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGNyZWF0ZVR1cGxlLml0ZW1JZCxcblx0XHRcdGNyZWF0ZVR1cGxlLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZW50cmllcy5hZGQoaXRlbUVudHJ5KTtcblxuXHRcdHJldHVybiBpdGVtRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4sIHdpbGwgbG9vayBpbnRvIHRoZSBjdXJyZW50IGRlbHRhIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXRlbUNoYW5nZXNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRJdGVtSWRCeUNvbHVtbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlc0RlbHRhPzogQ2hhbmdlc0RlbHRhQmFzZSxcblx0KTogSXRlbUlkIHtcblx0XHRpZiAoY29sdW1uLmxldmVsID09PSAwKSB7XG5cdFx0XHRpZiAoY2hhbmdlc0RlbHRhICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdLmNoYW5nZXMuZmllbGRzW2NvbHVtbi5wYXRoXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShpdGVtRW50cnkuaWQpW2NvbHVtbi5wYXRoXTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB2YWxpZGF0ZSBpZiB0aGlzIGFsc28gd29ya3MgZm9yIGRlZXBlciBsZXZlbHNcblx0XHQvLyBXZSBjb3VsZCBhbHNvIGNhbGwgZ2V0RGVyaXZlZFZhbHVlIGFuZCB1cGRhdGUgdGhhdCBmdW5jdGlvbiB0byBhY2NlcHQgYSBDaGFuZ2VzRGVsdGEgd2hpY2ggaGFzIHByZWNlZGVuY2Ugb3ZlciAnZmllbGRzJ1xuXG5cdFx0Y29uc3QgcGFyZW50SXRlbUlkID0gdGhpcy5nZXRJdGVtSWRCeUNvbHVtbihcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGNvbHVtbi5wYXJlbnQhLFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwYXJlbnRJdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQoXG5cdFx0XHRjb2x1bW4ucGFyZW50IS5pdGVtVHlwZSEsXG5cdFx0XHRwYXJlbnRJdGVtSWQsXG5cdFx0KSE7XG5cblx0XHRpZiAoY2hhbmdlc0RlbHRhICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbcGFyZW50SXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbcGFyZW50SXRlbUVudHJ5LmlkXS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkocGFyZW50SXRlbUVudHJ5LmlkKVtjb2x1bW4uaWRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIGV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1ucz86IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1ucyB7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkQ29sbGVjdGlvbkNvbHVtbnMgPSAodHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUpID0+IHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMucXVlcnlDb2x1bW5zLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGNhbiByZW1vdmUgdGhpcyB3aGVuIHdlIHJlZmFjdG9yIHRoZSBmZXRjaGluZyBvZiByZXF1aXJlZCBjb2xsZXRpb24gY29sdW1ucyBBRlRFUiB0aGUgbWF0Y2hpbmdcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgYWRkVHJhbnNhY3Rpb25DaGlsZHJlbkNvbGxlY3Rpb25Db2x1bW5zID0gKGNoaWxkcmVuOiBBYnN0cmFjdENhY2hlW10pID0+IHtcblx0XHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgY2hpbGRyZW4pIHtcblx0XHRcdFx0YWRkQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24pO1xuXHRcdFx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24uY2hpbGRyZW4pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCB0cmFuc2FjdGlvbkNoYWluID0gdGhpcy50cmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkNoYWluKCk7XG5cblx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIHRyYW5zYWN0aW9uQ2hhaW4pIHtcblx0XHRcdGFkZENvbGxlY3Rpb25Db2x1bW5zKHRyYW5zYWN0aW9uKTtcblx0XHR9XG5cblx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModGhpcy50cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXJEZXBlbmRlbmN5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2x1bW5FeHBhbnNpb25SZXN1bHQsXG5cdERlcmVnRnVuY3Rpb24sXG5cdEZpZWxkQ2hhbmdlQ2FsbGJhY2ssXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlLCBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEsIENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHtcblx0Q2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHRDb2x1bW5JbmZvLFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Y3JlYXRlUGF0aCxcblx0aGFzUHJvcGVydGllcyxcblx0U2VydmVyQ2FjaGUsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEl0ZW1IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0l0ZW1IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVmFsaWRhdG9yIH0gZnJvbSAnLi9UcmFuc2FjdGlvblZhbGlkYXRvcic7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbiBhIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9ufSBvbmx5IGxvY2FsIGl0ZW1zIGNhbiBiZSBzdG9yZWQsIHNvIGFsbCBlbnRyaWVzIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgdGhpcy5lbnRyaWVzfSBhcmUgbG9jYWxcbiAqIElmIGEgbm9uLWxvY2FsIGVudHJ5IGlzIHJlcXVlc3RlZCBpdCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIgU2VydmVySXRlbUhhbmRsZXJ9IHdoaWNoIHdpbGwgZmV0Y2hDb2xsZWN0aW9uRW50cnkgdGhlIGVudHJ5IGZyb20gdGhlIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRleHRlbmRzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHRoaXMgYmUge1tpdGVtVHlwZTogc3RyaW5nXToge1tpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5fX0gZm9yIHF1aWNrIGxvb2t1cCA/XG5cdHB1YmxpYyBkZWxldGVkSXRlbXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdHB1YmxpYyBpdGVtQ2hhbmdlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgZmllbGRDaGFuZ2VDYWxsYmFja3M6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFtpdGVtSWQ6IHN0cmluZ106IEZpZWxkQ2hhbmdlQ2FsbGJhY2tbXVxuXHRcdH1cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGRlcGVuZGVuY2llczogVHJhbnNhY3Rpb25JdGVtSGFuZGxlckRlcGVuZGVuY3lJbnRlcmZhY2UsXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdHByaXZhdGUgdmFsaWRhdG9yPzogVHJhbnNhY3Rpb25WYWxpZGF0b3IsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbHVtblV0aWwsXG5cdFx0XHRkZXBlbmRlbmNpZXMuYXBpRm9ybWF0dGVyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLml0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRkZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyRmllbGRDaGFuZ2VDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y2FsbGJhY2s6IEZpZWxkQ2hhbmdlQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPixcblx0KTogRGVyZWdGdW5jdGlvbiB7XG5cdFx0Y3JlYXRlUGF0aChcblx0XHRcdHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3MsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0W10sXG5cdFx0XHRdLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkQ2hhbmdlQ2FsbGJhY2tzW2l0ZW1UeXBlXVtpdGVtSWRdLnB1c2goY2FsbGJhY2spO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtVHlwZV1baXRlbUlkXS5pbmRleE9mKGNhbGxiYWNrKTtcblxuXHRcdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbVR5cGVdW2l0ZW1JZF0uc3BsaWNlKFxuXHRcdFx0XHRpbmRleCxcblx0XHRcdFx0MSxcblx0XHRcdCk7XG5cblx0XHRcdGlmICh0aGlzLmZpZWxkQ2hhbmdlQ2FsbGJhY2tzW2l0ZW1UeXBlXVtpdGVtSWRdLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbVR5cGVdKSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtVHlwZV07XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBjb3B5VHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzIChcblx0XHRpdGVtRW50cnlDaGFuZ2VzOiBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0KTogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aW5pdGlhbDogdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdFx0aXRlbUVudHJ5Q2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0ZW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0KSxcblx0XHRcdGNoYW5nZXM6IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGl0ZW1FbnRyeUNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCksXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gc3VwZXIuY3JlYXRlSXRlbUVudHJ5KGNyZWF0ZVR1cGxlKTtcblx0XHRjb25zdCBkZWZhdWx0TG9jYWxDaGFuZ2VzID0gdGhpcy5kZXBlbmRlbmNpZXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdExvY2FsQ2hhbmdlcykge1xuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRMb2NhbENoYW5nZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0e30sXG5cdFx0XHRjcmVhdGVUdXBsZS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdGluaXRpYWw6IGNyZWF0ZVR1cGxlLmZpZWxkcyxcblx0XHRcdGNoYW5nZXM6IGNoYW5nZXMsXG5cdFx0fTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5pbml0aWFsLmlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcy5pZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy52YWxpZGF0b3IudmFsaWRhdGVJdGVtKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGNyZWF0ZVR1cGxlLmZpZWxkcyxcblx0XHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBsb2NhbCB7QGxpbmsgRmllbGRNYXAgY2hhbmdlc30gb2YgdGhlIHtAbGluayBJdGVtRW50cnkgZW50cnl9IG9uIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn0gaW4gYSBmb3JtYXR0ZWQgd2F5IHRoZSBBUEkgYWNjZXB0c1xuXHQgKi9cblx0cHVibGljIGZvcm1hdFJlcXVlc3Q8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHQpOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3QgbWFpbkNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLm1haW47XG5cblx0XHRpZiAoZW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVxdWVzdExvY2FsKFxuXHRcdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0XHRtYWluQ29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlcXVlc3QoXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5pbml0aWFsLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcyxcblx0XHRcdG1haW5Db2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGV0ZWN0Q2hhbmdlcyAoKTogYm9vbGVhbiB7XG5cdFx0Ly8gaWYgYW4gZW50cnkgaXMgaW4gdGhpcyB0cmFuc2FjdGlvbidzIGNhY2hlIGl0J3MgYSBsb2NhbCBvbmUsIHdoaWNoIGNvdW50cyBhcyBhIGNoYW5nZVxuXHRcdGZvciAoY29uc3QgX2l0ZW1FbnRyeUlkIGluIHRoaXMuZW50cmllcy5lbnRyaWVzQnlFbnRyeUlkKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHRoaXMuZGVsZXRlZEl0ZW1zKSB7XG5cdFx0XHRpZiAodGhpcy5kZWxldGVkSXRlbXNbaXRlbVR5cGVdLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiB0aGlzLml0ZW1DaGFuZ2VzKSB7XG5cdFx0XHRjb25zdCBoYXNDaGFuZ2VzID0gdGhpcy5kZXRlY3RFbnRyeUNoYW5nZXMoTnVtYmVyKGl0ZW1FbnRyeUlkKSk7XG5cblx0XHRcdGlmIChoYXNDaGFuZ2VzKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgY2hhbmdlcyBmb3IgdGhlIHBhc3NlZCB7QGxpbmsgSXRlbUVudHJ5LmlkIEl0ZW1FbnRyeUlkfVxuXHQgKlxuXHQgKiAtLS0tLVxuXHQgKiBAcmVtYXJrc1xuXHQgKiBDb21wYXJlcyBldmVyeSBmaWVsZCAob2YgdGhlIGVudHJ5KSBpbiB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5pdGVtQ2hhbmdlcyBpdGVtQ2hhbmdlc30gd2l0aCB0aGUgaW5pdGlhbCBmaWVsZHMsIGJlY2F1c2UgZmllbGRzIGFyZSBjb3BpZWQgb3ZlciB3aGVuIGNyZWF0aW5nIGEgcmVzb3VyY2UgaGF2aW5nIHNvbWV0aGluZyBpbiBpdGVtQ2hhbmdlcyBkb2Vzbid0IGFjdHVhbGx5IG1lYW4gdGhhdCB0aGVyZSBhcmUgY2hhbmdlcyAoanVzdCB0aGF0IGEgcmVzb3VyY2UgaGFzIGJlZW4gbWFkZSlcblx0ICovXG5cdHB1YmxpYyBkZXRlY3RFbnRyeUNoYW5nZXMgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pOiBib29sZWFuIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKSE7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRjaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRjaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFByb2Nlc3NlcyBvbiBhIGNhY2hlZCBlbnRyeSwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQsIHVubGVzcyBmb3JjZU92ZXJ3cml0ZSBpcyBzZXRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeUNoYW5nZXNUdXBsZSBUaGUgY2hhbmdlcyB0dXBsZVxuXHQgKiBAcGFyYW0gZm9yY2VPdmVyd3JpdGUgSW5zdGVhZCBvZiBjYWxsaW5nIHtAbGluayBBcGlGb3JtYXR0ZXIubWVyZ2VDb3B5RmllbGRzIG1lcmdlQ29weUZpZWxkc30sIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBjb3B5RmllbGRzfSB3aWxsIGJlIHVzZWQgKGJlY2F1c2UgQVBJIHZhbHVlcyBhcmUgYWx3YXlzIHJpZ2h0KVxuXHQgKiBAcGFyYW0gdXBkYXRlSW5pdGlhbCBTaG91bGQgYmUgYHRydWVgIGlmIGNhbGxlZCBieSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG5cdCAqIEBwYXJhbSBpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlIEluZGljYXRlcyB0aGF0IHRoZSBjaGFuZ2UgaXMgZG9uZSBieSBhIGRpZmZlcmVudCB1c2VyXG5cdCAqIEBwYXJhbSBjcmVhdGVJdGVtQ2hhbmdlc0lmTm9uZUV4aXN0IElzIGB0cnVlYCB3aGVuIGNhbGxlZCBmcm9tIGBhcHBseUNoYW5nZXNEZWx0YWAsIHdlIGNhbiBhc3N1bWUgdGhhdCB3aGVuIHlvdSBjYWxsIGBhcHBseUNoYW5nZXNEZWx0YWAgd2l0aCB1cGRhdGVzIHRoYXQgYXJlbid0IG9uIHRoZSB0cmFuc2FjdGlvbiB5ZXQgeW91IHdhbnQgdG8gYWRkIHRob3NlXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIFRoZSBwcmV2aW91cyBjaGFuZ2VzIHtAbGluayBGaWVsZE1hcCBGaWVsZE1hcH1cblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXNUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Zm9yY2VPdmVyd3JpdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHR1cGRhdGVJbml0aWFsOiBib29sZWFuID0gZmFsc2UsXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGNyZWF0ZUl0ZW1DaGFuZ2VzSWZOb25lRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHQvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZXNlIGl0ZW1zIGNhY2hlZCAgd2UgZG9uJ3QgbmVlZCB0byBtZXJnZS9jb3B5IGFueXRoaW5nXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIWNyZWF0ZUl0ZW1DaGFuZ2VzSWZOb25lRXhpc3QpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdFx0aW5pdGlhbDogdGhpcy50cmFuc2FjdGlvbi5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KGl0ZW1FbnRyeS5pZCksXG5cdFx0XHRcdGNoYW5nZXM6IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShpdGVtRW50cnkuaWQpLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgIT09IG51bGwpIHtcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zID0gY2hhbmdlcy5leHBhbmRlZENvbHVtbnMubWVyZ2VkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdGNvbnN0IHByZXZpb3VzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0e30sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNVcGRhdGVkRmllbGRzID0gdGhpcy5hcGlGb3JtYXR0ZXIuaGFzQ2hhbmdlcyhcblx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXG5cdFx0aWYgKGZvcmNlT3ZlcndyaXRlKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5tZXJnZUNvcHlGaWVsZHMoXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0Y2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICh1cGRhdGVJbml0aWFsKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzLmZpZWxkcy5kaXNwbGF5bmFtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuZXdEaXNwbGF5TmFtZSA9IHRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0RGlzcGxheU5hbWUoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAobmV3RGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5kaXNwbGF5bmFtZSA9IG5ld0Rpc3BsYXlOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNVcGRhdGVkRmllbGRzKSB7XG5cdFx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUl0ZW0oXG5cdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvbkNoYW5nZUNhbGxiYWNrcyA9IHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbUVudHJ5Lml0ZW1UeXBlXT8uW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXG5cdFx0XHRpZiAob25DaGFuZ2VDYWxsYmFja3MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9uQ2hhbmdlQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdGNvbHVtbklkID0+IHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbaXRlbUVudHJ5Lml0ZW1UeXBlXVtjb2x1bW5JZF0udHlwZSxcblx0XHRcdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlc1tjb2x1bW5JZF0sXG5cdFx0XHRcdFx0XHRcdFx0cHJldmlvdXNbY29sdW1uSWRdLFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcHJldmlvdXM7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IEl0ZW1JZFtdIHtcblx0XHQvLyB0aGUgdGhlIGl0ZW1zIG1pZ2h0IHJlZmVyZW5jZSBlYWNoIG90aGVyLCBzbyB1cGRhdGUgdGhlIGNvbnZlcnNpb24gbWFwIGZpcnN0XG5cdFx0dGhpcy5kZXBlbmRlbmNpZXMuY29udmVyc2lvbk1hcFNlcnZpY2UuYmF0Y2hFeHBhbmRDb252ZXJzaW9uTWFwKFxuXHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXN1bHQ6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0dGhpcy5jbG9uZUl0ZW1FbnRyeShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGNsb25lSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0c291cmNlRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fSxcblx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjaz86IE1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHQpOiBJdGVtSWQge1xuXHRcdGNvbnN0IHNvdXJjZUVudHJ5Q2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdHNvdXJjZUVudHJ5LmlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCBuZXdJdGVtSWQgPSB0aGlzLmRlcGVuZGVuY2llcy5jb252ZXJzaW9uTWFwU2VydmljZS5leHBhbmRDb252ZXJzaW9uTWFwKFxuXHRcdFx0c291cmNlRW50cnksXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRjb25zdCBmaWVsZHNDb3B5ID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHNvdXJjZUVudHJ5Q2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0c291cmNlRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHR0aGlzLmRlcGVuZGVuY2llcy5jb252ZXJzaW9uTWFwU2VydmljZS51cGRhdGVJdGVtVmFsdWVzKFxuXHRcdFx0ZmllbGRzQ29weSxcblx0XHRcdGZpZWxkc0NvcHksXG5cdFx0XHRzb3VyY2VFbnRyeS5jb2x1bW5zLml0ZW0sXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdHNvdXJjZUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRmaWVsZHNDb3B5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuX3NldEl0ZW1DcmVhdGVkKFxuXHRcdFx0bmV3SXRlbUlkLFxuXHRcdFx0ZmllbGRzQ29weSxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiBuZXdJdGVtSWQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKCF0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdFx0LmZldGNoSXRlbUVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoY2FjaGVkRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdoZW4gZXhwYW5kaW5nIGl0ZW1zIHdpdGggbmV3IGRhdGEgKHdoaWNoIGFyZW4ndCB0ZWNobmljYWxseSBjaGFuZ2VzKSBpdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdHJhbnNhY3Rpb24gdGhlIGl0ZW0gbGl2ZXMgb25cblx0XHRcdC8vIFdlIGRvIHRoZSBzYW1lIChidXQgZmFzdGVyKSBieSBza2lwcGluZyBzdHJhaWdodCB0byB0aGUgc2VydmVyIGNhY2hlIGZvciByZW1vdGUgaXRlbXNcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLnBhcmVudC5pdGVtSGFuZGxlci5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b3B0aW9ucy5jb2x1bW5zID0gdGhpcy5leHBhbmRDb2x1bW5zV2l0aENvbGxlY3Rpb25Db2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoTG9jYWxJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4gaXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgdGVtcGxhdGUgYW5kIGNyZWF0ZXMgYSBuZXcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9LCB3aWxsIGVycm9yIGlmIHRoZSBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gSXRlbUlkIGFscmVhZHkgZXhpc3RzXG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hOZXdJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCkgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVFeGlzdGluZ0xvY2FsSXRlbUVycm9yKGl0ZW1UeXBlKSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0bGV0IGNoYW5nZXNEZWx0YVJlc3VsdDogQ2hhbmdlc0RlbHRhUmVzdWx0O1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnRlbXBsYXRlQ2FjaGVcblx0XHRcdC5mZXRjaFRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRvcHRpb25zLnRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdFx0e1tpdGVtVHlwZV06IG9wdGlvbnMuY29sdW1uc30sXG5cdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRlbXBsYXRlID0+IHtcblx0XHRcdFx0XHQvLyBJdCBjb3VsZCBiZSB0aGF0IGZvciB3aGF0ZXZlciByZWFzb24gJ2ZldGNoTmV3SXRlbScgaXMgY2FsbGVkIGEgc2Vjb25kIHRpbWUgd2hpbGUgbG9hZGluZ1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5pdGVtQ3JlYXRlU2VydmljZS5wcm9jZXNzVGVtcGxhdGUoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0XHRcdFx0dGVtcGxhdGUsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfY2hhbmdlc0RlbHRhUmVzdWx0ID0+IHtcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGFSZXN1bHQgPSBfY2hhbmdlc0RlbHRhUmVzdWx0O1xuXG5cdFx0XHRcdFx0Y29uc3QgY3JlYXRlZEVudHJpZXNCeUl0ZW1UeXBlID0gY2hhbmdlc0RlbHRhUmVzdWx0LmNyZWF0ZWQucmVkdWNlKFxuXHRcdFx0XHRcdFx0KFxuXHRcdFx0XHRcdFx0XHRtYXA6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0XHRcdFx0XHQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKCFtYXAuaGFzT3duUHJvcGVydHkoaXRlbUVudHJ5Lml0ZW1UeXBlKSkge1xuXHRcdFx0XHRcdFx0XHRcdG1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID0gW107XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRtYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVDaGFuZ2VzRGVsdGEoKTtcblx0XHRcdFx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxhbnk+PiA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBtYXBJdGVtVHlwZSBpbiBjcmVhdGVkRW50cmllc0J5SXRlbVR5cGUpIHtcblx0XHRcdFx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlZEVudHJpZXNCeUl0ZW1UeXBlW21hcEl0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVkRW50cmllc0J5SXRlbVR5cGVbbWFwSXRlbVR5cGVdWzBdLmNvbHVtbnMucm9vdCxcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcyk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBjaGFuZ2VzRGVsdGFSZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgcmVtb3RlSXRlbUlkczogSXRlbUlkW10gPSBbXTtcblx0XHRjb25zdCBsb2NhbEl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpdGVtSWRzKSB7XG5cdFx0XHRpZiAodGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKSkge1xuXHRcdFx0XHRsb2NhbEl0ZW1JZHMucHVzaChpdGVtSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVtb3RlSXRlbUlkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwoe1xuXHRcdFx0XHRyZW1vdGU6IHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHRcdC5pdGVtSGFuZGxlclxuXHRcdFx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRyZW1vdGVJdGVtSWRzLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRsb2NhbDogdGhpcy5mZXRjaExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0bG9jYWxJdGVtSWRzLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCksXG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdC5yZW1vdGUuY29uY2F0KHJlc3VsdC5sb2NhbCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gbW92ZSB0byBUcmFuc2FjdGlvbkNhY2hlID9cblx0cHVibGljIGZldGNoVGl0bGUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxzdHJpbmc+IHtcblx0XHRjb25zdCB0aXRsZUZpZWxkID0gdGhpcy5kZXBlbmRlbmNpZXMuaXRlbUVudHJ5U2VydmljZS5nZXRUaXRsZUZpZWxkKGl0ZW1UeXBlKTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKHtcblx0XHRcdFx0XHRjb2x1bW5zOiBbdGl0bGVGaWVsZF0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gY2hhbmdlc1t0aXRsZUZpZWxkXTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlTG9jYWxJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoY29sdW1uU3Vic2V0Q2FjaGUucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbkRpZmZlcmVuY2UgPSB0aGlzLmdldENvbHVtbkRpZmZlcmVuY2UoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5IYW5kbGVyXG5cdFx0XHQuZmV0Y2goXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uRGlmZmVyZW5jZSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRbaXRlbUVudHJ5XSxcblx0XHRcdFx0XHRcdGNvbHVtbkRpZmZlcmVuY2UsXG5cdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IGl0ZW1FbnRyeSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRMb2NhbEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGlmIChpdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oaXRlbUVudHJpZXMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuZGVwZW5kZW5jaWVzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGNvbHVtbkV4cGFuc2lvbi5ydW4oaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHRpZiAoZXhwYW5zaW9uUmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJ5KFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZXhwYW5zaW9uUmVzdWx0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlRGVyaXZlZFZhbHVlcyhcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uLmFnZ3JlZ2F0ZVJvb3RDb2x1bW5zKCksXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgZGF0YSBmb3IgdGhlIHBhc3NlZCBJdGVtVHlwZS9JdGVtSWQvY29sdW1ucywgaXMgYWJsZSB0byBmZXRjaENvbGxlY3Rpb25FbnRyeSBub24tbG9jYWwgZGVyaXZlZCB2YWx1ZXMuXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgdGhlIEl0ZW1FbnRyeSB3aXRoIHRoZSBnaXZlbiBJdGVtVHlwZS1JdGVtSWQgaXMgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBmZXRjaExvY2FsSXRlbUVudHJ5RGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KSB7XG5cdFx0Y29uc3QgY2FjaGVkRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlc29sdmVMb2NhbEl0ZW1FbnRyeShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGNhY2hlZEVudHJ5LFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5kZXBlbmRlbmNpZXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRjb25zdCBpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbjogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlVW5mb3VuZExvY2FsSXRlbUVycm9yKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2hlbiBleHBhbmRpbmcgaXRlbXMgd2l0aCBuZXcgZGF0YSAod2hpY2ggYXJlbid0IHRlY2huaWNhbGx5IGNoYW5nZXMpIGl0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSB0cmFuc2FjdGlvbiB0aGUgaXRlbSBsaXZlcyBvblxuXHRcdFx0XHQvLyBXZSBkbyB0aGUgc2FtZSAoYnV0IGZhc3RlcikgYnkgc2tpcHBpbmcgc3RyYWlnaHQgdG8gdGhlIHNlcnZlciBjYWNoZSBmb3IgcmVtb3RlIGl0ZW1zXG5cdFx0XHRcdGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5mZXRjaExvY2FsSXRlbUVudHJ5RGF0YShcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAodGhpcy50cmFuc2FjdGlvbi5wYXJlbnQgaW5zdGFuY2VvZiBTZXJ2ZXJDYWNoZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIGxvb2tpbmcgZm9yIGxvY2FsIGVudHJpZXMgb24gdGhlIHNlcnZlckNhY2hlJyk7XG5cdFx0XHR9XG5cblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdCh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBhcyBUcmFuc2FjdGlvbkNhY2hlKS5pdGVtSGFuZGxlci5mZXRjaExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkc09uUGFyZW50VHJhbnNhY3Rpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IGl0ZW1JZHMubWFwKFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCA9PiB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQoXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0XHQpISxcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Q29sdW1uRGlmZmVyZW5jZSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5zIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5yZXF1ZXN0LFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KS5kaWZmZXJlbmNlO1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRMb2NhbEl0ZW1FbnRyeTxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdDogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBtYWluQ29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdC5kaWZmZXJlbmNlLm1haW47XG5cblx0XHRlbnRyeS5jb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uUmVzdWx0Lm1lcmdlZDtcblxuXHRcdGlmIChtYWluQ29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldExvY2FsVmFsdWVzKFxuXHRcdFx0ZW50cnksXG5cdFx0XHRtYWluQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHZhbHVlcykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRlbnRyeSxcblx0XHRcdHZhbHVlcyxcblx0XHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdCxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRMb2NhbFZhbHVlczxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChlbnRyeSk7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXSk7XG5cdFx0Y29uc3QgcmVzdWx0OiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cblx0XHRcdC8vIHBhcmVudCBjb2x1bW5zIG1pZ2h0IGFsc28gYmUgaW5jbHVkZWQgaW4gdGhlIGRpZmZlcmVuY2Vcblx0XHRcdGlmIChjaGFuZ2VzW2NvbHVtbklkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmFwaUNvbHVtbi50eXBlO1xuXG5cdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gY29sdW1uVHlwZSA9PT0gJ2xpbmsnICYmIHBhcmVudCAhPT0gbnVsbCA/XG5cdFx0XHRcdHBhcmVudC5pdGVtSWQgOlxuXHRcdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5nZXREZWZhdWx0VmFsdWUoY29sdW1uVHlwZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufVxuIiwiaW1wb3J0IHsgUm1Db3JlIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbUlkQ29udmVyc2lvbk1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2sgfSBmcm9tICcuLi9DaGFuZ2VzUHJvY2Vzc29yJztcbmltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IEl0ZW1DYWNoZSB9IGZyb20gJy4uL0l0ZW1DYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLCBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25WYWxpZGF0b3InO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDYWNoZSB7XG5cblx0cHVibGljIGNoaWxkcmVuOiBUcmFuc2FjdGlvbkNhY2hlW10gPSBbXTtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIgfCBTZXJ2ZXJJdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyIHwgU2VydmVyQ29sbGVjdGlvbkhhbmRsZXI7XG5cblx0cHVibGljIHBhcmVudDogQWJzdHJhY3RDYWNoZSB8IG51bGw7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgZGVwZW5kZW5jaWVzOiBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSxcblx0XHRwdWJsaWMgY29yZTogUm1Db3JlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDaGlsZCAoXG5cdFx0aWQ/OiBzdHJpbmcsXG5cdFx0dmFsaWRhdG9yRmFjdG9yeT86IFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSxcblx0KTogVHJhbnNhY3Rpb25DYWNoZSB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25DYWNoZShcblx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLFxuXHRcdFx0dGhpcy5jb3JlLFxuXHRcdFx0dGhpcyxcblx0XHRcdGlkLFxuXHRcdFx0dmFsaWRhdG9yRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKHRyYW5zYWN0aW9uKTtcblxuXHRcdHJldHVybiB0cmFuc2FjdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBvbkNoaWxkRGVzdHJveSAoY2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihjYWNoZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZShcblx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdDEsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbENvbGxlY3Rpb25FbnRyeUJ5UXVlcnlTdHJpbmcgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZml0IHRoZSBjb2xsZWN0aW9uJ3MgcXVlcnksIGNvcGllcyBvdmVyIHRoZSBjb2xsZWN0aW9uQ2hhbmdlcyBvbiBhbGwgdHJhbnNhY3Rpb25zIGluIHRoZSBjaGFpbi5cblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRDb2xsZWN0aW9uQ2hhbmdlc1JlY3Vyc2l2ZWx5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogSXRlbUVudHJ5W107XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoaXMgdHJhbnNhY3Rpb24gYW5kIGFsbCBwYXJlbnRzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNhY3Rpb25DaGFpbiAoKTogQWJzdHJhY3RDYWNoZVtdIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbnM6IEFic3RyYWN0Q2FjaGVbXSA9IFtdO1xuXHRcdGxldCB0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSA9IHRoaXM7XG5cblx0XHRkbyB7XG5cdFx0XHR0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG5cblx0XHRcdC8vIEB0cy1pZ25vcmUgd2hpbGUgbG9vcCB3aWxsIGJyZWFrXG5cdFx0XHR0cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uLnBhcmVudDtcblx0XHR9IHdoaWxlICh0cmFuc2FjdGlvbiAhPT0gbnVsbCk7XG5cblx0XHRyZXR1cm4gdHJhbnNhY3Rpb25zO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzIENvbGxlY3Rpb25DYWNoZX0gb2YgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudENvbGxlY3Rpb25FbnRyeUNhY2hlICgpOiBDb2xsZWN0aW9uQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgSXRlbUNhY2hlfSBvZiB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50SXRlbUVudHJ5Q2FjaGUgKCk6IEl0ZW1DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcztcblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGU7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsSXRlbUVudHJ5IChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtRW50cnlbJ2l0ZW1JZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQXBwbGllcyBjaGFuZ2VzIGZyb20gYSBjaGlsZCB0cmFuc2FjdGlvbiB0byBhIHBhcmVudFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUlkQ29udmVyc2lvbk1hcD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYSBwYXJlbnQgdHJhbnNhY3Rpb24sIHByb3BhZ2F0ZXMgY2hhbmdlcyBkb3dud2FyZHMgdG8gYWxsIGNoaWxkIGNhY2hlc1xuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIGNvcmVcblx0ICpcblx0ICogdG9kb1tjYWNoZV0gU2hvdWxkIHdlIHJlZmV0Y2ggZGVyaXZlZCB2YWx1ZXMganVzdCBsaWtlIGluIGFwcGx5Q2hhbmdlc0RlbHRhID9cblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCAoXG5cdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGE6IEludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlOiBib29sZWFuLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4sXG5cdCk6IHZvaWQ7XG5cblx0cHVibGljIGFic3RyYWN0IGdldFBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZnJvbUluaXRpYWw/OiBib29sZWFuLFxuXHRcdHByb3ZpZGVkRmllbGRzPzogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogRW50cnlQYXJlbnROdWxsO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvcHlGaWVsZHM/OiBib29sZWFuLFxuXHQpOiBGaWVsZE1hcDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQmVjYXVzZSB0aGUgYGl0ZW1DaGFuZ2VzYCBvYmplY3QgZGlmZmVycyBiZXR3ZWVuIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgU2VydmVySXRlbUhhbmRsZXJ9IGFuZCB0aGUge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgVHJhbnNhY3Rpb25JdGVtSGFuZGxlcn0gd2UgbmVlZCBhIGZ1bmN0aW9uIHRvIG5vcm1hbGlzZSB0aG9zZSB2YWx1ZXNcblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBTaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBjb3JlXG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4gfCBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD47XG5cblx0cHJvdGVjdGVkIGdldFBhcmVudEZyb21GaWVsZHM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogRW50cnlQYXJlbnROdWxsIHtcblx0XHRpZiAoZmllbGRzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtRW50cnkuY29sdW1ucy5saW5rICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpdGVtVHlwZTogaXRlbUVudHJ5LmNvbHVtbnMubGluay5hcGlDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogZmllbGRzW2l0ZW1FbnRyeS5jb2x1bW5zLmxpbmsuaWRdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSBpdGVtRW50cnkuY29sdW1ucy5yZXNwb25zZVtpdGVtRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0aWYgKFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLml0ZW10eXBlICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIHJlc3BvbnNlQ29sdW1ucy5pdGVtICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGl0ZW1UeXBlOiBmaWVsZHMuaXRlbXR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogZmllbGRzLml0ZW0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYXBwbHlDaGFuZ2VzRGVsdGEgZnJvbSBTZXJ2ZXJDYWNoZSBhbmQgVHJhbnNhY3Rpb25DYWNoZS4gQXBwbGllcyBjcmVhdGVzLCB1cGRhdGVzIGFuZCBtb3ZlcywgZG9lc24ndCBhcHBseSBkZWxldGVzXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgX2FwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KToge1xuXHRcdHJlc3VsdDogQ2hhbmdlc0RlbHRhUmVzdWx0LFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRyb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPixcblx0fSB7XG5cdFx0Ly8gV2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBDaGFuZ2VzRGVsdGEgdG8gYW4gSW50ZXJuYWxDaGFuZ2VzRGVsdGEgaW4gb3JkZXIgdG8gcGFzcyBpdCB0byB0aGUgQ29sbGVjdGlvbk1hdGNoZXIgYW5kIGNoaWxkIFRyYW5zYWN0aW9uc1xuXHRcdGNvbnN0IGludGVybmFsQ2hhbmdlc0RlbHRhID0gdGhpcy5kZXBlbmRlbmNpZXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNoYW5nZXNEZWx0YS5fcXVlcnlSZXN1bHRzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHF1ZXJ5U3RyaW5nIGluIGNoYW5nZXNEZWx0YS5fcXVlcnlSZXN1bHRzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5fc2V0UXVlcnlSZXN1bHQoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cXVlcnlTdHJpbmcsXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLl9xdWVyeVJlc3VsdHNbaXRlbVR5cGVdW3F1ZXJ5U3RyaW5nXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjcmVhdGVkRW50cmllczogQ2hhbmdlc0RlbHRhUmVzdWx0WydjcmVhdGVkJ10gPSBbXTtcblx0XHRjb25zdCByb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPiA9IFtdO1xuXG5cdFx0Ly8gV2Ugb25seSBjcmVhdGUgbmV3IGVudHJpZXMgb24gdGhlIGRpcmVjdCB0cmFuc2FjdGlvbiwgbm90IG9uIHRoZSBjaGlsZHJlblxuXHRcdGNoYW5nZXNEZWx0YS5jcmVhdGVkLmZvckVhY2goXG5cdFx0XHR0dXBsZSA9PiB7XG5cdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuY3JlYXRlSXRlbUVudHJ5KHR1cGxlKTtcblxuXHRcdFx0XHRjcmVhdGVkRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdHRoaXMuZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiByb2xsYmFja0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSksXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHR0dXBsZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0KTtcblxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0dHVwbGUuY2hhbmdlcy5leHBhbmRlZENvbHVtbnMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAocHJldmlvdXMgIT09IG51bGwpIHtcblx0XHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0dXBsZS5jaGFuZ2VzLnBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5wYXJlbnQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdoZW4gcm9sbGluZyBiYWNrIGEgZGVsdGEgd2UgY2FsbCBgc2V0SXRlbVVwZGF0ZWRgIHRvIHJlc3RvcmUgZGVsZXRpb25zXG5cdFx0XHRpZiAodGhpcy5pdGVtSGFuZGxlciBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIpIHtcblx0XHRcdFx0Y29uc3QgZGVsZXRlZEVudHJpZXMgPSB0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1t0dXBsZS5lbnRyeS5pdGVtVHlwZV07XG5cblx0XHRcdFx0aWYgKGRlbGV0ZWRFbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gZGVsZXRlZEVudHJpZXMuaW5kZXhPZih0dXBsZS5lbnRyeSk7XG5cblx0XHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0XHRkZWxldGVkRW50cmllcy5zcGxpY2UoXG5cdFx0XHRcdFx0XHRpbmRleCxcblx0XHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZXN1bHQ6IHtcblx0XHRcdFx0Y3JlYXRlZDogY3JlYXRlZEVudHJpZXMsXG5cdFx0XHRcdHJvbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgcm9sbGJhY2tEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZuIG9mIHJvbGxiYWNrRnVuY3Rpb25zKSB7XG5cdFx0XHRcdFx0XHRmbihyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEVuc3VyZXMgdGhhdCBmb3IgYWxsIHVwZGF0ZWQgaXRlbXMgaW4gdGhlIGRlbHRhIHRoZSByZXF1aXJlZCBkZXJpdmVkIHZhbHVlcyBhcmUgcHJlc2VudFxuXHQgKi9cblx0cHJvdGVjdGVkIGZldGNoVXBkYXRlZERlcml2ZWRWYWx1ZXNGcm9tRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdW10+IHtcblx0XHRjb25zdCBkZXJpdmVkUHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W10+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cdFx0XHRjb25zdCBjaGFuZ2VkUm9vdENvbHVtbnM6IENvbHVtbkluZm9bXSA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiB0dXBsZS5lbnRyeS5jb2x1bW5zLnJvb3QpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuZmllbGRzLmhhc093blByb3BlcnR5KGNvbHVtbi5pZClcblx0XHRcdFx0XHQmJiB0dXBsZS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdICE9PSB0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF0pW2NvbHVtbi5pZF1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y2hhbmdlZFJvb3RDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZFJvb3RDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVyaXZlZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0W3R1cGxlLmVudHJ5XSxcblx0XHRcdFx0XHRjaGFuZ2VkUm9vdENvbHVtbnMsXG5cdFx0XHRcdFx0Ly8gV2UgcGFzcyB0aGUgZGVsdGEgc28gdGhlIG5ldyByb290Q29sdW1uJ3MgdmFsdWVzIGFyZSByZWFkXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgbmV3IGRlcml2ZWQgdmFsdWVzIGV4aXN0IGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlLCBzaW5jZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gbWlnaHQgdXNlIHRoZSBuZXcgdmFsdWVzXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlLmFsbChkZXJpdmVkUHJvbWlzZXMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBYnN0cmFjdENhY2hlLCBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi8nO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcy8nO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gSXRlbVR5cGU+ID0ge1xuXHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0aXRlbTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0aXNNYXRjaDogYm9vbGVhbiB8ICdtYXliZSdcblx0fVxufTtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0cHJvdGVjdGVkIG1hcDoge1xuXHRcdFtjb2xsZWN0aW9uRW50cnlJZDogbnVtYmVyXToge1xuXHRcdFx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkVudHJ5XG5cdFx0XHRtYXRjaGVzOiBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXNcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdHByaXZhdGUgZ2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmQ8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5VHlwZSxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBxdWVyeU1hdGNoZXIgPSB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2V4cGFuZChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9PiBxdWVyeU1hdGNoZXIubWF0Y2hRdWVyeShjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0KSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NEZWx0YSAoaW50ZXJuYWxDaGFuZ2VzRGVsdGE6IEludGVybmFsQ2hhbmdlc0RlbHRhKTogdGhpcyB7XG5cdFx0Ly8gd2UgZG8gZGVsZXRpbmcgZmlyc3QgYmVjYXVzZSBpdCdzIHRoZSBsZWFzdCBleHBlbnNpdmUgb3BlcmF0aW9uXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzVG9CZURlbGV0ZWQgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXTtcblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZW50cmllc1RvQmVEZWxldGVkKSB7XG5cdFx0XHRcdHRoaXMuX2V4cGFuZChcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0Ly8gQ29sbGVjdGlvbnMgY2FuIG5ldmVyIGNvbnRhaW4gZGVsZXRlZCBpdGVtcyB0byB0aGV5J3JlIGFsd2F5cyBub3QgZml0dGluZ1xuXHRcdFx0XHRcdCgpID0+IGZhbHNlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdHR1cGxlLmZpZWxkcyxcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQodHVwbGUuZW50cnkpLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy5fZXhwYW5kKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHtcblx0XHRcdFx0XHRjb25zdCBtYXRjaGVySGludHMgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5fcXVlcnlSZXN1bHRzW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV07XG5cblx0XHRcdFx0XHRpZiAobWF0Y2hlckhpbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG1hdGNoZXJIaW50ID0gbWF0Y2hlckhpbnRzW2NvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmddO1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG1hdGNoZXJIaW50ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRcdFx0IXR1cGxlLmVudHJ5LmlzTG9jYWwoKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBtYXRjaGVySGludC5pbmRleE9mKHR1cGxlLmVudHJ5Lml0ZW1JZCkgIT09IC0xO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBxdWVyeU1hdGNoZXIubWF0Y2hRdWVyeShjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0KTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZCkge1xuXHRcdFx0Y29uc3QgbW92ZWQgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuX2V4cGFuZChcblx0XHRcdFx0bW92ZWQuZW50cnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9PiBjb2xsZWN0aW9uRW50cnkubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdFx0bW92ZWQudG8uaXRlbVR5cGUsXG5cdFx0XHRcdFx0bW92ZWQudG8uaXRlbUlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdGNvbnN0IGNoYW5nZXMgPSB7fTtcblx0XHRcdGNvbnN0IGNhY2hlZENoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdE51bWJlcihpdGVtRW50cnlJZCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgY29weUNoYW5nZSA9IChcblx0XHRcdFx0ZmllbGRzOiBGaWVsZE1hcCxcblx0XHRcdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcblx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKGRlc2MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0XHRcdGNoYW5nZXMsXG5cdFx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0XHRcdGRlc2MsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtbklkXSA9IGZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY2FjaGVkQ2hhbmdlcykge1xuXHRcdFx0XHRjb3B5Q2hhbmdlKFxuXHRcdFx0XHRcdGNhY2hlZENoYW5nZXMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdHVwbGUuY2hhbmdlcy5maWVsZHMpIHtcblx0XHRcdFx0Y29weUNoYW5nZShcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGNoYW5nZXMsXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KHR1cGxlLmVudHJ5KSxcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMuX2V4cGFuZChcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbWF0Y2hlckhpbnRzID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuX3F1ZXJ5UmVzdWx0c1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdFx0aWYgKG1hdGNoZXJIaW50cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtYXRjaGVySGludCA9IG1hdGNoZXJIaW50c1tjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nXTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVySGludCAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0XHRcdCF0dXBsZS5lbnRyeS5pc0xvY2FsKClcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlckhpbnQuaW5kZXhPZih0dXBsZS5lbnRyeS5pdGVtSWQpICE9PSAtMTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhc0ZpdHRpbmdJdGVtcyAobWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0aWYgKG1hdGNoZXNbaXRlbUlkXS5pc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByb3RlY3RlZCBfZXhwYW5kIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRtYXRjaEZ1bmN0aW9uOiAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4gfCAnbWF5YmUnLFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBtYXAgPSB0aGlzLm1hcDtcblx0XHRjb25zdCBpdGVtSWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLmdldENvbGxlY3Rpb25FbnRyaWVzKGl0ZW1FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5SWQgPSBjb2xsZWN0aW9uRW50cnkuaWQ7XG5cdFx0XHRsZXQgbWF0Y2hlcztcblxuXHRcdFx0aWYgKG1hcFtjb2xsZWN0aW9uRW50cnlJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtYXBbY29sbGVjdGlvbkVudHJ5SWRdID0ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb246IGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRtYXRjaGVzOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlcyA9IG1hcFtjb2xsZWN0aW9uRW50cnlJZF0ubWF0Y2hlcztcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gV2UgY291bGQgb3B0aW1pc2Ugc29tZSB0aGluZ3MgaGVyZSBieSBjaGVja2luZyBpZiB0cmFuc2FjdGlvbi5jb2xsZWN0aW9uQ2hhbmdlcyBhbHJlYWR5IGNvbnRhaW5zIGl0ZW1FbnRyeSwgaWYgdGhhdCdzIHRoZSBjYXNlIHdlIGRvbid0IGhhdmUgdG8gbWF0Y2ggYXQgYWxsXG5cdFx0XHQvLyBDdXJyZW50bHkgYWxyZWFkeSBleGlzdGluZyBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBpbiBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMgKGNoYW5nZXMuaW5kZXhPZihpdGVtRW50cnkpICE9PSAtMSlcblx0XHRcdGlmIChtYXRjaGVzW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlc1tpdGVtSWRdID0ge1xuXHRcdFx0XHRpdGVtOiBpdGVtRW50cnksXG5cdFx0XHRcdGlzTWF0Y2g6IG1hdGNoRnVuY3Rpb24oY29sbGVjdGlvbkVudHJ5KSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckJhc2UgfSBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlclxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGdldENvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zICgpOiBDb2xsZWN0aW9uRW50cnlbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uSWQgaW4gdGhpcy5tYXApIHtcblx0XHRcdGNvbnN0IG1hcEVudHJ5ID0gdGhpcy5tYXBbY29sbGVjdGlvbklkXTtcblxuXHRcdFx0aWYgKHRoaXMuaGFzRml0dGluZ0l0ZW1zKG1hcEVudHJ5Lm1hdGNoZXMpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKG1hcEVudHJ5LmNvbGxlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXMgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckJhc2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Rml0dGluZzogSXRlbUlkW10sXG5cdG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9jZXNzZXMgYSBkZWx0YSBhbmQgYWRkcyB0aGUgaXRlbXMgdG8gdGhlIHJpZ2h0IGNvbGxlY3Rpb25zLCB0aGlzIGlzIHRoZSBPTkxZIGNsYXNzIHRoYXQgc2hvdWxkIGNoYW5nZSBjb2xsZWN0aW9uIGl0ZW1zXG4gKlxuICogLS0tLS0tXG4gKlxuICogQHJlbWFya1xuICogVGhlIENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBhY2Nlc3MvbW9kaWZ5IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0J3MgT05MWSBjYWxsZWQgZnJvbSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yXG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdGdldENvbGxlY3Rpb25FbnRyaWVzOiAoaXRlbVR5cGU6IEl0ZW1UeXBlKSA9PiBDb2xsZWN0aW9uRW50cnlbXSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zIChcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbklkIGluIHRoaXMubWFwKSB7XG5cdFx0XHRjb25zdCBtYXBFbnRyeSA9IHRoaXMubWFwW2NvbGxlY3Rpb25JZF07XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBtYXBFbnRyeS5jb2xsZWN0aW9uO1xuXHRcdFx0Y29uc3QgZ3JvdXBlZEl0ZW1FbnRyaWVzID0gdGhpcy5ncm91cEl0ZW1FbnRyaWVzKG1hcEVudHJ5Lm1hdGNoZXMpO1xuXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLnJlbW92ZUl0ZW1FbnRyaWVzRnJvbUNvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5ub3RGaXR0aW5nLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLmZpdHRpbmcsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZ3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHRcdC5xdWVyeShcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0XHR7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IFsnaWQnXX0sXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBub3cgZXhhY3RseSBrbm93IHdoaWNoIG9mIHRoZSBtYXliZSBpdGVtcyBmaXRcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmZpbHRlcihcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiByZXNwb25zZS5saW5rc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPiAtMSxcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBncm91cEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBmaXR0aW5nOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0XHRjb25zdCBub3RGaXR0aW5nOiBJdGVtSWRbXSA9IFtdO1xuXHRcdGNvbnN0IG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIG1hdGNoZXMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gbWF0Y2guaXRlbTtcblx0XHRcdGNvbnN0IGlzTWF0Y2ggPSBtYXRjaC5pc01hdGNoO1xuXG5cdFx0XHRpZiAoaXNNYXRjaCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRmaXR0aW5nLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAoaXNNYXRjaCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0bm90Rml0dGluZy5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF5YmUucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRmaXR0aW5nOiBmaXR0aW5nLFxuXHRcdFx0bm90Rml0dGluZzogbm90Rml0dGluZyxcblx0XHRcdG1heWJlOiBtYXliZSxcblx0XHR9O1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWRDb252ZXJzaW9uTWFwLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSwgVHJhbnNhY3Rpb25FcnJvckxldmVsIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycgfCAnb25DbG9zZScgfCAnc2tpcE9uQ2xvc2UnO1xuXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlID0ge1xuXHRvbkJlZm9yZVNhdmU6ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSkgPT4gYW55LFxuXHRvblNhdmVTdWNjZXNzOiAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KSA9PiBhbnksXG5cdG9uU2V0SXRlbUVycm9yOiAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHRcdGtleTogc3RyaW5nLFxuXHQpID0+IHZvaWQsXG5cdG9uQ2xlYXJJdGVtRXJyb3I6IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0a2V5OiBzdHJpbmcsXG5cdCkgPT4gdm9pZCxcblx0b25TZXRHbG9iYWxFcnJvcjogKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGxldmVsOiBUcmFuc2FjdGlvbkVycm9yTGV2ZWwsXG5cdCkgPT4gdm9pZCxcblx0b25DbGVhckdsb2JhbEVycm9yOiAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdCkgPT4gdm9pZCxcbn07XG5cbnR5cGUgQ2FsbGJhY2tNYXA8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+ID0ge1xuXHRba2V5OiBzdHJpbmddOiB7XG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbVF0sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb25cblx0fVxufTtcblxuY29uc3QgREVGQVVMVF9QUklPUklUWSA9IDEwMDtcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyIHtcblxuXHRwcml2YXRlIGNhbGxiYWNrczoge1xuXHRcdFtUIGluIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVdOiBBcnJheTxbXG5cdFx0XHRudW1iZXIsXG5cdFx0XHRDYWxsYmFja01hcDxUPlxuXHRcdF0+XG5cdH0gPSB7XG5cdFx0b25CZWZvcmVTYXZlOiBbXSxcblx0XHRvblNhdmVTdWNjZXNzOiBbXSxcblx0XHRvblNldEl0ZW1FcnJvcjogW10sXG5cdFx0b25DbGVhckl0ZW1FcnJvcjogW10sXG5cdFx0b25TZXRHbG9iYWxFcnJvcjogW10sXG5cdFx0b25DbGVhckdsb2JhbEVycm9yOiBbXSxcblx0fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyQ2FsbGJhY2s8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdLFxuXHRcdGNvbmRpdGlvbjogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycsXG5cdFx0cHJpb3JpdHk6IG51bWJlciA9IERFRkFVTFRfUFJJT1JJVFksXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHRoaXMuZ2V0UHJpb3JpdHlMZXZlbChcblx0XHRcdHR5cGUsXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpW2tleV0gPSB7XG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdGNvbmRpdGlvbixcblx0XHR9O1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGRlbGV0ZSB0aGlzLmdldFByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdHByaW9yaXR5LFxuXHRcdFx0KVtrZXldO1xuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZUNhbGxiYWNrczxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdHR5cGU6IFQsXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdFx0Y2xvc2VUYWI6IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0Y29uc3QgcHJpb3JpdHlMZXZlbHMgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcblx0XHRjb25zdCBjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbiA9IGNsb3NlVGFiID8gJ29uQ2xvc2UnIDogJ3NraXBPbkNsb3NlJztcblxuXHRcdGxldCBjaGFpbiA9IHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXG5cdFx0Zm9yIChjb25zdCBwcmlvcml0eUxldmVsIG9mIHByaW9yaXR5TGV2ZWxzKSB7XG5cdFx0XHRjaGFpbiA9IGNoYWluLnRoZW4oXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNhbGxiYWNrc1ByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdFx0cHJpb3JpdHlMZXZlbFsxXSBhcyBDYWxsYmFja01hcDxUPixcblx0XHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRcdFx0ZXhlY3V0ZSxcblx0XHRcdFx0KSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhaW47XG5cdH1cblxuXHRwcml2YXRlIGdldFByaW9yaXR5TGV2ZWw8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGRlc3RpbmF0aW9uUHJpb3JpdHk6IG51bWJlcixcblx0KTogQ2FsbGJhY2tNYXA8VD4ge1xuXHRcdGNvbnN0IHByaW9yaXR5TGV2ZWxzID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG5cdFx0bGV0IG5ld1ByaW9yaXR5TGV2ZWw7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByaW9yaXR5TGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBwcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbHNbaV07XG5cblx0XHRcdGlmIChwcmlvcml0eUxldmVsWzBdIDwgZGVzdGluYXRpb25Qcmlvcml0eSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByaW9yaXR5TGV2ZWxbMF0gPT09IGRlc3RpbmF0aW9uUHJpb3JpdHkpIHtcblx0XHRcdFx0cmV0dXJuIHByaW9yaXR5TGV2ZWxbMV0gYXMgQ2FsbGJhY2tNYXA8VD47XG5cdFx0XHR9XG5cblx0XHRcdG5ld1ByaW9yaXR5TGV2ZWwgPSB7fTtcblxuXHRcdFx0cHJpb3JpdHlMZXZlbHMuc3BsaWNlKFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQwLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0ZGVzdGluYXRpb25Qcmlvcml0eSxcblx0XHRcdFx0XHRuZXdQcmlvcml0eUxldmVsLFxuXHRcdFx0XHRdLFxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuIG5ld1ByaW9yaXR5TGV2ZWw7XG5cdFx0fVxuXG5cdFx0bmV3UHJpb3JpdHlMZXZlbCA9IHt9O1xuXG5cdFx0cHJpb3JpdHlMZXZlbHMucHVzaChbXG5cdFx0XHRkZXN0aW5hdGlvblByaW9yaXR5LFxuXHRcdFx0bmV3UHJpb3JpdHlMZXZlbCxcblx0XHRdKTtcblxuXHRcdHJldHVybiBuZXdQcmlvcml0eUxldmVsO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2tzUHJpb3JpdHlMZXZlbDxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdGNhbGxiYWNrczogQ2FsbGJhY2tNYXA8VD4sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdCk6ICgpID0+IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdDoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gY2FsbGJhY2tzKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrRW50cnkgPSBjYWxsYmFja3Nba2V5XTtcblxuXHRcdFx0XHRpZiAoY2FsbGJhY2tFbnRyeS5jb25kaXRpb24gIT09IGNvbmRpdGlvbiAmJiBjYWxsYmFja0VudHJ5LmNvbmRpdGlvbiAhPT0gJ2Fsd2F5cycpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzdWx0W2tleV0gPSBleGVjdXRlKGNhbGxiYWNrRW50cnkuY2FsbGJhY2spO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlc3VsdCk7XG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgbm9vcCwgUm1Db3JlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvQWJzdHJhY3RDYWNoZURlcGVuZGVuY3lJbnRlcmZhY2UnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbUVudHJ5T3B0aW9ucyxcblx0SXRlbVJlc291cmNlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRDb252ZXJzaW9uTWFwLFxuXHRDcmVhdGVSZXF1ZXN0UGFyYW1ldGVyTWFwLFxuXHREZXJlZ0Z1bmN0aW9uLFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkQ2hhbmdlQ2FsbGJhY2ssXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TGlua0NvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRTdGF0ZUtleVR5cGUsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7XG5cdGNyZWF0ZVBhdGgsXG5cdGhhc1Byb3BlcnRpZXMsXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCxcblx0T25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHRUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGUsXG5cdFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIsXG5cdFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyxcblx0VHJhbnNhY3Rpb25JdGVtSGFuZGxlcixcblx0VHJhbnNhY3Rpb25WYWxpZGF0b3IsXG5cdFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yIH0gZnJvbSAnLi4vQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4uL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV2ZW50SGFuZGxlciB9IGZyb20gJy4vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuXG50eXBlIEl0ZW1SZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHttYWluOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiwgbGlua2VkOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXB9O1xuXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkVycm9yTGV2ZWwge1xuXHR3YXJuaW5nID0gJ3dhcm5pbmcnLFxuXHRlcnJvciA9ICdlcnJvcidcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSBpcyByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZiBuZXdseSBjcmVhdGVkIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9XG4gKiBhbmQge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30sIGFuZCB0aGUgY2hhbmdlcyBvZiBleGlzdGluZyBJdGVtRW50cmllcyBhbmQgQ29sbGVjdGlvbkVudHJpZXMuXG4gKlxuICogVGhlIFRyYW5zYWN0aW9uQ2FjaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSwgd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uJ3MgY2hhbmdlcyBvbiB0aGlzIEl0ZW1FbnRyeVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25DYWNoZVxuXHRleHRlbmRzIEFic3RyYWN0Q2FjaGUge1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQSBtYXAgb2YgYWxsIGl0ZW0gZXJyb3JzLCBjYW4gYmUgcG9wdWxhdGVkIHVzaW5nIHtAbGluayBUcmFuc2FjdGlvblZhbGlkYXRvci5zZXRHbG9iYWxFcnJvciBUcmFuc2FjdGlvblZhbGlkYXRvci5zZXRHbG9iYWxFcnJvcn0gYW5kIHtAbGluayBUcmFuc2FjdGlvblZhbGlkYXRvci5zZXRJdGVtRXJyb3IgVHJhbnNhY3Rpb25WYWxpZGF0b3Iuc2V0SXRlbUVycm9yfS5cblx0ICogQ29udGFpbnMgYSB0cmFuc2xhdGlvbiBhbmQgbGV2ZWwgZm9yIGV2ZXJ5IGVycm9yXG5cdCAqL1xuXHRwdWJsaWMgZXJyb3JzOiB7XG5cdFx0aXRlbToge1xuXHRcdFx0W2l0ZW1FbnRyeUlkOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtjb2x1bW5JZDogc3RyaW5nXToge1xuXHRcdFx0XHRcdFtlcnJvcktleTogc3RyaW5nXToge1xuXHRcdFx0XHRcdFx0ZmllbGRTdHJpbmc6IHN0cmluZyxcblx0XHRcdFx0XHRcdHN0cmluZzogc3RyaW5nLFxuXHRcdFx0XHRcdFx0bGV2ZWw6IFRyYW5zYWN0aW9uRXJyb3JMZXZlbFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2xvYmFsOiB7XG5cdFx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRcdHN0cmluZzogc3RyaW5nLFxuXHRcdFx0XHRsZXZlbDogVHJhbnNhY3Rpb25FcnJvckxldmVsXG5cdFx0XHR9XG5cdFx0fVxuXHR9ID0ge1xuXHRcdGl0ZW06IHt9LFxuXHRcdGdsb2JhbDoge30sXG5cdH07XG5cblx0cHVibGljIGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogU3RvcmVzIHRoZSAncm9vdCcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9LCB0aGlzIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBjYW4gYmUgdXNlZCBhcyByZXF1ZXN0IHBhcmVudCB0byBzdG9yZSB0aGUgd2hvbGUgdHJhbnNhY3Rpb24gYXQgb25jZVxuXHQgKi9cblx0cHVibGljIHJvb3RJdGVtOiBJdGVtRW50cnk8YW55PiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyBhZGRpdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycyBmb3Igd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgc3RvcmVkIHRvIHRoZSBzZXJ2ZXJcblx0ICovXG5cdHB1YmxpYyB0YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSXMgdHJ1ZSB3aGlsZSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gaXMgYXBwbHlpbmcgY2hhbmdlcyB0byB0aGUgcGFyZW50IChjYW4gZWl0aGVyIGJlIHRocm91Z2ggYSBtZXJnZSBvciBhbiBBcGkgc2F2ZSlcblx0ICovXG5cdHB1YmxpYyBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhczpcblx0ICogLSBOZXdseSBjcmVhdGVkIGl0ZW1zXG5cdCAqIC0gUmVtb3ZlZCBpdGVtcyAoZnJvbSBjb2xsZWN0aW9ucylcblx0ICogLSBDaGFuZ2VzIG9uIGV4aXN0aW5nIGl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVGhlIHRyYW5zYWN0aW9uJ3MgcGFyZW50XG5cdCAqL1xuXHRwdWJsaWMgcmVhZG9ubHkgcGFyZW50OiBBYnN0cmFjdENhY2hlO1xuXG5cdHB1YmxpYyByZWFkb25seSBpdGVtSGFuZGxlcjogVHJhbnNhY3Rpb25JdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyByZWFkb25seSBldmVudEhhbmRsZXI6IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yPzogVHJhbnNhY3Rpb25WYWxpZGF0b3I7XG5cdHByaXZhdGUgY2hhbmdlc0ludGVydmFsOiBudWxsIHwgbnVtYmVyID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZGVwZW5kZW5jaWVzOiBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSxcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0cGFyZW50OiBBYnN0cmFjdENhY2hlLFxuXHRcdC8qKlxuXHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdCAqIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcblx0XHQgKi9cblx0XHRwdWJsaWMgaWQ/OiBzdHJpbmcsXG5cdFx0dmFsaWRhdG9yRmFjdG9yeT86IFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRkZXBlbmRlbmNpZXMsXG5cdFx0XHRjb3JlLFxuXHRcdCk7XG5cblx0XHR0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvckZhY3RvcnkgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdDogdmFsaWRhdG9yRmFjdG9yeS5jb25zdHJ1Y3QodGhpcyk7XG5cblx0XHR0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuXHRcdHRoaXMuaXRlbUhhbmRsZXIgPSBuZXcgVHJhbnNhY3Rpb25JdGVtSGFuZGxlcihcblx0XHRcdGRlcGVuZGVuY2llcyxcblx0XHRcdHRoaXMsXG5cdFx0XHR0aGlzLnZhbGlkYXRvcixcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlciA9IG5ldyBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLFxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlcixcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlcixcblx0XHRcdGRlcGVuZGVuY2llcy5leGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGVzdHJveSAoKTogdm9pZCB7XG5cdFx0dGhpcy5wYXJlbnQub25DaGlsZERlc3Ryb3kodGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJGaWVsZENoYW5nZUNhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjYWxsYmFjazogRmllbGRDaGFuZ2VDYWxsYmFjazxJdGVtVHlwZVR5cGU+LFxuXHQpOiBEZXJlZ0Z1bmN0aW9uIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlci5yZWdpc3RlckZpZWxkQ2hhbmdlQ2FsbGJhY2soXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdGNhbGxiYWNrLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ2hhbmdlc0RlbHRhICgpOiBDaGFuZ2VzRGVsdGEge1xuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHR9XG5cblx0cHVibGljIGdldEZpcnN0RXJyb3JTdHJpbmcgKCk6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG5cdFx0Zm9yIChjb25zdCBlcnJvcktleSBpbiB0aGlzLmVycm9ycy5nbG9iYWwpIHtcblx0XHRcdGNvbnN0IGVycm9yID0gdGhpcy5lcnJvcnMuZ2xvYmFsW2Vycm9yS2V5XTtcblxuXHRcdFx0aWYgKGVycm9yLmxldmVsID09PSBUcmFuc2FjdGlvbkVycm9yTGV2ZWwuZXJyb3IpIHtcblx0XHRcdFx0cmV0dXJuIGVycm9yLnN0cmluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIHRoaXMuZXJyb3JzLml0ZW0pIHtcblx0XHRcdGNvbnN0IGl0ZW1FcnJvcnMgPSB0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBpdGVtRXJyb3JzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbHVtbkVycm9ycyA9IGl0ZW1FcnJvcnNbY29sdW1uSWRdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgZXJyb3JLZXkgaW4gY29sdW1uRXJyb3JzKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3IgPSBjb2x1bW5FcnJvcnNbZXJyb3JLZXldO1xuXG5cdFx0XHRcdFx0aWYgKGVycm9yLmxldmVsID09PSBUcmFuc2FjdGlvbkVycm9yTGV2ZWwuZXJyb3IpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlcnJvci5zdHJpbmc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHtAbGluayBUcmFuc2FjdGlvblZhbGlkYXRvciBUcmFuc2FjdGlvblZhbGlkYXRvcn1cblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX3NldEdsb2JhbEVycm9yIChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRpc0ludmFsaWQ6IGJvb2xlYW4sXG5cdFx0c2F2ZUJ1dHRvbkVycm9yVHJhbnNsYXRpb25GbjogKCkgPT4gc3RyaW5nLFxuXHRcdGxldmVsOiBUcmFuc2FjdGlvbkVycm9yTGV2ZWwsXG5cdCk6IHZvaWQge1xuXHRcdGlmICghaXNJbnZhbGlkKSB7XG5cdFx0XHR0aGlzLmNsZWFyR2xvYmFsRXJyb3Ioa2V5KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuZXJyb3JzLmdsb2JhbFtrZXldID0ge1xuXHRcdFx0c3RyaW5nOiBzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuKCksXG5cdFx0XHRsZXZlbDogbGV2ZWwsXG5cdFx0fTtcblxuXHRcdHRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGVDYWxsYmFja3MoXG5cdFx0XHQnb25TZXRHbG9iYWxFcnJvcicsXG5cdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayhcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRsZXZlbCxcblx0XHRcdCksXG5cdFx0XHRmYWxzZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5fc2V0SXNWYWxpZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkge0BsaW5rIFRyYW5zYWN0aW9uVmFsaWRhdG9yIFRyYW5zYWN0aW9uVmFsaWRhdG9yfVxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBfc2V0SXRlbUVycm9yIChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0ZXJyb3JLZXk6IHN0cmluZyxcblx0XHRpc0ludmFsaWQ6IGJvb2xlYW4sXG5cdFx0ZmllbGRFcnJvclRyYW5zbGF0aW9uRm46ICgpID0+IHN0cmluZyxcblx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuOiAoKSA9PiBzdHJpbmcsXG5cdFx0bGV2ZWw6IFRyYW5zYWN0aW9uRXJyb3JMZXZlbCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKCFpc0ludmFsaWQpIHtcblx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0ZXJyb3JLZXksXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y3JlYXRlUGF0aChcblx0XHRcdHRoaXMuZXJyb3JzLml0ZW0sXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0ZXJyb3JLZXksXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZFN0cmluZzogZmllbGRFcnJvclRyYW5zbGF0aW9uRm4oKSxcblx0XHRcdFx0XHRzdHJpbmc6IHNhdmVCdXR0b25FcnJvclRyYW5zbGF0aW9uRm4oKSxcblx0XHRcdFx0XHRsZXZlbDogbGV2ZWwsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdCk7XG5cblx0XHR0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlQ2FsbGJhY2tzKFxuXHRcdFx0J29uU2V0SXRlbUVycm9yJyxcblx0XHRcdGNhbGxiYWNrID0+IGNhbGxiYWNrKFxuXHRcdFx0XHRpdGVtRW50cnlJZCxcblx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdGVycm9yS2V5LFxuXHRcdFx0KSxcblx0XHRcdGZhbHNlLFxuXHRcdCk7XG5cblx0XHR0aGlzLl9zZXRJc1ZhbGlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX3NldElzVmFsaWQgKCk6IHZvaWQge1xuXHRcdHRoaXMuaXNWYWxpZCA9IHRydWU7XG5cblx0XHRmb3IgKGNvbnN0IGVycm9yS2V5IGluIHRoaXMuZXJyb3JzLmdsb2JhbCkge1xuXHRcdFx0Y29uc3QgZXJyb3IgPSB0aGlzLmVycm9ycy5nbG9iYWxbZXJyb3JLZXldO1xuXG5cdFx0XHRpZiAoZXJyb3IubGV2ZWwgPT09IFRyYW5zYWN0aW9uRXJyb3JMZXZlbC5lcnJvcikge1xuXHRcdFx0XHR0aGlzLmlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiB0aGlzLmVycm9ycy5pdGVtKSB7XG5cdFx0XHRjb25zdCBpdGVtRXJyb3JzID0gdGhpcy5lcnJvcnMuaXRlbVtpdGVtRW50cnlJZF07XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gaXRlbUVycm9ycykge1xuXHRcdFx0XHRjb25zdCBjb2x1bW5FcnJvcnMgPSBpdGVtRXJyb3JzW2NvbHVtbklkXTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGVycm9yS2V5IGluIGNvbHVtbkVycm9ycykge1xuXHRcdFx0XHRcdGNvbnN0IGVycm9yID0gY29sdW1uRXJyb3JzW2Vycm9yS2V5XTtcblxuXHRcdFx0XHRcdGlmIChlcnJvci5sZXZlbCA9PT0gVHJhbnNhY3Rpb25FcnJvckxldmVsLmVycm9yKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY2hhbmdlcyBmcm9tIHRoZSBwYXJlbnQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnMsIHRoaXMgYXNzdW1lcyB0aGF0IGFuIGFjdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gYSBwYXJlbnQsIHNvIGl0IGRvZXMndCBoYW5kbGUgY3JlYXRlZCBlbnRyaWVzXG5cdCAqIGFuZCByZW1vdmVzIGVudHJpZXMgdGhhdCB3ZXJlIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtcyBkZWxldGVkSXRlbXN9IHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZGVsZXRlZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50fSBhbmQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBhc3N1bWVzXG5cdCAqIHRoZSBjaGFuZ2UgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIGFuZCBhcHBseUNoYW5nZXNEZWx0YSB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZXMgb25jZSB5b3Ugc2F2ZSB0aGUgdHJhbnNhY3Rpb25cblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX0gaWYgeW91IHdhbnQgdG8gYXBwbHkgY2hhbmdlcyBmcm9tIG91dHNpZGUgdGhlIGNvcmVcblx0ICpcblx0ICogQHBhcmFtIGludGVybmFsQ2hhbmdlc0RlbHRhIENoYW5nZXMgdG8gYmUgYXBwbGllZFxuXHQgKiBAcGFyYW0gaXNDYWxsZWRBZnRlckFwaVNhdmUgSWYgJ2lzQ2FsbGVkQWZ0ZXJBcGlTYXZlJyBpcyB0cnVlIGxvY2FsIGNoYW5nZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4gKGluc3RlYWQgb2Ygb25seSB3aGVuIHRoZXJlIGFyZSBubyBjaGFuZ2VzKVxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgKFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0Ly8gV2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIGNyZWF0ZWQgaXRlbXMsIGJlc2lkZXMgY2hlY2tpbmcgaWYgdGhleSBmaXQgaW4gY29sbGVjdGlvbnNcblx0XHQvLyBjcmVhdGluZyBlbnRyaWVzIGlzIGFscmVhZHkgZG9uZSBieSBgYXBwbHlDaGFuZ2VzRGVsdGFgIG9uIGEgcGFyZW50IHRyYW5zYWN0aW9uXG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBpbmRleCA9IHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0uaW5kZXhPZihpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYgYW4gaXRlbSBpcyBkZWxldGVkIG9uIGFub3RoZXIgY2FjaGUgd2Ugc2hvdWxkbid0IGF0dGVtcHQgYW5vdGhlciByZXF1ZXN0LCBzbyB3ZSByZW1vdmUgaXQgZnJvbSB0aGUgdG8tYmUtZGVsZXRlZCBhcnJheVxuXHRcdFx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXS5zcGxpY2UoXG5cdFx0XHRcdFx0XHRcdGluZGV4LFxuXHRcdFx0XHRcdFx0XHQxLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB3ZSBjb3VsZCBhcHBseSB0aGUgY2hhbmdlcyB0byBjaGlsZHJlbiB3aGlsZSB0aGUgcHJvbWlzZSBpcyBydW5uaW5nXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBkbyB3ZSB3YW50IHRoaXM/IE1heWJlIGFmdGVyIG1lcmdpbmcgdGhlIHNlcnZlciBjaGFuZ2VzIHRoZXJlJ3Mgbm8gY2hhbmdlcyBhbnltb3JlXG5cdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdFx0dGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG5cblx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5jbGVhckdsb2JhbEVycm9yKCk7XG5cdFx0XHR0aGlzLnZhbGlkYXRvci52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIGNoYW5nZXMgdG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgaXRzIGNoaWxkcmVuXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKlxuXHQgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9IGFuZCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YX0gaXMgdGhhdCBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGFzc3VtZXNcblx0ICogdGhlIGNoYW5nZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCwgYW5kIGFwcGx5Q2hhbmdlc0RlbHRhIHdpbGwgcHJvY2VzcyB0aGUgY2hhbmdlcyBpdHNlbGYgKHJlc3VsdCB2cyBjYXVzZSlcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIERpZmZlcnMgZnJvbSB7QGxpbmsgU2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEgU2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGluIHRoZSBoYW5kbGluZyBvZiBkZWxldGVkIGVudHJpZXMgYW5kIHRoZSBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGNhbGxcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKGNoYW5nZXNEZWx0YS5pc0VtcHR5KCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdFx0cm9sbGJhY2s6IG5vb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hVcGRhdGVkRGVyaXZlZFZhbHVlc0Zyb21EZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtyZXN1bHQsIGludGVybmFsQ2hhbmdlc0RlbHRhLCByb2xsYmFja0Z1bmN0aW9uc30gPSBzdXBlci5fYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9sZENoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeS5pZF07XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSBpbiB0aGUgYXJyYXkgP1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9sZENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdFx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0Y2hpbGQuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChpbnRlcm5hbENoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gZG8gd2Ugd2FudCB0aGlzPyBNYXliZSBhZnRlciBtZXJnaW5nIHRoZSBzZXJ2ZXIgY2hhbmdlcyB0aGVyZSdzIG5vIGNoYW5nZXMgYW55bW9yZSwgY291bGQgYmUgYSBwZXJmb3JtYW5jZSB0aGluZ3lcblx0XHRcdFx0XHR0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLmRldGVjdENoYW5nZXMoKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnZhbGlkYXRvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnZhbGlkYXRvci52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0U2VydmVyQ2FjaGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnQgZnJvbSB0aGUgY2xvc2VzdCB0cmFuc2FjdGlvblxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbUVudHJ5IFRoZSBlbnRyeSB0byBnZXQgdGhlIHBhcmVudCBmcm9tXG5cdCAqIEBwYXJhbSBmcm9tSW5pdGlhbCBJZiBgdHJ1ZWAgdGhlIHBhcmVudCB2YWx1ZXMgd2lsbCBiZSByZWFkIGZyb20ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcy5pbml0aWFsIGluaXRpYWx9IChVc2VmdWwgZm9yIHdoZW4geW91J3ZlIG1vdmVkIGFuIGVudHJ5KVxuXHQgKiBAcGFyYW0gcHJvdmlkZWRGaWVsZHMgVXNlIHRoZSBwcm92aWRlZCBmaWVsZHMgaW5zdGVhZCBvZiB0aGUgY2FjaGVkIGZpZWxkcywgdXNlZCBieSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFVzZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fSBpbnN0ZWFkIG9mIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudH0gaWYgeW91J3JlIGdldHRpbmcgdGhlIHBhcmVudCBpbiB0aGUgb25SZW1vdmUgY2FsbGJhY2tcblx0ICovXG5cdC8vIHRvZG9bY2FjaGVdIHJlbmFtZSB0byBnZXRJdGVtUGFyZW50IG9yIGdldFBhcmVudE9iamVjdD9cblx0cHVibGljIGdldFBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZnJvbUluaXRpYWw6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRwcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0bGV0IGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChwcm92aWRlZEZpZWxkcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmaWVsZHMgPSBwcm92aWRlZEZpZWxkcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY2hhbmdlc1R1cGxlID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRpZiAoY2hhbmdlc1R1cGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZmllbGRzID0gY2hhbmdlc1R1cGxlW2Zyb21Jbml0aWFsID8gJ2luaXRpYWwnIDogJ2NoYW5nZXMnXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZmllbGRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldFBhcmVudChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGZyb21Jbml0aWFsLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeVtdIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmdldExvY2FsQ29sbGVjdGlvbkVudHJ5KGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYWxsZWQgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSB3aXRoIGEgY29sbGVjdGlvbkVudHJ5SWQgdGhhdCBpc24ndCBjYWNoZWRgKTtcblx0XHR9XG5cblx0XHRsZXQgY29sbGVjdGlvbkNoYW5nZXMgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmdldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25DaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbGxlY3Rpb25DaGFuZ2VzID0gdGhpcy5wYXJlbnRcblx0XHRcdFx0LmdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkoY29sbGVjdGlvbkVudHJ5SWQpXG5cdFx0XHRcdC5zbGljZSgpO1xuXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLnNldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRcdGNvbGxlY3Rpb25DaGFuZ2VzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29sbGVjdGlvbkNoYW5nZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgdHJhbnNhY3Rpb24gY2hhaW4gYW5kIHJldHVybnMgdGhlIGNoYW5nZXMgb2YgdGhlIGl0ZW0gb24gdGhlIGZpcnN0IHRyYW5zYWN0aW9uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb3B5RmllbGRzIElmIHNldCwgd2lsbCBjYWxsIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBBcGlGb3JtYXR0ZXIuY29weUZpZWxkc30sIG90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXMuY2hhbmdlcztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0Y29weUZpZWxkcyxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZX0gZnJvbSB0aGUgdHJhbnNhY3Rpb24sIHByZXZlbnRpbmcgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2Uub3B0aW9ucy5vbkFkZCBvbkFkZH0gYW5kIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2Uub3B0aW9ucy5vblJlbW92ZSBvblJlbW92ZX0gY2FsbGJhY2tzIGZyb20gYmVpbmcgY2FsbGVkLlxuXHQgKiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIgbmVlZGVkXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogRG9lcyBub3QgcmVtb3ZlIGNoYW5nZXNcblx0ICovXG5cdHB1YmxpYyBjbGVhckNvbGxlY3Rpb25SZXNvdXJjZSAocmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZSk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmNsZWFyUmVzb3VyY2UocmVzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5yb290SXRlbSByb290SXRlbX0gaXMgdXNlcyBsb2Nrc1xuXHQgKi9cblx0cHVibGljIGlzTG9ja2FibGUgKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLnJvb3RJdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yb290SXRlbS5pc0xvY2thYmxlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIERpc2FibGVzIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMgd2F0Y2hlciwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNoYW5nZXMgb24gaXRlbXNcblx0ICovXG5cdHB1YmxpYyBkaXNhYmxlQ2hhbmdlc1dhdGNoZXIgKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNoYW5nZXNJbnRlcnZhbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNsZWFySW50ZXJ2YWwodGhpcy5jaGFuZ2VzSW50ZXJ2YWwpO1xuXHRcdHRoaXMuY2hhbmdlc0ludGVydmFsID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRW5hYmxlcyB0aGUgdHJhbnNhY3Rpb24ncyBjaGFuZ2VzIHdhdGNoZXIsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGRldGVjdCBjaGFuZ2VzIG9uIGl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgZW5hYmxlQ2hhbmdlc1dhdGNoZXIgKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNoYW5nZXNJbnRlcnZhbCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnQ2hhbmdlcyB3YXRjaGVyIGFscmVhZHkgcnVubmluZyEnLFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0KTtcblx0XHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jaGFuZ2VzSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGlmICghdGhpcy5kZXRlY3RDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmRpc2FibGVDaGFuZ2VzV2F0Y2hlcigpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmlzTG9ja2FibGUoKSkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmxvY2tTZXJ2aWNlLmZldGNoTG9jayh0aGlzLnJvb3RJdGVtISk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQzMDAwLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFNhdmVzIHRoZSB0cmFuc2FjdGlvbiwgdGhpcyBoYXMgYSBkaWZmZXJlbnQgZWZmZWN0IGRlcGVuZGluZyBvbiB0aGUgdHJhbnNhY3Rpb24ncyBwYXJlbnQuXG5cdCAqXG5cdCAqIC0gSWYgdGhlIHBhcmVudCBpcyBhbm90aGVyIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IGl0IHdpbGwgbWVyZ2UgdGhlIGNoYW5nZXMgb2YgdGhlIGNoaWxkIHRyYW5zYWN0aW9uIGluIHRoZSB0aGUgcGFyZW50IHRyYW5zYWN0aW9uXG5cdCAqIC0gSWYgdGhlIHBhcmVudCBpcyB0aGUge0BsaW5rIFNlcnZlckNhY2hlIFNlcnZlckNhY2hlfSBpdCB3aWxsIHNhdmUgdGhlIGNoYW5nZXMgdG8gdGhlIEFQaVxuXHQgKi9cblx0cHVibGljIHNhdmUgKFxuXHRcdGNsb3NlVGFiID0gZmFsc2UsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUmVxdWVzdFBhcmFtZXRlck1hcCA9IHt9LFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5pc1NhdmluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QoKTtcblx0XHR9XG5cblx0XHR0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRsZXQgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLmlzTG9ja2FibGUoKVxuXHRcdFx0XHQ/IHRoaXMuZGVwZW5kZW5jaWVzLmxvY2tTZXJ2aWNlLmZldGNoTG9jayh0aGlzLnJvb3RJdGVtISlcblx0XHRcdFx0OiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKClcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlQ2FsbGJhY2tzKFxuXHRcdFx0XHRcdFx0J29uQmVmb3JlU2F2ZScsXG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayh0aGlzKSxcblx0XHRcdFx0XHRcdGNsb3NlVGFiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMudGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucGFyZW50LmFwcGx5Q2hhbmdlc0Zyb21DaGlsZChcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfaXRlbUlkQ29udmVyc2lvbk1hcCA9PiB7XG5cdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbk1hcCA9IF9pdGVtSWRDb252ZXJzaW9uTWFwO1xuXG5cdFx0XHRcdFx0dGhpcy50YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5sb2NrU2VydmljZS5jbGVhckxvY2sodGhpcy5yb290SXRlbSEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGVDYWxsYmFja3MoXG5cdFx0XHRcdFx0XHQnb25TYXZlU3VjY2VzcycsXG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRjbG9zZVRhYixcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRpZiAoIWNsb3NlVGFiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW1JZENvbnZlcnNpb25NYXA7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGRldGVjdENoYW5nZXMgKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLmhhc0NoYW5nZXMpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRldGVjdENoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGFzQ2hhbmdlcyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGFuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSB0aHJvdWdoIGFuIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSB3aGljaCBtZWFucyB0aGF0IGNoYW5nZXMgb24gdGhpcyBlbnRyeSB3aWxsIG5vIGxvbmdlciBiZSB0cmFja2VkLlxuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbSAoaXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8YW55Pik6IHZvaWQge1xuXHRcdHRoaXMuY2xlYXJJdGVtRW50cnkoaXRlbVJlc291cmNlLmVudHJ5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gZnJvbSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gd2hpY2ggbWVhbnMgdGhhdCBjaGFuZ2VzIG9uIHRoaXMgZW50cnkgd2lsbCBubyBsb25nZXIgYmUgdHJhY2tlZC5cblx0ICovXG5cdHB1YmxpYyBjbGVhckl0ZW1FbnRyeSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyLmNsZWFySXRlbUVudHJ5KGl0ZW1FbnRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gdGhyb3VnaCBhIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSB3aGljaCBtZWFucyB0aGF0IGNoYW5nZXMgb24gdGhpcyBjb2xsZWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGJlIHRyYWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJDb2xsZWN0aW9uIChjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxhbnk+KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY2xlYXJFbnRyeShjb2xsZWN0aW9uUmVzb3VyY2UuZW50cnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGZpcmUgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBzYXZlZCwgcmVqZWN0aW5nIHRoaXMgY2FsbGJhY2sgd2lsbCBwcmV2ZW50IHRoZSB0cmFuc2FjdGlvbiBmcm9tIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIG9uQmVmb3JlU2F2ZSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbJ29uQmVmb3JlU2F2ZSddLFxuXHRcdGNvbmRpdGlvbj86IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbixcblx0XHRwcmlvcml0eT86IG51bWJlcixcblx0KTogKCkgPT4gdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuZXZlbnRIYW5kbGVyLnJlZ2lzdGVyQ2FsbGJhY2soXG5cdFx0XHQnb25CZWZvcmVTYXZlJyxcblx0XHRcdGtleSxcblx0XHRcdGNhbGxiYWNrLFxuXHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0cHJpb3JpdHksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQWRkcyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBmaXJlIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIHNhdmVkIHN1Y2Nlc3NmdWxseVxuXHQgKi9cblx0cHVibGljIG9uU2F2ZVN1Y2Nlc3MgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlWydvblNhdmVTdWNjZXNzJ10sXG5cdFx0Y29uZGl0aW9uPzogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRcdHByaW9yaXR5PzogbnVtYmVyLFxuXHQpOiAoKSA9PiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIucmVnaXN0ZXJDYWxsYmFjayhcblx0XHRcdCdvblNhdmVTdWNjZXNzJyxcblx0XHRcdGtleSxcblx0XHRcdGNhbGxiYWNrLFxuXHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0cHJpb3JpdHksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyBhIHtAbGluayBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHQgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uUmVzdWx0fSBmb3IgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TW9kdWxlQ2hhbmdlcyAoKTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uUmVzdWx0IHtcblx0XHRpZiAodGhpcy5yb290SXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIHJvb3QgaXRlbSBmb3IgdHJhbnNhY3Rpb24gY2FjaGUgJyArIHRoaXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KHRoaXMpXG5cdFx0XHQucHJvY2VzcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBwYXNzZWQgbWFwIHdpdGggdGhlIG5ldyB7QGxpbmsgQ29udmVyc2lvbk1hcCBDY29udmVyc2lvbk1hcH0gdmFsdWVzXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlSXRlbUlkTWFwIChcblx0XHRjb2xsZWN0aW9uTWFwOiB7W2l0ZW1JZDogbnVtYmVyXTogYW55fSxcblx0XHRjb252ZXJzaW9uTWFwOiBDb252ZXJzaW9uTWFwLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoY29udmVyc2lvbk1hcCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBvbGRJZCBpbiBjb252ZXJzaW9uTWFwKSB7XG5cdFx0XHRjb25zdCBuZXdJZCA9IGNvbnZlcnNpb25NYXBbb2xkSWRdO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbk1hcFtvbGRJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29sbGVjdGlvbk1hcFtuZXdJZF0gPSBjb2xsZWN0aW9uTWFwW29sZElkXTtcblx0XHRcdGRlbGV0ZSBjb2xsZWN0aW9uTWFwW29sZElkXTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQucXVlcnkoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0e1tsaW5rVHlwZV06IFsnaWQnXX0sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmdldExpbmtDb2xsZWN0aW9ucyhcblx0XHRcdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UubGlua3NbbGlua1R5cGVdLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uc0Zyb21EZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGRlZmluaXRpb246IExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRsaW5rSWRBcnJheSxcblx0XHRcdFx0ZGVmaW5pdGlvbi5pdGVtVHlwZSxcblx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLmVudHJ5LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXMoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cmllcyxcblx0XHRcdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5yZXNvdXJjZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5mZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0bGlua0lkQXJyYXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoY29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25Gcm9tRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0ZGVmaW5pdGlvbjogQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGRlZmluaXRpb24uaXRlbVR5cGUsXG5cdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5lbnRyeSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRlbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRcdFx0ZW50cnksXG5cdFx0XHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMucmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRlbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRcdFx0ZW50cnksXG5cdFx0XHRcdFx0XHRuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRlbnRyeTogbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyksIC8vIHdlIG5lZWQgdGhlIGRlZmF1bHQgY29sdW1uIHZhbHVlXG5cdFx0XHRcdHJlc291cmNlOiBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdH0sXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnNEZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGxpbmtGaWVsZDogc3RyaW5nLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0bGlua0ZpZWxkOiBsaW5rRmllbGQsXG5cdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdGVudHJ5OiBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSwgLy8gd2UgbmVlZCB0aGUgZGVmYXVsdCBjb2x1bW4gdmFsdWVcblx0XHRcdFx0cmVzb3VyY2U6IG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSBnZXRJdGVtQnlJZC9nZXROZXdSZXNvdXJjZVdpdGhJZFxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiBzdGF0ZUtleSBjYW4gYmUgYSBrZXl3b3JkIG9yIGEgbG9jYWwgaWQgKGluIGNhc2Ugb2YgYSByZWZyZXNoKVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHBhcnNlZFN0YXRlS2V5ID0gdGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5wYXJzZVN0YXRlS2V5KHN0YXRlS2V5IGFzIHN0cmluZyk7XG5cblx0XHRpZiAocGFyc2VkU3RhdGVLZXkgPT09IG51bGwpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IHN0YXRlS2V5IGFzIEl0ZW1JZDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKVxuXHRcdFx0XHR8fCB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXNcblx0XHRcdFx0XHQuY29udGFpbnMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0SXRlbUJ5SWQoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0aXNSb290LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocGFyc2VkU3RhdGVLZXkudHlwZSA9PT0gU3RhdGVLZXlUeXBlLkR1cGxpY2F0ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0RHVwbGljYXRlQnlJZChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHBhcnNlZFN0YXRlS2V5Lml0ZW1JZCBhcyBJdGVtSWQsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpc1Jvb3QsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldER1cGxpY2F0ZUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGR1cGxpY2F0ZUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPiB8IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zLml0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMuaXRlbSA9IGR1cGxpY2F0ZUlkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlV2l0aElkKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmdldExvY2FsRHVwbGljYXRlSWQoKSxcblx0XHRcdG9wdGlvbnMgYXMgSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0XHRyZXR1cm5MaW5rcyxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBQYXJ0aWFsPEl0ZW1FbnRyeU9wdGlvbnM+LFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBQYXJ0aWFsPEl0ZW1FbnRyeU9wdGlvbnM+LFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2VXaXRoSWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz4sXG5cdFx0cmV0dXJuTGlua3M6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4gfCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaE5ld0l0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0ZGVsdGFSZXN1bHQgPT4ge1xuXHRcdFx0XHRcdGxldCBtYWluRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGxpbmtlZEVudHJpZXNNYXA6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZGVsdGFSZXN1bHQuY3JlYXRlZCkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUgPT09IGl0ZW1UeXBlXG5cdFx0XHRcdFx0XHRcdCYmIGl0ZW1FbnRyeS5pdGVtSWQgPT09IGl0ZW1JZFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1haW5FbnRyeSA9IGl0ZW1FbnRyeTtcblxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsaW5rZWRFbnRyaWVzTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChtYWluRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgSXRlbUVudHJ5IHdpdGggdGhlIHJlcXVlc3RlZCBJdGVtSWQgd2FzIG5vdCBpbiB0aGUgdGVtcGxhdGUgcmVzcG9uc2UnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBtYWluID0gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0XHRcdG1haW5FbnRyeSxcblx0XHRcdFx0XHRcdGlzUm9vdCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmICghcmV0dXJuTGlua3MpIHtcblx0XHRcdFx0XHRcdHJldHVybiBtYWluO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRtYWluOiBtYWluLFxuXHRcdFx0XHRcdFx0bGlua2VkOiB0aGlzLnByb2Nlc3NMaW5rZWRJdGVtcyhcblx0XHRcdFx0XHRcdFx0bGlua2VkRW50cmllc01hcCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgbmV3IEl0ZW1FbnRyeSBhbmQgcmVzb3VyY2Vcblx0ICovXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogUGFydGlhbDxJdGVtRW50cnlPcHRpb25zPiA9IHt9LFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4gfCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlV2l0aElkKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRyZXR1cm5MaW5rcyxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG11bHRpcGxlIGl0ZW1zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz4gPSB7fSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG11bHRpcGxlIGl0ZW1zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1zQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogUGFydGlhbDxJdGVtRW50cnlPcHRpb25zPiA9IHt9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4ge1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkcyxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGl0ZW0gd2l0aCB0aGUgY2hhbmdlcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn1cblx0ICpcblx0ICogQHBhcmFtIGlzUm9vdCBTZXRzIHRoZSBpdGVtIGFzIHRoZSByb290IGl0ZW0gb2YgdGhlIHRyYW5zYWN0aW9uLCBuZXcgaXRlbXMgd2lsbCBiZSBsaW5rZWQgdG8gdGhpcyBpdGVtIChpZiB0aGVyZSdzIGEgY29ubmVjdGlvbiBpbiB0aGUgTGlua1RyZWUpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz4gPSB7fSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2UoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIHRpdGxlIG9mIGFuIGl0ZW0sIGRvZXMgbm90IGNyZWF0ZSBhbiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX1cblx0ICovXG5cdHB1YmxpYyBmZXRjaFRpdGxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZmV0Y2hUaXRsZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoaWxkIFRyYW5zYWN0aW9uIGludG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgdGhlbiBwcm9wYWdhdGVzIHRoZW0gdG8gdGhlIG90aGVyIGNoaWxkIHRyYW5zYWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0Y2hpbGRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRfYnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRfb25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMuZGVwZW5kZW5jaWVzLmxpbmtUcmVlU2VydmljZS5nZXQoKTtcblx0XHRjb25zdCBpbnRlcm5hbENoYW5nZXNEZWx0YSA9IGNoaWxkVHJhbnNhY3Rpb24uZ2V0RGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHQvLyBCaXQgb2YgYSBoYWNrLCBidXQgd2hlbiBtZXJnaW5nIHRyYW5zYWN0aW9ucyB3ZSB3YW50IHRvIGhhbmRsZSBtb3ZlcyBhcyB1cGRhdGVzXG5cdFx0XHQvLyBXZSBvbmx5IHdhbnQgdGhlIG1vdmVzIGluIHRoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBkbyBhIGxpbmtUbyByZXF1ZXN0IHdoZW4gc2F2aW5nIHRvIHRoZSBBUElcblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHR1cGxlLnRvLFxuXHRcdFx0KTtcblxuXHRcdFx0ZGVsZXRlIGludGVybmFsQ2hhbmdlc0RlbHRhLm1vdmVkW2l0ZW1FbnRyeUlkXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdID0gdGhpcy5pdGVtSGFuZGxlci5jb3B5VHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHRcdGNoaWxkVHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdLFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0XHR0dXBsZSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmFkZCh0dXBsZS5lbnRyeSk7XG5cdFx0XHRjaGlsZFRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIodHVwbGUuZW50cnkpO1xuXG5cdFx0XHRjb25zdCBsb2NhbENoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW3R1cGxlLmVudHJ5LmlkXSA9IHRoaXMuaXRlbUhhbmRsZXIuY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0Y2hpbGRUcmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgbmV3RGlzcGxheU5hbWUgPSB0aGlzLmRlcGVuZGVuY2llcy5pdGVtRW50cnlTZXJ2aWNlLmdldERpc3BsYXlOYW1lKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAobmV3RGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5kaXNwbGF5bmFtZSA9IG5ld0Rpc3BsYXlOYW1lO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5yb290SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IGxpbmtOb2RlID0gbGlua1RyZWVbdGhpcy5yb290SXRlbS5pdGVtVHlwZV1bdHVwbGUuZW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGlmIChsaW5rTm9kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtOb2RlLnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5JVEVNVEFCTEUpIHtcblx0XHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLml0ZW10eXBlID0gdGhpcy5yb290SXRlbS5pdGVtVHlwZTtcblx0XHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLml0ZW0gPSB0aGlzLnJvb3RJdGVtLml0ZW1JZDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtOb2RlLnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzW2xpbmtOb2RlLmZpZWxkXSA9IHRoaXMucm9vdEl0ZW0uaXRlbUlkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHQvLyBpZiBhbiBpdGVtRW50cnkgd2FzIGEgbG9jYWwgZW50cnkgb24gYSBjaGlsZCB0cmFuc2FjdGlvbiwgaXQncyBpbXBvc3NpYmxlIHRoYXQgaXQgaXMgb24gdGhpcyB0cmFuc2FjdGlvblxuXHRcdFx0XHRpZiAoaXRlbUVudHJ5LmlzTG9jYWwoKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0dGhpcy5jbGVhckl0ZW1FcnJvcihcblx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5oYXNDaGFuZ2VzID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEl0ZW1zRnJvbURlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdFx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0aWYgKGNoaWxkID09PSBjaGlsZFRyYW5zYWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhpcy52YWxpZGF0b3IudmFsaWRhdGVUcmFuc2FjdGlvbigpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpbnRlcm5hbENoYW5nZXNEZWx0YS5pdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBhbHJlYWR5IGNhY2hlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjaGFuZ2VzIG9mIHRoaXMgc3BlY2lmaWMgdHJhbnNhY3Rpb24gZm9yIHRoYXQgZW50cnlcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZ2V0TG9jYWxJdGVtRW50cnkoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIGdldCBhIGxvY2FsIEl0ZW1FbnRyeSB3aXRoIGVudHJ5SWQgJyR7aXRlbUVudHJ5SWR9JyBidXQgY291bGRuJ3QgZmluZCBpdGApO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0Y2hhbmdlczogdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUsIGRvZXNuJ3QgZG8gYSBBUEkgcmVxdWVzdCwgdXNlZCBmb3Igc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5RW50cnlJZChpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUgYnkgSXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gQ29sbGVjdGlvbkVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5QnlRdWVyeVN0cmluZyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5UXVlcnlTdHJpbmcoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5nZXRMb2NhbENvbGxlY3Rpb25FbnRyeUJ5UXVlcnlTdHJpbmcoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gQ29sbGVjdGlvbkVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IG9mIHRoZSBUcmFuc2FjdGlvbkNhY2hlLCB0aGlzIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IHRoZSBlbmQgcmVzdWx0IChpbml0aWFsIGlzIGNvbXBhcmVkIHRvIGNoYW5nZXMpLCBzbyBjaGFuZ2luZyBzb21ldGhpbmcgYW5kIHJldmVydGluZyBpdFxuXHQgKiB3b24ndCBiZSBpbmNsdWRlZFxuXHQgKi9cblx0cHVibGljIGdldERlbHRhICgpOiBJbnRlcm5hbENoYW5nZXNEZWx0YSB7XG5cdFx0Y29uc3QgaW50ZXJuYWxDaGFuZ2VzRGVsdGEgPSB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKE51bWJlcihpdGVtRW50cnlJZCkpO1xuXG5cdFx0XHQvLyBBbiBpdGVtIGNhbiBiZSB1c2VkIGJ5IGEgMm5kKyBsZXZlbCBjaGlsZCBUcmFuc2FjdGlvbkNhY2hlLCBpdCB3aWxsIGJlIGxvY2FsIHRoYW4gYnV0IGl0IHNob3VsZCBvbmx5IGNvdW50IGFzIGEgY3JlYXRlXG5cdFx0XHQvLyBvbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBhY3R1YWxseSBjcmVhdGVkIHRoZSBlbnRyeVxuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY29udGFpbnMoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpXG5cdFx0XHRcdCYmIHR1cGxlLmVudHJ5LmlzTG9jYWwoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1JZCA9IHR1cGxlLmNoYW5nZXMuY2hhbmdlcy5pZDtcblxuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG5ld1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdQYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3Qgb2xkUGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IXRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdFx0XHRvbGRQYXJlbnQsXG5cdFx0XHRcdFx0XHRuZXdQYXJlbnQsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Ly8gaGFzQ2hhbmdlcyBvbmx5IHRha2VzIHdyaXRhYmxlIGNvbHVtbnMgaW50byBhY2NvdW50IGJ5IGRlZmF1bHQsIHNvIGp1c3QgbW92aW5nIHNvbWV0aGluZyBkb2Vzbid0IGNvdW50IGFzIGFuIHVwZGF0ZVxuXHRcdFx0XHQhdGhpcy5kZXBlbmRlbmNpZXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHR0dXBsZS5lbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXMpIHtcblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1zRGVsZXRlZCh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbnRlcm5hbENoYW5nZXNEZWx0YTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIG1vdmUgdG8gVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRpc1Jvb3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAoaXNSb290KSB7XG5cdFx0XHR0aGlzLnJvb3RJdGVtID0gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0ge1xuXHRcdFx0XHRpbml0aWFsOiB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoaXRlbUVudHJ5LmlkKSxcblx0XHRcdFx0Y2hhbmdlczogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KGl0ZW1FbnRyeS5pZCksXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc291cmNlID0gdGhpcy5kZXBlbmRlbmNpZXMuaXRlbVJlc291cmNlRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXNOZXcsXG5cdFx0KTtcblxuXHRcdHJldHVybiByZXNvdXJjZTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0KTogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRcdFx0aW5pdGlhbDogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGNoYW5nZXM6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLmRlcGVuZGVuY2llcy5pdGVtUmVzb3VyY2VGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0KTtcblxuXHRcdFx0cmVzdWx0LnB1c2gocmVzb3VyY2UpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc0xpbmtlZEl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua2VkRW50cmllczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+LFxuXHQpOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXA8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCByZXN1bHQ6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rZWRFbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHRbaXRlbVR5cGVdID0gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRsaW5rZWRFbnRyaWVzW2l0ZW1UeXBlXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLmRlcGVuZGVuY2llcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdHJlc291cmNlT3B0aW9ucyxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuYWRkUmVzb3VyY2UocmVzb3VyY2UpO1xuXG5cdFx0cmV0dXJuIHJlc291cmNlO1xuXHR9XG5cblx0cHVibGljIGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIGNoYW5nZXNPYmplY3QuY2hhbmdlcztcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbcGFyZW50SWQ6IHN0cmluZ106IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cmllc1twYXJlbnRJZF0sXG5cdFx0XHRcdHJlc291cmNlT3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbGwgcmVxdWlyZWQgY29sdW1ucyB0byBtYXRjaC9maXQgaW4gY29sbGVjdGlvbnNcblx0ICovXG5cdHByaXZhdGUgZXhwYW5kSXRlbXNGcm9tRGVsdGEgKGRlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W11bXT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1FbnRyeVtdfSA9IHt9O1xuXHRcdGNvbnN0IGNvbHVtbnNQZXJJdGVtVHlwZU1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9ID0ge307XG5cblx0XHRjb25zdCBhZGRFbnRyeSA9XG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRpZiAoaXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5kZXBlbmRlbmNpZXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb2x1bW5zUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdID0gY29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxJdGVtRW50cnlbXT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNvbHVtbnNQZXJJdGVtVHlwZU1hcCkge1xuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5leHBhbmRMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdGRlbHRhLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuY29sdW1uQ2FjaGVcblx0XHRcdFx0XHRcdC5yZXRyaWV2ZShcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQuY2FjaGVkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxuXG5cdHByaXZhdGUgY2xlYXJHbG9iYWxFcnJvciAoXG5cdFx0a2V5Pzogc3RyaW5nLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjbGVhckVycm9yID1cblx0XHRcdGNsZWFyS2V5ID0+IHtcblx0XHRcdFx0dGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHQnb25DbGVhckdsb2JhbEVycm9yJyxcblx0XHRcdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayhcblx0XHRcdFx0XHRcdGNsZWFyS2V5LFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVycm9yS2V5IGluIHRoaXMuZXJyb3JzLmdsb2JhbCkge1xuXHRcdFx0XHRjbGVhckVycm9yKGVycm9yS2V5KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lcnJvcnMuZ2xvYmFsID0ge307XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNsZWFyRXJyb3Ioa2V5KTtcblxuXHRcdFx0ZGVsZXRlIHRoaXMuZXJyb3JzLmdsb2JhbFtrZXldO1xuXHRcdH1cblxuXHRcdHRoaXMuX3NldElzVmFsaWQoKTtcblx0fVxuXG5cdHByaXZhdGUgY2xlYXJJdGVtRXJyb3IgKFxuXHRcdGl0ZW1FbnRyeUlkPzogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvbHVtbklkPzogc3RyaW5nLFxuXHRcdGVycm9yS2V5Pzogc3RyaW5nLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjbGVhckl0ZW1FcnJvciA9IChcblx0XHRcdGNsZWFySXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRcdGNsZWFyQ29sdW1uSWQ6IHN0cmluZyxcblx0XHRcdGNsZWFyRXJyb3JLZXk6IHN0cmluZyxcblx0XHQpID0+IHtcblx0XHRcdHRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGVDYWxsYmFja3MoXG5cdFx0XHRcdCdvbkNsZWFySXRlbUVycm9yJyxcblx0XHRcdFx0Y2FsbGJhY2sgPT4gY2FsbGJhY2soXG5cdFx0XHRcdFx0Y2xlYXJJdGVtRW50cnlJZCxcblx0XHRcdFx0XHRjbGVhckNvbHVtbklkLFxuXHRcdFx0XHRcdGNsZWFyRXJyb3JLZXksXG5cdFx0XHRcdCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblxuXHRcdFx0ZGVsZXRlIHRoaXMuZXJyb3JzLml0ZW1bY2xlYXJJdGVtRW50cnlJZF1bY2xlYXJDb2x1bW5JZF1bY2xlYXJFcnJvcktleV07XG5cdFx0fTtcblxuXHRcdGlmIChpdGVtRW50cnlJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZXJJdGVtRW50cnlJZCBpbiB0aGlzLmVycm9ycy5pdGVtKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW1FcnJvcnMgPSB0aGlzLmVycm9ycy5pdGVtW2l0ZXJJdGVtRW50cnlJZF07XG5cblx0XHRcdFx0Zm9yIChjb25zdCBpdGVyQ29sdW1uSWQgaW4gaXRlbUVycm9ycykge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkVycm9ycyA9IGl0ZW1FcnJvcnNbaXRlckNvbHVtbklkXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlckVycm9yS2V5IGluIGNvbHVtbkVycm9ycykge1xuXHRcdFx0XHRcdFx0Y2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0XHRcdE51bWJlcihpdGVySXRlbUVudHJ5SWQpLFxuXHRcdFx0XHRcdFx0XHRpdGVyQ29sdW1uSWQsXG5cdFx0XHRcdFx0XHRcdGl0ZXJFcnJvcktleSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXJyb3JzLml0ZW0gPSB7fTtcblx0XHRcdHRoaXMuX3NldElzVmFsaWQoKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBpdGVtRXJyb3JzID0gdGhpcy5lcnJvcnMuaXRlbVtpdGVtRW50cnlJZF07XG5cblx0XHRcdGZvciAoY29uc3QgaXRlckNvbHVtbklkIGluIGl0ZW1FcnJvcnMpIHtcblx0XHRcdFx0Y29uc3QgY29sdW1uRXJyb3JzID0gaXRlbUVycm9yc1tpdGVyQ29sdW1uSWRdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgaXRlckVycm9yS2V5IGluIGNvbHVtbkVycm9ycykge1xuXHRcdFx0XHRcdGNsZWFySXRlbUVycm9yKFxuXHRcdFx0XHRcdFx0TnVtYmVyKGl0ZW1FbnRyeUlkKSxcblx0XHRcdFx0XHRcdGl0ZXJDb2x1bW5JZCxcblx0XHRcdFx0XHRcdGl0ZXJFcnJvcktleSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSB0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5fc2V0SXNWYWxpZCgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZXJyb3JzLml0ZW1baXRlbUVudHJ5SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXJyb3JLZXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgY29sdW1uRXJyb3JzID0gdGhpcy5lcnJvcnMuaXRlbVtpdGVtRW50cnlJZF1bY29sdW1uSWRdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZXJFcnJvcktleSBpbiBjb2x1bW5FcnJvcnMpIHtcblx0XHRcdFx0Y2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0TnVtYmVyKGl0ZW1FbnRyeUlkKSxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0XHRpdGVyRXJyb3JLZXksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSB0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXVtjb2x1bW5JZF07XG5cdFx0XHR0aGlzLl9zZXRJc1ZhbGlkKCk7XG5cblx0XHRcdGlmICghaGFzUHJvcGVydGllcyh0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXSkpIHtcblx0XHRcdFx0dGhpcy5jbGVhckl0ZW1FcnJvcihpdGVtRW50cnlJZCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjbGVhckl0ZW1FcnJvcihcblx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRlcnJvcktleSxcblx0XHQpO1xuXG5cdFx0ZGVsZXRlIHRoaXMuZXJyb3JzLml0ZW1baXRlbUVudHJ5SWRdW2NvbHVtbklkXVtlcnJvcktleV07XG5cdFx0dGhpcy5fc2V0SXNWYWxpZCgpO1xuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHRoaXMuZXJyb3JzLml0ZW1baXRlbUVudHJ5SWRdW2NvbHVtbklkXSkpIHtcblx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvblJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaFJlc3VsdCwgQ29sbGVjdGlvblF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZW51bSBDT05TVEFOVFMge1xuXHRNQVlCRSA9ICdtYXliZSdcbn1cblxudHlwZSBDb2xsZWN0aW9uRW50cnlNYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtjb2xsZWN0aW9uRW50cnlJZDogbnVtYmVyXTogQ29sbGVjdGlvbkVudHJ5PGFueT5cblx0fVxufTtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25DYWNoZSB7XG5cdHByaXZhdGUgZW50cmllczogQ29sbGVjdGlvbkVudHJ5TWFwID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBnZXRCeUVudHJ5SWQgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5lbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnRhaW5zIChjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnRyaWVzW2NvbGxlY3Rpb25FbnRyeS5pZF0gIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHNvbWUgKGNhbGxiYWNrOiAoZW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGlmIChjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvckVhY2ggKGNhbGxiYWNrOiAoZW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKlx0ZmlsdGVyIChjYWxsYmFjazogKGVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IENvbGxlY3Rpb25FbnRyeU1hcCAgPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdCBmaWx0ZXJlZEVudHJpZXNbaXRlbVR5cGVdID0ge307XG5cblx0IGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHQgY29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF07XG5cblx0IGlmIChjYWxsYmFjayhjb2xsZWN0aW9uRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSA9IGNvbGxlY3Rpb25FbnRyeTtcblx0IH1cblx0IH1cblxuXHQgdGhpcy5lbnRyaWVzID0gZmlsdGVyZWRFbnRyaWVzO1xuXHQgfVxuXHQgKi9cblx0dG9BcnJheSAoKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxhbnk+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRhZGQ8VCBleHRlbmRzIENvbGxlY3Rpb25FbnRyeTxhbnk+PiAoY29sbGVjdGlvbkVudHJ5OiBUKTogVCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnRyaWVzW2l0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkuaWRdID0gY29sbGVjdGlvbkVudHJ5O1xuXHR9XG5cblx0Y2xlYXIgKGNvbGxlY3Rpb25FbnRyeT86IENvbGxlY3Rpb25FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmVudHJpZXMgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5zKGNvbGxlY3Rpb25FbnRyeSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVsZXRlIHRoaXMuZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cdH1cblxuXHRnZXRCeUl0ZW1UeXBlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2VudHJ5SWRdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0bWF0Y2hQYXJlbnQgKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PGFueT4sXG5cdFx0aXRlbVR5cGU6IHN0cmluZyxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gY29sbGVjdGlvbkVudHJ5LnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyA9PSB0byBjb21wYXJlIGl0ZW1JZHNcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdHJldHVybiBwYXJlbnQuaXRlbVR5cGUgPT09IGl0ZW1UeXBlICYmIHBhcmVudC5pdGVtSWQgPT0gaXRlbUlkO1xuXHR9XG5cblx0Ly8gVE9ETzogdGhpbmsgb2YgYmV0dGVyIG5hbWVcblx0Z2V0QnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHwgbnVsbCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0aWYgKHRoaXMubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdGVudHJpZXNbZW50cnlJZF0sXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXR1cm4gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldENvbGxlY3Rpb25zQnlQYXJlbnQgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdO1xuXG5cdFx0XHRcdGlmICh0aGlzLm1hdGNoUGFyZW50KFxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdHBhcmVudElkLFxuXHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30gd2hpY2ggY29udGFpbiB0aGUgaXRlbSB3aXRoIHRoZSBwYXNzZWQgSXRlbVR5cGUvSXRlbUlkXG5cdCAqL1xuXHRnZXRCeUNvbnRhaW5pbmdJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cdFx0XHRjb25zdCBpdGVtcyA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChpdGVtcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGl0ZW1zLnNvbWUoXG5cdFx0XHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCA9PSBpdGVtSWQsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyBpZiB0aGUgcGFzc2VkIGZpZWxkcyB3b3VsZCBmaXQgaW4gdGhlIGNvbGxlY3Rpb25zIHVzaW5nIHRoZSB7QGxpbmsgUXVlcnlNYXRjaGVyIFF1ZXJ5TWF0Y2hlcn1cblx0ICovXG5cdGdldEJ5Rml0dGluZ0l0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT4gPSB7XG5cdFx0XHRmaXR0aW5nOiBbXSxcblx0XHRcdG5vdGZpdHRpbmc6IFtdLFxuXHRcdFx0bWF5YmU6IFtdLFxuXHRcdH07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdC8vIGNvbnNvbGUudGltZSgnZ2V0QnlGaXR0aW5nSXRlbScpO1xuXG5cdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50LFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdGNvbnN0IG1hdGNoUmVzdWx0ID0gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCk7XG5cblx0XHRcdC8vIHRvZG9bY2FjaGVdOiBtYXliZT9cblx0XHRcdGlmIChtYXRjaFJlc3VsdCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXN1bHQuZml0dGluZy5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoUmVzdWx0ID09PSBDT05TVEFOVFMuTUFZQkUpIHtcblx0XHRcdFx0cmVzdWx0Lm1heWJlLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5ub3RmaXR0aW5nLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLnRpbWVFbmQoJ2dldEJ5Rml0dGluZ0l0ZW0nKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nID09PSBxdWVyeS5zdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldEJ5UXVlcnlTdHJpbmc8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHwgbnVsbCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcgPT09IHF1ZXJ5U3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRnZXRCeUtleTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0ZW50cnlLZXk6IHN0cmluZyxcblx0KTogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmVudHJ5S2V5ID09PSBlbnRyeUtleSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSByZW1vdmUgdGhpcywgeW91IHNob3VsZCBnZXQgYSBuZXcgcmVzb3VyY2UuLi5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UmVzb3VyY2VCeUtleTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVzb3VyY2VLZXk6IHN0cmluZyxcblx0KTogQXJyYXk8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCB8fCAhKHRoaXMudHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkNhY2hlKSkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uUmVzb3VyY2VzW2VudHJ5SWRdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0XHRpZiAocmVzb3VyY2Uub3B0aW9ucy5yZXNvdXJjZUtleSA9PT0gcmVzb3VyY2VLZXkpIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChyZXNvdXJjZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUXVlcnlQYXJzZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZSwgQ29sbGVjdGlvblF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVVbmZvdW5kTG9jYWxDb2xsZWN0aW9uRXJyb3IgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHttZXNzYWdlOiBzdHJpbmd9IHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGNvbGxlY3Rpb24gb2YgdHlwZSAke2l0ZW1UeXBlfSBjb3VsZCBub3QgYmUgZm91bmRgfTtcblx0fVxuXG5cdC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIGNvbHVtbnMgcHJvcGVydHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgaW4gd2hlbiBjb2x1bW5zIGFyZSBleHBhbmRlZFxuXHRjbG9uZU9wdGlvbnMgKFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpOyAvLyBkb2VzIGEgc2hhbGxvdyBjb3B5XG5cblx0XHRyZXN1bHQucXVlcnlQYXJhbXMgPSB0aGlzLmNsb25lUXVlcnlQYXJhbXMob3B0aW9ucy5xdWVyeVBhcmFtcyk7XG5cdFx0cmVzdWx0LnBhcmVudCA9IHBhcmVudDtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4pOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHRjbG9uZVF1ZXJ5UGFyYW1zPFQgZXh0ZW5kcyBvYmplY3Q+IChwYXJhbWV0ZXJzOiBUKTogVCB7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcblxuXHRcdGZvciAoY29uc3Qga2V5IGluIHBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xuXHRcdFx0bGV0IGNsb25lO1xuXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0Y2xvbmUgPSB2YWx1ZS5zbGljZSgpO1xuXHRcdFx0fS8vIHdlJ3JlIG9ubHkgdXNpbmcgcHJpbWl0aXZlIGFycmF5c1xuXHRcdFx0ZWxzZSBpZiAobW9tZW50LmlzTW9tZW50KHZhbHVlKSkge1xuXHRcdFx0XHRjbG9uZSA9IHZhbHVlLmNsb25lKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZSA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHRba2V5XSA9IGNsb25lO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRjcmVhdGVRdWVyeSAob3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyk6IENvbGxlY3Rpb25RdWVyeSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cblx0XHRsZXQgcXVlcnk7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRxdWVyeSA9IG9wdGlvbnMucXVlcnk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpbmtlZFRvUXVlcnkgPSB7XG5cdFx0XHRcdGxpbmtlZFRvOiBwYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5OiB7aWQ6ICcmcGFyZW50SWQnfSxcblx0XHRcdH07XG5cdFx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zLnBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0cXVlcnkgPSBvcHRpb25zLnF1ZXJ5ID09PSBudWxsID9cblx0XHRcdFx0bGlua2VkVG9RdWVyeSA6XG5cdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHRvcHRpb25zLnF1ZXJ5LFxuXHRcdFx0XHRcdGxpbmtlZFRvUXVlcnksXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdG9wdGlvbnMucXVlcnlQYXJhbXMsXG5cdFx0XHQpXG5cdFx0XHQucGFyc2UoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvYmplY3Q6IHBhcnNlZFF1ZXJ5WzBdLFxuXHRcdFx0c3RyaW5nOiBwYXJzZWRRdWVyeVsxXSxcblx0XHR9O1xuXHR9XG5cblx0Z2V0SWRBcnJheSAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxhbnk+Pixcblx0XHRhY2N1bXVsYXRvcjogSXRlbUlkW10gPSBbXSxcblx0KTogSXRlbUlkW10ge1xuXHRcdGlmIChhY2N1bXVsYXRvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRhY2N1bXVsYXRvciA9IFtdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRhY2N1bXVsYXRvci5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmlsdGVycyBhbiBhcnJheSBvZiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSBhY2NvcmRpbmcgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKiBEb2VzIGFuIGluLXBsYWNlIHJlcGxhY2VtZW50IG9mIHRoZSBpdGVtcyBpbiB0aGUgYXJyYXkgdGhhdCBkbyBtYXRjaCB0aGUgY29uZGl0aW9uIChrZWVwaW5nIHRoZSBhcnJheSByZWZlcmVuY2UpXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZmFpbGVkIHRoZSBjb25kaXRpb25cblx0ICovXG5cdGZpbHRlckFycmF5PFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55PiA9IEl0ZW1FbnRyeTxhbnk+PiAoXG5cdFx0aXRlbUVudHJpZXM6IFRbXSxcblx0XHRjYWxsYmFjazogKGl0ZW1FbnRyeTogVCkgPT4gYm9vbGVhbixcblx0KTogVFtdIHtcblx0XHRjb25zdCBmaWx0ZXJlZEVudHJpZXM6IFRbXSA9IFtdO1xuXHRcdGNvbnN0IHJlbW92ZWRFbnRyaWVzOiBUW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHQoY2FsbGJhY2soaXRlbUVudHJ5KSA/IGZpbHRlcmVkRW50cmllcyA6IHJlbW92ZWRFbnRyaWVzKS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbW92ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHJlbW92ZWRFbnRyaWVzO1xuXHRcdH1cblxuXHRcdGl0ZW1FbnRyaWVzLmxlbmd0aCA9IGZpbHRlcmVkRW50cmllcy5sZW5ndGg7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpdGVtRW50cmllc1tpXSA9IGZpbHRlcmVkRW50cmllc1tpXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVtb3ZlZEVudHJpZXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsIEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlU2VydmljZSB7XG5cblx0cHJvY2Vzc09wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT5cblx0KTogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHRnZXRJZEFycmF5IChpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8YW55Pj4pOiBJdGVtSWRbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcylcblx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG59XG4iLCJpbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uLCBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uQ2FjaGUge1xuXHRjYWNoZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXHRhbGxDb2x1bW5zOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0c2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdFx0aWYgKGNhY2hlW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjYWNoZVtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnRyeSA9IGNhY2hlW2l0ZW1UeXBlXTtcblx0XHRjb25zdCBjb2x1bW5JZCA9IHJlc3BvbnNlQ29sdW1uLmlkO1xuXG5cdFx0aWYgKGVudHJ5W2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyeVtjb2x1bW5JZF0gPSByZXNwb25zZUNvbHVtbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW50cnlbY29sdW1uSWRdO1xuXHR9XG5cblx0c2V0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdGNvbnN0IHJlc3VsdDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCByZXNwb25zZVR5cGUgaW4gcmVzcG9uc2VDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5zID0gcmVzcG9uc2VDb2x1bW5zW3Jlc3BvbnNlVHlwZV07XG5cblx0XHRcdHJlc3VsdFtyZXNwb25zZVR5cGVdID0ge307XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY29sdW1ucykge1xuXHRcdFx0XHRyZXN1bHRbcmVzcG9uc2VUeXBlXVtjb2x1bW5JZF0gPSB0aGlzLnNldENvbHVtbihcblx0XHRcdFx0XHRyZXNwb25zZVR5cGUsXG5cdFx0XHRcdFx0Y29sdW1uc1tjb2x1bW5JZF0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLmFsbENvbHVtbnNbaXRlbVR5cGVdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cmV0cmlldmUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IHtjYWNoZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsIG1pc3Npbmc6IEFwaVJlcXVlc3RDb2x1bW5zfSB7XG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRpZiAodGhpcy5jb250YWluc0FsbChpdGVtVHlwZSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRjYWNoZWQ6IHRoaXMuZ2V0Q29sdW1ucyhpdGVtVHlwZSksXG5cdFx0XHRcdFx0bWlzc2luZzogW10sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNhY2hlZDoge30sXG5cdFx0XHRcdG1pc3Npbmc6IHRydWUsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3BvbnNlQWNjdW11bGF0b3IgPSB7fTtcblx0XHRjb25zdCByZXF1ZXN0QWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uW10gPSBbXTtcblxuXHRcdHRoaXMucmV0cmlldmVDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjYWNoZWQ6IHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0XHRtaXNzaW5nOiByZXF1ZXN0QWNjdW11bGF0b3IsXG5cdFx0fTtcblx0fVxuXG5cdGNvbnRhaW5zQWxsIChpdGVtVHlwZTogSXRlbVR5cGUpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5hbGxDb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdHJ1ZTtcblx0fVxuXG5cdGdldENvbHVtbnMgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRcdHJldHVybiB7W2l0ZW1UeXBlXTogY2FjaGVbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyBbXSA6IGNhY2hlW2l0ZW1UeXBlXX07XG5cdH1cblxuXHRwcml2YXRlIHJldHJpZXZlQ29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogdm9pZCB7XG5cdFx0Ly8gYWx3YXlzIHJldHJpZXZlIHRoZSBpZCBjb2x1bW5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHR0aGlzLnJldHJpZXZlQ29sdW1uKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbixcblx0XHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJldHJpZXZlQ29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbixcblx0XHRyZXF1ZXN0QWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uW10sXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5VdGlsLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2x1bW4uaWQsXG5cdFx0KTtcblxuXHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXF1ZXN0QWNjdW11bGF0b3IucHVzaChyZXF1ZXN0Q29sdW1uKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAocmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXNwb25zZUFjY3VtdWxhdG9yW2l0ZW1UeXBlXVtjb2x1bW4uaWRdID0gcmVzcG9uc2VDb2x1bW47XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1pc3NpbmdEZXJpdmVkOiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1ucyhcblx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uLmNoaWxkcmVuLFxuXHRcdFx0bWlzc2luZ0Rlcml2ZWQsXG5cdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdCk7XG5cblx0XHRpZiAobWlzc2luZ0Rlcml2ZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yLnB1c2goe1tjb2x1bW4uaWRdOiBtaXNzaW5nRGVyaXZlZH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDb2x1bW4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChjYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlW2NvbHVtbklkXTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbywgQ29sdW1uU2V0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q29sdW1uRXhwYW5zaW9uUmVzdWx0LFxuXHRJdGVtVHlwZSxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0Um9vdENvbHVtbk1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRGaXJzdFByb3BlcnR5IH0gZnJvbSAnLi9VdGlsJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgQ29sdW1uRXhwYW5zaW9uIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgaGF2ZSB0aGUgc2FtZSB7QGxpbmsgQ29sdW1uU2V0IENvbHVtblNldH0gKG1hdGNoZWQgb24ge0BsaW5rIENvbHVtblNldC5pZCBDb2x1bW5TZXQuaWR9KSB3aWxsIGFsbCBnZXQgdGhlIHNhbWUgbmV3IGV4cGFuZGVkIENvbHVtblNldFxuICovXG5leHBvcnQgY2xhc3MgQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cblx0ZXhwYW5zaW9uTWFwOiB7W2NvbHVtblNldElkOiBzdHJpbmddOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGx9ID0ge307XG5cdGV4cGFuc2lvbk1hcFNpemU6IG51bWJlciA9IDA7XG5cdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbjtcblx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3RvcnksXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHB1YmxpYyByZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCkge1xuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gcmVxdWVzdENvbHVtbnMgc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheSwgd2hlbiBpdCBpcyB0cnVlIGRlcml2ZWQgY29sdW1uIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9zdFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSB0cnVlO1xuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucy5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSBmYWxzZTtcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMgPSByZXF1ZXN0Q29sdW1ucztcblx0XHR9XG5cdH1cblxuXHRydW4gKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGV4cGFuc2lvbk1hcCA9IHRoaXMuZXhwYW5zaW9uTWFwO1xuXHRcdGNvbnN0IGNvbHVtblNldElkID0gY29sdW1uU2V0LmlkO1xuXG5cdFx0aWYgKGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF07XG5cdFx0fVxuXG5cdFx0dGhpcy5leHBhbnNpb25NYXBTaXplKys7XG5cblx0XHRyZXR1cm4gZXhwYW5zaW9uTWFwW2NvbHVtblNldElkXSA9IGNvbHVtblNldC5pc1N1cGVyc2V0T2YodGhpcy5yZXF1ZXN0Q29sdW1ucykgP1xuXHRcdFx0bnVsbCA6XG5cdFx0XHRjb2x1bW5TZXQuZXhwYW5kKFxuXHRcdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHRcdFx0dGhpcy5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0YWdncmVnYXRlUm9vdENvbHVtbnMgKCk6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGV4cGFuc2lvbk1hcCA9IHRoaXMuZXhwYW5zaW9uTWFwO1xuXG5cdFx0aWYgKHRoaXMuZXhwYW5zaW9uTWFwU2l6ZSA9PT0gMSkge1xuXHRcdFx0Y29uc3QgZXhwYW5zaW9uUmVzdWx0ID0gZXhwYW5zaW9uTWFwW2dldEZpcnN0UHJvcGVydHkoZXhwYW5zaW9uTWFwKSBhcyBzdHJpbmddO1xuXG5cdFx0XHRyZXR1cm4gZXhwYW5zaW9uUmVzdWx0ICE9PSBudWxsID8gZXhwYW5zaW9uUmVzdWx0LmRpZmZlcmVuY2Uucm9vdCA6IFtdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uU2V0SWQgaW4gZXhwYW5zaW9uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSBleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uRXhwYW5zaW9uID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5kaWZmZXJlbmNlLnJvb3QsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNvbHVtbkluZm9GYWN0b3J5LmNvbnN0cnVjdEZyb21Sb290TWFwKHJvb3RDb2x1bW5NYXApO1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwIChcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGRlc3RpbmF0aW9uOiBSb290Q29sdW1uTWFwLFxuXHQpIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblxuXHRcdFx0aWYgKGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9IHtcblx0XHRcdFx0XHRhcGlDb2x1bW46IGNvbHVtbi5hcGlDb2x1bW4sXG5cdFx0XHRcdFx0Y2hpbGRyZW46IHt9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdGNvbHVtbi5jaGlsZHJlbixcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlLCBDb2x1bW5DYWNoZSwgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlLCBSZXNwb25zZUNvbHVtbiwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkhhbmRsZXIge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGNhY2hlOiBDb2x1bW5DYWNoZSxcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0c2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0cmV0dXJuIHRoaXMuY2FjaGUuc2V0Q29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHQpO1xuXHR9XG5cblx0c2V0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdHJldHVybiB0aGlzLmNhY2hlLnNldENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRmZXRjaEl0ZW1UeXBlVHJhbnNsYXRpb25zIChpdGVtVHlwZXM6IEl0ZW1UeXBlW10pOiBQcm9taXNlSW50ZXJmYWNlPHtbaXRlbVR5cGU6IHN0cmluZ106IHN0cmluZ30+IHtcblx0XHRjb25zdCBwcm9taXNlczoge1tpdGVtVHlwZTogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgb2YgaXRlbVR5cGVzKSB7XG5cdFx0XHRwcm9taXNlc1tpdGVtVHlwZV0gPSB0aGlzLmZldGNoKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0WydpZCddLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdDoge1tpdGVtVHlwZTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiByZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHJlc3BvbnNlW2l0ZW1UeXBlXVtpdGVtVHlwZV0uaWQubmFtZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cmVxdWVzdCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHBhcmFtcyA9IHtmaWx0ZXI6IGZhbHNlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UuY29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0e1tpdGVtVHlwZV06IGNvbHVtbnN9LFxuXHRcdFx0cGFyYW1zLFxuXHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjb2x1bW5SZXNvdXJjZSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY2FjaGUuc2V0Q29sdW1ucyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdFx0XHRcdGNvbHVtblJlc291cmNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRmZXRjaCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRwYXJhbXM/OiBhbnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD4ge1xuXHRcdGNvbnN0IGNvbHVtblJlc291cmNlID0gdGhpcy5jYWNoZS5yZXRyaWV2ZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5SZXNvdXJjZS5taXNzaW5nICE9PSB0cnVlICYmIGNvbHVtblJlc291cmNlLm1pc3NpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbHVtblJlc291cmNlLmNhY2hlZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uUmVzb3VyY2UubWlzc2luZyxcblx0XHRcdHBhcmFtcyxcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0Y29sdW1uUmVzb3VyY2UuY2FjaGVkLFxuXHRcdFx0XHRcdCkubWVyZ2VkO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdGZldGNoQWxsIChpdGVtVHlwZTogSXRlbVR5cGUpOiBQcm9taXNlSW50ZXJmYWNlPFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA+IHtcblx0XHRpZiAodGhpcy5jYWNoZS5jb250YWluc0FsbChpdGVtVHlwZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4odGhpcy5jYWNoZS5nZXRDb2x1bW5zKGl0ZW1UeXBlKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDT0xVTU5fU0VQRVJBVE9SIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkluZm88SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aWQ6IHN0cmluZztcblx0bGV2ZWw6IG51bWJlcjtcblx0cGF0aDogc3RyaW5nO1xuXHR0YWlsUGF0aDogc3RyaW5nO1xuXHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlIHwgbnVsbCA9IG51bGw7XG5cdGNoaWxkcmVuOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGlzTGVhZjogYm9vbGVhbiA9IHRydWU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHJlYWRvbmx5IGFwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0cmVhZG9ubHkgcGFyZW50OiBDb2x1bW5JbmZvPEl0ZW1UeXBlPiB8IG51bGwgPSBudWxsXG5cdCkge1xuXHRcdGNvbnN0IGNvbHVtbklkID0gYXBpQ29sdW1uLmlkO1xuXG5cdFx0dGhpcy5pZCA9IGNvbHVtbklkO1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0dGhpcy5sZXZlbCA9IDA7XG5cdFx0XHR0aGlzLnBhdGggPSBjb2x1bW5JZDtcblx0XHRcdHRoaXMudGFpbFBhdGggPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5sZXZlbCA9IHBhcmVudC5sZXZlbCArIDE7XG5cdFx0XHR0aGlzLnBhdGggPSBwYXJlbnQucGF0aCArIENPTFVNTl9TRVBFUkFUT1IgKyBjb2x1bW5JZDtcblx0XHRcdHRoaXMudGFpbFBhdGggPSBwYXJlbnQubGV2ZWwgPT09IDAgP1xuXHRcdFx0XHRjb2x1bW5JZCA6XG5cdFx0XHRcdHBhcmVudC50YWlsUGF0aCArIENPTFVNTl9TRVBFUkFUT1IgKyBjb2x1bW5JZDtcblx0XHR9XG5cdH1cblxuXHRzZXRDaGlsZHJlbiAoaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSwgY2hpbGRyZW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4pOiB0aGlzIHtcblx0XHR0aGlzLml0ZW1UeXBlID0gaXRlbVR5cGU7XG5cdFx0dGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXHRcdHRoaXMuaXNMZWFmID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbywgQ29sdW1uVXRpbCwgUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBDb2x1bW5FeHBhbnNpb25SZXN1bHQsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBlbXB0eU9iamVjdCA9IHt9O1xubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aWQgPSArK2N1cnJlbnRJZDtcblxuXHRyZXF1ZXN0OiBBcGlSZXF1ZXN0Q29sdW1ucztcblx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuO1xuXHRyZXNwb25zZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IGVtcHR5T2JqZWN0O1xuXG5cdGxpbms6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsO1xuXHRtYWluOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGRlcml2ZWQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0cm9vdDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRsZWFmOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGZvcm1hdHRlZDoge21haW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sIGRlcml2ZWQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj59ID0ge1xuXHRcdG1haW46IFtdLFxuXHRcdGRlcml2ZWQ6IFtdLFxuXHR9O1xuXHRmaWx0ZXJlZDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRjdXN0b206IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0c2VhcmNoYWJsZTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRpdGVtOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdG5vdEl0ZW06IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgZ3JvdXBDb2x1bW5JbmZvIChjb2x1bW5JbmZvOiBDb2x1bW5JbmZvKTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uVXRpbCA9IHRoaXMuY29sdW1uVXRpbDtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IGNvbHVtbkluZm8uYXBpQ29sdW1uO1xuXHRcdGNvbnN0IGlzRGVyaXZlZCA9IGNvbHVtbkluZm8ucGFyZW50ICE9PSBudWxsO1xuXG5cdFx0aWYgKGlzRGVyaXZlZCkge1xuXHRcdFx0dGhpcy5kZXJpdmVkLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubWFpbi5wdXNoKGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4udHlwZSA9PT0gJ2xpbmsnKSB7XG5cdFx0XHRcdHRoaXMubGluayA9IGNvbHVtbkluZm87XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGNvdWxkIHBvc3NpYmx5IGFkZCBkZXJpdmVkIGNvbHVtbnMgdG8gJ25vdEl0ZW0nXG5cdFx0XHR0aGlzW2NvbHVtblV0aWwuaXNJdGVtQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSA/ICdpdGVtJyA6ICdub3RJdGVtJ10ucHVzaChjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKCFjb2x1bW5JbmZvLmlzTGVhZikge1xuXHRcdFx0XHR0aGlzLnJvb3QucHVzaChjb2x1bW5JbmZvKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc0Zvcm1hdHRlZENvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuZm9ybWF0dGVkW2lzRGVyaXZlZCA/ICdkZXJpdmVkJyA6ICdtYWluJ10ucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc0ZpbHRlcmVkQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5maWx0ZXJlZC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzU2VhcmNoYWJsZUNvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuc2VhcmNoYWJsZS5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzQ3VzdG9tQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5jdXN0b20ucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uSW5mby5pc0xlYWYpIHtcblx0XHRcdHRoaXMubGVhZi5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblx0fVxuXG5cdHRvSlNPTiAoKSB7XG5cdFx0Y29uc3QgcGFyc2VDb2x1bW5zID0gKGNvbHVtbnM6IENvbHVtbkluZm9bXSkgPT4gY29sdW1ucy5tYXAoXG5cdFx0XHRjID0+IGMuaWQpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1haW46IHBhcnNlQ29sdW1ucyh0aGlzLm1haW4pLFxuXHRcdFx0ZGVyaXZlZDogcGFyc2VDb2x1bW5zKHRoaXMuZGVyaXZlZCksXG5cdFx0fTtcblx0fVxuXG5cdGV4cGFuZFJlcXVlc3RDb2x1bW5zIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IHZvaWQge1xuXHRcdGNvbnN0IG1lcmdlZFJlcXVlc3RDb2x1bW5zID0gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRjb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXG5cdFx0dGhpcy5yZXF1ZXN0ID0gbWVyZ2VkUmVxdWVzdENvbHVtbnM7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSBtZXJnZWRSZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZTtcblx0fVxuXG5cdGlzU3VwZXJzZXRPZiAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiBib29sZWFuIHtcblx0XHRpZiAoY29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdENvbHVtbnNUcnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtblV0aWwgPSB0aGlzLmNvbHVtblV0aWw7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLnJlcXVlc3Q7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiAhY29sdW1uVXRpbC5jb250YWluc0Rlcml2ZWRDb2x1bW5zKGNvbHVtbnMpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGlmICghY29sdW1uVXRpbC5jb250YWluc0NvbHVtbihcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXJnZWRDb2x1bW5TZXQgKFxuXHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQsXG5cdFx0bWVyZ2VkUmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRtZXJnZWRSZXF1ZXN0Q29sdW1ucy5tZXJnZWQsXG5cdFx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJlc3VsdC5yZXF1ZXN0Q29sdW1uc1RydWUgPSB0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSB8fCByZXF1ZXN0Q29sdW1uc1RydWU7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0IHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXHR9XG5cblx0bWVyZ2VSZXNwb25zZUNvbHVtbnMgKHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHR0aGlzLnJlc3BvbnNlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXHR9XG5cblx0bWVyZ2UgKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWVyZ2VkQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5tZXJnZVJlcXVlc3RDb2x1bW5zKGNvbHVtblNldC5yZXF1ZXN0KSxcblx0XHRcdHRoaXMubWVyZ2VSZXNwb25zZUNvbHVtbnMoY29sdW1uU2V0LnJlc3BvbnNlKSxcblx0XHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUsXG5cdFx0KTtcblx0fVxuXG5cdGV4cGFuZCAoXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbixcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBtZXJnZWRSZXF1ZXN0Q29sdW1ucyA9IHRoaXMubWVyZ2VSZXF1ZXN0Q29sdW1ucyhyZXF1ZXN0Q29sdW1ucyk7XG5cdFx0Y29uc3QgbWVyZ2VkUmVzcG9uc2VDb2x1bW5zID0gdGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1ucyhyZXNwb25zZUNvbHVtbnMpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogdGhpcy5nZXRNZXJnZWRDb2x1bW5TZXQoXG5cdFx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHRcdCksXG5cdFx0XHRkaWZmZXJlbmNlOiB0aGlzLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLmRpZmZlcmVuY2UsXG5cdFx0XHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1ucywgLy8gd2UgbmVlZCB0byBiZSBhYmxlIHRvIGxvb2sgdXAgdGhlIHBhcmVudCBvZiBkZXJpdmVkIGNvbHVtbnNcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXHRwcml2YXRlIGNhY2hlOiB7W2NvbHVtblNldElkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgcmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zXG5cdCkge1xuXG5cdH1cblxuXHRydW4gKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBib29sZWFuIHtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdFx0Y29uc3QgY29sdW1uU2V0SWQgPSBjb2x1bW5TZXQuaWQ7XG5cblx0XHRpZiAoY2FjaGVbY29sdW1uU2V0SWRdICE9PSB1bmRlZmluZWQpXG5cdFx0XHRyZXR1cm4gY2FjaGVbY29sdW1uU2V0SWRdO1xuXG5cdFx0cmV0dXJuIGNhY2hlW2NvbHVtblNldElkXSA9IGNvbHVtblNldC5pc1N1cGVyc2V0T2YodGhpcy5yZXF1ZXN0Q29sdW1ucyk7XG5cdH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgQ09MVU1OX1NFUEVSQVRPUiwgUkVOREVSX0FTX1NFUEVSQVRPUiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQge1xuXHRBcGlMaW5rVHJlZVR5cGUsXG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRJdGVtVHlwZSxcblx0UmVzcG9uc2VDb2x1bW4sXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJlc3BvbnNlQ29sdW1uTWFwLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGV4dGVuZCwgaXNEZWZpbmVkIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PFQgZXh0ZW5kcyBBcGlSZXF1ZXN0Q29sdW1ucyA9IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRVIGV4dGVuZHMgQXBpUmVxdWVzdENvbHVtbnMgPSBBcGlSZXF1ZXN0Q29sdW1ucz4gPSB7bWVyZ2VkOiBULCBkaWZmZXJlbmNlOiBVfTtcblxuZXhwb3J0IGNsYXNzIENvbHVtblV0aWwge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIHRoZSB7QGxpbmsgQXBpTGlua1RyZWUgTGlua1RyZWV9IGFuZCByZXR1cm5zIHRoZSBsaW5rIGNvbHVtbklkcyBmb3IgdGhlIGdpdmVuIEl0ZW1UeXBlXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogLSBGb3Ige0BsaW5rIEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QgZGlyZWN0IGxpbmtzfSBpdCB3aWxsIGJlIGEgY29sdW1uSWRcblx0ICogLSBGb3Ige0BsaW5rIEFwaUxpbmtUcmVlVHlwZS5JVEVNVEFCTEUgaXRlbXRhYmxlIGxpbmtzfSBpdCB3aWxsIGJlICdpdGVtdHlwZScgYW5kICdpdGVtJ1xuXHQgKi9cblx0cHVibGljIGdldENvbHVtbnNGcm9tTGluayAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1uW10ge1xuXHRcdGNvbnN0IGxpbmtUcmVlID0gdGhpcy5saW5rVHJlZVNlcnZpY2UuZ2V0KCk7XG5cdFx0Y29uc3QgbGlua1RyZWVFbnRyeSA9IGxpbmtUcmVlW3BhcmVudFR5cGVdW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0c3dpdGNoIChsaW5rVHJlZUVudHJ5LnR5cGUpIHtcblx0XHRcdGNhc2UgQXBpTGlua1RyZWVUeXBlLkRJUkVDVDpcblx0XHRcdFx0cmVzdWx0LnB1c2gobGlua1RyZWVFbnRyeS5maWVsZCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFOlxuXHRcdFx0XHRyZXN1bHQucHVzaCgnaXRlbXR5cGUnKTtcblx0XHRcdFx0cmVzdWx0LnB1c2goJ2l0ZW0nKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldENvbHVtblBhdGggKFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdFx0cmVuZGVyQXM6IG51bGwgfCBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzZXBhcmF0b3IgPSAnJztcblx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRyZXN1bHQgKz0gc2VwYXJhdG9yICsgY29sdW1uLmlkO1xuXHRcdFx0c2VwYXJhdG9yID0gQ09MVU1OX1NFUEVSQVRPUjtcblx0XHR9XG5cblx0XHRpZiAocmVuZGVyQXMgIT09IG51bGwpIHtcblx0XHRcdHJlc3VsdCArPSBSRU5ERVJfQVNfU0VQRVJBVE9SICsgcmVuZGVyQXM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldERhdGVGb3JtYXRPcHRpb25zIChjb2x1bW5UeXBlPzogJ2RhdGV0aW1lJykge1xuXHRcdGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuXG5cdFx0Y29uc3QgZm9ybWF0cyA9IHtcblx0XHRcdCdKLU0tWSc6IG5vdy5mb3JtYXQoJ0RELU1NLVlZWVknKSxcblx0XHRcdCdKLU0nOiBub3cuZm9ybWF0KCdERC1NTScpLFxuXHRcdFx0J2orRitZJzogbm93LmZvcm1hdCgnRCBNTU0gWVlZWScpLFxuXHRcdFx0J0QraitGK1knOiBub3cuZm9ybWF0KCdkZGRkIEQgTU1NIFlZWVknKSxcblx0XHRcdCdGJzogbm93LmZvcm1hdCgnTU1NJyksXG5cdFx0XHQnZic6IG5vdy5mb3JtYXQoJ01NTU0nKSxcblx0XHRcdCdEJzogbm93LmZvcm1hdCgnZGRkZCcpLFxuXHRcdFx0J2QnOiBub3cuZm9ybWF0KCdkZGQnKSxcblx0XHR9O1xuXG5cdFx0aWYgKGNvbHVtblR5cGUgPT09ICdkYXRldGltZScpIHtcblx0XHRcdGV4dGVuZChcblx0XHRcdFx0Zm9ybWF0cyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdCdKLU0tWStIOmknOiBub3cuZm9ybWF0KCdERC1NTS1ZWVlZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0otTStIOmknOiBub3cuZm9ybWF0KCdERC1NTSBISDptbScpLFxuXHRcdFx0XHRcdCdqK0YrWStIOmknOiBub3cuZm9ybWF0KCdERCBNTU1NIFkgSEg6bW0nKSxcblx0XHRcdFx0XHQnRCtqK0YrWStIOmknOiBub3cuZm9ybWF0KCdkZGRkIEREIE1NTSBZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0g6aSc6IG5vdy5mb3JtYXQoJ0hIOm1tJyksXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmb3JtYXRzO1xuXHR9XG5cblx0aXNTdHJpbmdDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICdwaG9uZSc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICd0ZXh0cmVwbGFjZSc6XG5cdFx0XHRcdC8vIGNhc2UgJ2h0bWwnOiAvLyBUT0RPOiBzb3J0IG9uIGZpbHRlcmVkIHZhbHVlXG5cdFx0XHRcdC8vIGNhc2UgJ2VudW0nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0Zsb2F0Q29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZG91YmxlJzogLy8gZmxvYXRpbmcgcG9pbnQgdHlwZXNcblx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAnZGlzdGFuY2UnOlxuXHRcdFx0Y2FzZSAnZGltZW5zaW9uJzpcblx0XHRcdGNhc2UgJ3Bvd2VyJzpcblx0XHRcdGNhc2UgJ2N1cnJlbnQnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzSW50Q29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnaW50JzogLy8gaW50ZWdlciB0eXBlc1xuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ3F1YW50aXR5Jzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNOdW1iZXJDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5pc0Zsb2F0Q29sdW1uKGNvbHVtbikgfHwgdGhpcy5pc0ludENvbHVtbihjb2x1bW4pO1xuXHR9XG5cblx0aXNDdXN0b21Db2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29sdW1uLmZpZWxkdHlwZSA9PT0gJ2N1c3RvbWZpZWxkJztcblx0fVxuXG5cdGlzSXRlbUNvbHVtbiAoXG5cdFx0Y29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRpbmNsdWRlSWQgPSB0cnVlLFxuXHQpOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdpZCc6XG5cdFx0XHRcdHJldHVybiBpbmNsdWRlSWQ7XG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRGF0ZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc1JlbmRlcmVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRmlsdGVyZWRDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHQvLyB1Z2x5IGhhY2sgOi0oXG5cdFx0aWYgKGNvbHVtbi5pZCA9PT0gJ3N0YWZmZWwnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmdlbmVyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0Y2FzZSAnY291bnRyeSc6XG5cdFx0XHRjYXNlICd2b2x1bWUnOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ2Rpc3RhbmNlJzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdxdWFudGl0eSc6XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdGNhc2UgJ2h0bWwnOlxuXHRcdFx0Y2FzZSAndGV4dHJlcGxhY2UnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRm9ybWF0dGVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ2ZpbGVzaXplJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNTZWxlY3RhYmxlQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnYmxvYic6XG5cdFx0XHRjYXNlICdjb29yZGluYXRlJzpcblx0XHRcdGNhc2UgJ2ZvcmNldXBkYXRlJzpcblx0XHRcdGNhc2UgJ2lkJzpcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0Y2FzZSAncGFyZW50aWQnOlxuXHRcdFx0Y2FzZSAncGFyZW50dHlwZSc6XG5cdFx0XHRjYXNlICdwYXNzd29yZCc6XG5cdFx0XHRjYXNlICd0b2tlbic6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGhhc0xvY2F0aW9uUHJvcGVydHkgKFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0bG9jYXRpb246IG51bWJlcixcblx0KTogYm9vbGVhbiB7XG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2Vcblx0XHRyZXR1cm4gKGxvY2F0aW9uICYgY29sdW1uLmxvY2F0aW9uKSAhPT0gMDtcblx0fVxuXG5cdGlzRWRpdGFibGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRpZiAoY29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlzU2VhcmNoYWJsZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2VtYWlsJzpcblx0XHRcdGNhc2UgJ3Bob25lJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnaHRtbCc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGdldERlZmF1bHRXZWlnaHQgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBudW1iZXIge1xuXHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKCdnZXREZWZhdWx0V2VpZ2h0JywgY29sdW1uKTtcblxuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdGNhc2UgJ2ludCc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdwb3dlcic6XG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdFx0cmV0dXJuIDAuNTtcblxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0XHRyZXR1cm4gMS41O1xuXG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICdodG1sJzpcblx0XHRcdGNhc2UgJ3RleHRyZXBsYWNlJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4gJiB7dHlwZTogJ2RpbWVuc2lvbicgfCAnd2VpZ2h0JyB8ICdwcmljZSd9KTogWyc9JywgJz4nLCAnPCddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbiAmIHt0eXBlOiAnZGF0ZScgfCAnZGF0ZXRpbWUnIHwgJ3RpbWUnIHwgJ2R1cmF0aW9uJ30pOiBbJz4nLCAnPCddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IFsnPScsICchPSddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbikge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdCc9Jyxcblx0XHRcdFx0XHQnPicsXG5cdFx0XHRcdFx0JzwnLFxuXHRcdFx0XHRdO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPicsXG5cdFx0XHRcdFx0JzwnLFxuXHRcdFx0XHRdO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPScsXG5cdFx0XHRcdFx0JyE9Jyxcblx0XHRcdFx0XTtcblx0XHR9XG5cdH1cblxuXHRjb250YWluc0NvbHVtbiAoXG5cdFx0cmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbixcblx0XHRkZXN0aW5hdGlvbjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRjb25zdCBjb2x1bW5JbmRleCA9IHRoaXMuZmluZFJlcXVlc3RDb2x1bW4oXG5cdFx0XHRjb2x1bW4uaWQsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHQpO1xuXG5cdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0aWYgKCF0aGlzLmNvbnRhaW5zQ29sdW1uKFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdW2NvbHVtbi5pZF0sXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNvbnRhaW5zRGVyaXZlZENvbHVtbnMgKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10pOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiByZXF1ZXN0Q29sdW1ucykge1xuXHRcdFx0aWYgKHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKGNvbHVtbikuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXNwb25zZUNvbHVtbnNBdmFpbGFibGUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHJlc3BvbnNlQ29sdW1uTWFwOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IHJlcXVlc3RDb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHBhcnNlZENvbHVtbiA9IHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBwYXJzZWRDb2x1bW4uY2hpbGRyZW47XG5cdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSByZXNwb25zZUNvbHVtbk1hcFtpdGVtVHlwZV07XG5cdFx0XHRsZXQgcmVzcG9uc2VDb2x1bW47XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29sdW1uID0gcmVzcG9uc2VDb2x1bW5zW3BhcnNlZENvbHVtbi5pZF07XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGlsZHJlbi5sZW5ndGggPiAwICYmXG5cdFx0XHRcdCF0aGlzLnJlc3BvbnNlQ29sdW1uc0F2YWlsYWJsZShcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0XHRjaGlsZHJlbixcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbk1hcCxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNvcHlSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogdHJ1ZSk6IHRydWU7XG5cdGNvcHlSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdKTogQXBpUmVxdWVzdENvbHVtbltdO1xuXHRjb3B5UmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogQXBpUmVxdWVzdENvbHVtbnMge1xuXHRcdGlmIChjb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0cmVzdWx0LnB1c2godGhpcy5jb3B5UmVxdWVzdENvbHVtbihjb2x1bW4pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Y29weVJlcXVlc3RDb2x1bW4gKHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4pOiBBcGlSZXF1ZXN0Q29sdW1uIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gY29sdW1uLmlkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoaWxkcmVuOiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGRDb2x1bW4gb2YgY29sdW1uLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZHJlbi5wdXNoKHRoaXMuY29weVJlcXVlc3RDb2x1bW4oY2hpbGRDb2x1bW4pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1tjb2x1bW4uaWRdOiBjaGlsZHJlbn07XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogdHJ1ZSxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ8dHJ1ZSwgW10+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHNlY29uZDogdHJ1ZSxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PHRydWUsIHRydWU+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOlxuXHRcdFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDxBcGlSZXF1ZXN0Q29sdW1uW10sIEFwaVJlcXVlc3RDb2x1bW5bXT47XG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdGhlIHBhc3NlZCBjb2x1bW5zIGFuZCByZXR1cm5zIHRoZSBtZXJnZWQgc2V0IGFuZCB0aGUgZGlmZmVyZW5jZS5cblx0ICpcblx0ICogQHJldHVybnNcblx0ICogLSBNZXJnZWQ6IFRoZSBtZXJnZWQgc2V0IG9mIGNvbHVtbnNcblx0ICogLSBEaWZmZXJlbmNlOiBDb2x1bW5zIHRoYXQgYXJlIGluIHNlY29uZCwgYnV0IG5vdCBpbiBmaXJzdFxuXHQgKi9cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdCB7XG5cdFx0aWYgKGZpcnN0ID09PSB0cnVlKSAvLyA9PT0gb3BlcmF0b3IgbmVlZGVkIGhlcmVcblx0XHR7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXJnZWQ6IHRydWUsXG5cdFx0XHRcdGRpZmZlcmVuY2U6IFtdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoc2Vjb25kID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXJnZWQ6IHRydWUsXG5cdFx0XHRcdGRpZmZlcmVuY2U6IHRydWUsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IG1lcmdlZCA9IHRoaXMuY29weVJlcXVlc3RDb2x1bW5zKGZpcnN0KTtcblx0XHRjb25zdCBkaWZmZXJlbmNlOiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIHNlY29uZCkge1xuXHRcdFx0Y29uc3QgYWRkZWRDb2x1bW4gPSB0aGlzLm1lcmdlUmVxdWVzdENvbHVtbihcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRtZXJnZWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoYWRkZWRDb2x1bW4gIT09IG51bGwpIHtcblx0XHRcdFx0ZGlmZmVyZW5jZS5wdXNoKGFkZGVkQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiBtZXJnZWQsXG5cdFx0XHRkaWZmZXJlbmNlOiBkaWZmZXJlbmNlLFxuXHRcdH07XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW4gKFxuXHRcdHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KSB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0Y29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmZpbmRSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdGRlc3RpbmF0aW9uLnB1c2gocmVxdWVzdENvbHVtbik7XG5cdFx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbjtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPSB7XG5cdFx0XHRcdFtjb2x1bW4uaWRdOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkZWRDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdGNvbnN0IGFkZGVkQ29sdW1uID0gdGhpcy5tZXJnZVJlcXVlc3RDb2x1bW4oXG5cdFx0XHRcdGNoaWxkQ29sdW1uLFxuXHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XVtjb2x1bW4uaWRdLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGFkZGVkQ29sdW1uICE9PSBudWxsKSB7XG5cdFx0XHRcdGFkZGVkQ29sdW1ucy5wdXNoKGFkZGVkQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYWRkZWRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtbY29sdW1uLmlkXTogYWRkZWRDb2x1bW5zfTtcblx0fVxuXG5cdGdldFJlcXVlc3RDb2x1bW5JZCAocmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbik6IHN0cmluZyB7XG5cdFx0aWYgKHR5cGVvZiByZXF1ZXN0Q29sdW1uID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHJlcXVlc3RDb2x1bW47XG5cdFx0fVxuXG5cdFx0bGV0IGNvbHVtbklkO1xuXG5cdFx0Zm9yIChjb2x1bW5JZCBpbiByZXF1ZXN0Q29sdW1uKSB7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbHVtbklkIGFzIHN0cmluZztcblx0fVxuXG5cdHBhcnNlUmVxdWVzdENvbHVtbiAocmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbik6IHtpZDogc3RyaW5nLCBjaGlsZHJlbjogQXBpUmVxdWVzdENvbHVtbltdfSB7XG5cdFx0aWYgKHR5cGVvZiByZXF1ZXN0Q29sdW1uID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHJlcXVlc3RDb2x1bW4sXG5cdFx0XHRcdGNoaWxkcmVuOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0bGV0IGNvbHVtbklkO1xuXG5cdFx0Zm9yIChjb2x1bW5JZCBpbiByZXF1ZXN0Q29sdW1uKSB7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBjb2x1bW5JZCBhcyBzdHJpbmcsXG5cdFx0XHRjaGlsZHJlbjogcmVxdWVzdENvbHVtbltjb2x1bW5JZCBhcyBzdHJpbmddLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0d28gc2V0cyBvZiB7QGxpbmsgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwc30uXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVzcG9uc2VDb2x1bW5zIChcblx0XHRmaXJzdDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRzZWNvbmQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IHttZXJnZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsIGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXB9IHtcblx0XHRjb25zdCBtZXJnZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblx0XHRjb25zdCBkaWZmZXJlbmNlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGZpcnN0KSB7XG5cdFx0XHRpZiAoc2Vjb25kW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1lcmdlZFtpdGVtVHlwZV0gPSBmaXJzdFtpdGVtVHlwZV07XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1lcmdlUmVzdWx0ID0gdGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1uTWFwKFxuXHRcdFx0XHRmaXJzdFtpdGVtVHlwZV0sXG5cdFx0XHRcdHNlY29uZFtpdGVtVHlwZV0sXG5cdFx0XHQpO1xuXG5cdFx0XHRtZXJnZWRbaXRlbVR5cGVdID0gbWVyZ2VSZXN1bHQubWVyZ2VkO1xuXHRcdFx0ZGlmZmVyZW5jZVtpdGVtVHlwZV0gPSBtZXJnZVJlc3VsdC5kaWZmZXJlbmNlO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gc2Vjb25kKSB7XG5cdFx0XHRpZiAoZmlyc3RbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bWVyZ2VkW2l0ZW1UeXBlXSA9IHNlY29uZFtpdGVtVHlwZV07XG5cdFx0XHRcdGRpZmZlcmVuY2VbaXRlbVR5cGVdID0gc2Vjb25kW2l0ZW1UeXBlXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiBtZXJnZWQsXG5cdFx0XHRkaWZmZXJlbmNlOiBkaWZmZXJlbmNlLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0d28gc2V0cyBvZiB7QGxpbmsgUmVzcG9uc2VDb2x1bW5NYXAgcmVzcG9uc2UgY29sdW1uc30uXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVzcG9uc2VDb2x1bW5NYXAgKFxuXHRcdGZpcnN0OiBSZXNwb25zZUNvbHVtbk1hcCxcblx0XHRzZWNvbmQ6IFJlc3BvbnNlQ29sdW1uTWFwLFxuXHQpOiB7bWVyZ2VkOiBSZXNwb25zZUNvbHVtbk1hcCwgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5NYXB9IHtcblx0XHRjb25zdCBtZXJnZWQ6IFJlc3BvbnNlQ29sdW1uTWFwID0ge307XG5cdFx0Y29uc3QgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5NYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZmlyc3QpIHtcblx0XHRcdG1lcmdlZFtjb2x1bW5JZF0gPSBmaXJzdFtjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBzZWNvbmQpIHtcblx0XHRcdGlmIChpc0RlZmluZWQoZmlyc3RbY29sdW1uSWRdKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWVyZ2VkW2NvbHVtbklkXSA9IHNlY29uZFtjb2x1bW5JZF07XG5cdFx0XHRkaWZmZXJlbmNlW2NvbHVtbklkXSA9IHNlY29uZFtjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogbWVyZ2VkLFxuXHRcdFx0ZGlmZmVyZW5jZTogZGlmZmVyZW5jZSxcblx0XHR9O1xuXHR9XG5cblx0aXNMb2NhbENvbHVtbklkIChjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbHVtbklkLnN1YnN0cmluZyhcblx0XHRcdDAsXG5cdFx0XHQyLFxuXHRcdCkgPT09ICdfXyc7XG5cdH1cblxuXHRwcm9jZXNzQ29uZmlnQ29sdW1ucyAoY29uZmlnQ29sdW1uczogc3RyaW5nW10pOiBBcGlSZXF1ZXN0Q29sdW1uW10ge1xuXHRcdGNvbnN0IHJlcXVlc3Q6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29uZmlnQ29sdW1ucykge1xuXHRcdFx0aWYgKHRoaXMuaXNMb2NhbENvbHVtbklkKGNvbHVtbikpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucHJvY2Vzc0NvbmZpZ0NvbHVtbihcblx0XHRcdFx0dGhpcy5wYXJzZUNvbmZpZ0NvbHVtbihjb2x1bW4pLFxuXHRcdFx0XHRyZXF1ZXN0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVxdWVzdDtcblx0fVxuXG5cdHBhcnNlQ29uZmlnQ29sdW1uIChjb25maWdDb2x1bW46IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gY29uZmlnQ29sdW1uLnNwbGl0KFJFTkRFUl9BU19TRVBFUkFUT1IpWzBdLnNwbGl0KENPTFVNTl9TRVBFUkFUT1IpO1xuXHR9XG5cblx0cHJvY2Vzc0NvbmZpZ0NvbHVtbiAoXG5cdFx0cGFyc2VkQ29uZmlnQ29sdW1uOiBzdHJpbmdbXSxcblx0XHRkZXN0aW5hdGlvbjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpIHtcblx0XHRjb25zdCBjb2x1bW5JZCA9IHBhcnNlZENvbmZpZ0NvbHVtblswXTtcblx0XHRjb25zdCBpc0xlYWYgPSBwYXJzZWRDb25maWdDb2x1bW4ubGVuZ3RoID09PSAxO1xuXHRcdGxldCBjb2x1bW5JbmRleCA9IHRoaXMuZmluZFJlcXVlc3RDb2x1bW4oXG5cdFx0XHRjb2x1bW5JZCxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdCk7XG5cblx0XHRpZiAoaXNMZWFmKSB7XG5cdFx0XHRpZiAoY29sdW1uSW5kZXggPT09IC0xKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uLnB1c2goY29sdW1uSWQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29sdW1uSW5kZXggPSBkZXN0aW5hdGlvbi5wdXNoKHtbY29sdW1uSWRdOiBbXX0pIC0gMTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPSB7W2NvbHVtbklkXTogW119O1xuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHR0aGlzLnByb2Nlc3NDb25maWdDb2x1bW4oXG5cdFx0XHRwYXJzZWRDb25maWdDb2x1bW4uc2xpY2UoMSksXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF1bY29sdW1uSWRdLFxuXHRcdCk7XG5cdH1cblxuXHRmaW5kUmVxdWVzdENvbHVtbiAoXG5cdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBudW1iZXIge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdENvbHVtbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IHJlcXVlc3RDb2x1bW5zW2ldO1xuXG5cdFx0XHRpZiAodGhpcy5nZXRSZXF1ZXN0Q29sdW1uSWQoY29sdW1uKSA9PT0gY29sdW1uSWQpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2UsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbUlkQ29udmVyc2lvbk1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi9Db2x1bW5JbmZvJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuL0tleVNlcnZpY2UnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBICdDb252ZXJzaW9uTWFwJyBpcyB1c2VkIHRvIHVwZGF0ZSBhIHNldCBvZiBpdGVtIElEcyB0byBhbm90aGVyLiBUaGlzIGhhcHBlbnMgd2hlbiBwcm9jZXNzaW5nIGJhY2stZW5kXG4gKiByZXNwb25zZXMgKGNyZWF0ZSAvIHRlbXBsYXRlKSBvciBjbG9uaW5nIGl0ZW1zIGluIHRoZSBmcm9udC1lbmQuIEEgY29udmVyc2lvbiBtYXAgaXMgZ3JvdXBlZCBieSBpdGVtIHR5cGUsIGFzIGl0ZW1cbiAqIElEJ3MgYXJlIG5vdCB1bmlxdWUgYWNyb3NzIHR5cGVzLlxuICpcbiAqIFRPRE86IEluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBjcmVhdGUgYSBjbGFzcyBhbmQgYSAnQ29udmVyc2lvbk1hcEZhY3RvcnknLlxuICovXG5leHBvcnQgY2xhc3MgQ29udmVyc2lvbk1hcFNlcnZpY2Uge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUxvY2FsQ29udmVyc2lvbk1hcCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGRvRXh0ZW5kOiBib29sZWFuID0gZmFsc2UsXG5cdFx0YXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHQpOiBJdGVtSWRDb252ZXJzaW9uTWFwIHtcblx0XHRjb25zdCBhcGlJdGVtSWQgPSBhcGlSZXNwb25zZS5saW5rc1tpdGVtVHlwZV1bMF07XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge307XG5cblx0XHRyZXN1bHRbaXRlbVR5cGVdID0ge307XG5cdFx0cmVzdWx0W2l0ZW1UeXBlXVthcGlJdGVtSWRdID0gaXRlbUlkO1xuXG5cdFx0aWYgKGRvRXh0ZW5kKSB7XG5cdFx0XHR0aGlzLmV4cGFuZExvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGFwaUl0ZW1JZCxcblx0XHRcdFx0YXBpUmVzcG9uc2UsXG5cdFx0XHRcdHJlc3VsdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0YXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGxpbmtzID0gYXBpUmVzcG9uc2UuaXRlbXNbcGFyZW50VHlwZV1bcGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rcykge1xuXHRcdFx0Y29uc3QgaWRBcnJheSA9IGxpbmtzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgaWRBcnJheSkge1xuXHRcdFx0XHRjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXVthcGlJdGVtSWRdID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblxuXHRcdFx0XHR0aGlzLmV4cGFuZExvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0YXBpUmVzcG9uc2UsXG5cdFx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29udmVyc2lvbk1hcCAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRuZXdJdGVtSWQ/OiBJdGVtSWQsXG5cdCk6IEl0ZW1JZCB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdGxldCBjb252ZXJzaW9uTWFwRW50cnk7XG5cblx0XHRpZiAoY29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRjb252ZXJzaW9uTWFwRW50cnkgPSBjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChjb252ZXJzaW9uTWFwRW50cnlbaXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF07XG5cdFx0fVxuXG5cdFx0aWYgKG5ld0l0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRuZXdJdGVtSWQgPSB0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb252ZXJzaW9uTWFwRW50cnlbaXRlbUlkXSA9IG5ld0l0ZW1JZDtcblx0fVxuXG5cdHB1YmxpYyBiYXRjaEV4cGFuZENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8YW55Pj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuZXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcDtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb252ZXJzaW9uVmFsdWUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRtYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IEl0ZW1JZCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBjb2x1bW5zIGluIGBmaWVsZHNgIHVzaW5nIHRoZSBgcGFyZW50YCBhbmQgYGNvbnZlcnNpb25NYXBgLlxuXHQgKiBAcGFyYW0gcGFyZW50IC0gV2hlbiByZXRyaWV2aW5nIGFuIGl0ZW0gdGhlICdsaW5rJyBjb2x1bW4gaXMgbm90IHByZXNlbnQgaW4gdGhlIHRlbXBsYXRlIHJlc3BvbnNlLCBhbmQgaXNcblx0ICogYWRkZWQgYXQgYSBsYXRlciBzdGFnZS4gVGhlIHZhbHVlIGZvciB0aGlzIGNvbHVtbiBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgcGFyYW1ldGVyLlxuXHQgKi9cblx0cHVibGljIHVwZGF0ZUl0ZW1WYWx1ZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRzb3VyY2U6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZGVzdGluYXRpb246IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0aXRlbUNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCA9IG51bGwsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGl0ZW1Db2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdC8vIFRPRE86IHdlIGNhbiByZWNvbnNpZGVyIHRoaXMgb25jZSBhbGwgY29sdW1ucyBhcmUgcmVzcGVjdGVkIGZvciBsb2NhbCBpdGVtcyBbUk00LTEwMzc4XVxuXHRcdFx0bGV0IG5ld1ZhbHVlO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnR5cGUgPT09ICdsaW5rJyAmJiBzb3VyY2VbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdG5ld1ZhbHVlID0gcGFyZW50Lml0ZW1JZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmV3VmFsdWUgPSB0aGlzLmdldENvbnZlcnNpb25WYWx1ZShcblx0XHRcdFx0XHRhcGlDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0c291cmNlW2NvbHVtbklkXSxcblx0XHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JZF0gPSBuZXdWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ3JlYXRlQ29tcGlsYXRpb24sIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENyZWF0ZVJlcXVlc3RFbnRyeSwgSXRlbUlkLCBJdGVtTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDcmVhdGVEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblxuXHRyZXF1ZXN0czogQXJyYXk8Q3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29tcGlsYXRpb246IENyZWF0ZUNvbXBpbGF0aW9uLFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0cHJpdmF0ZSBicmVha3VwQnlQYXJlbnQgPSBmYWxzZSxcblx0KSB7XG5cdH1cblxuXHRmaW5hbGl6ZVJlcXVlc3QgKHJlcXVlc3RSZXNvdXJjZTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4pIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHJlcXVlc3RSZXNvdXJjZS5jb2xsZWN0aW9ucy5nZXRDb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMoKTtcblx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSByZXF1ZXN0UmVzb3VyY2UuY29sdW1ucztcblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRjb2x1bW5FeHBhbnNpb24uZXhwYW5kKGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zKTtcblx0XHR9XG5cblx0XHRyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdC5jb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3RSZXNvdXJjZTtcblx0fVxuXG5cdHNldFJlcXVlc3RQYXJlbnQgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RFbnRyeTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0RW50cnkucmVxdWVzdDtcblxuXHRcdGlmIChwYXJlbnRUeXBlID09PSAnVm9pZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXF1ZXN0LnBhcmVudFR5cGUgPSBwYXJlbnRUeXBlO1xuXHRcdHJlcXVlc3QucGFyZW50SWQgPSB7fTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cHVibGljIHJ1biAoKSB7XG5cdFx0Y29uc3QgY29tcGlsYXRpb24gPSB0aGlzLmNvbXBpbGF0aW9uO1xuXG5cdFx0aWYgKHRoaXMuYnJlYWt1cEJ5UGFyZW50KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmVudFR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgcGFyZW50TWFwID0gY29tcGlsYXRpb25bcGFyZW50VHlwZV07XG5cblx0XHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRNYXApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnRJZCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IHJlcXVlc3RSZXNvdXJjZSA9IHRoaXMuaW5pdGlhbGl6ZVJlcXVlc3QoKTtcblxuXHRcdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRcdHBhcmVudE1hcFtwYXJlbnRJZF0sXG5cdFx0XHRcdFx0XHR0aGlzLnNldFJlcXVlc3RQYXJlbnQoXG5cdFx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0XHRcdCkgPyArcGFyZW50SWQgOiBudWxsLFxuXHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR0aGlzLnJlcXVlc3RzLnB1c2godGhpcy5maW5hbGl6ZVJlcXVlc3QocmVxdWVzdFJlc291cmNlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChjb25zdCBwYXJlbnRUeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHBhcmVudE1hcCA9IGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdO1xuXHRcdFx0XHRjb25zdCByZXF1ZXN0UmVzb3VyY2UgPSB0aGlzLmluaXRpYWxpemVSZXF1ZXN0KCk7XG5cdFx0XHRcdGNvbnN0IGhhc1BhcmVudCA9IHRoaXMuc2V0UmVxdWVzdFBhcmVudChcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRsZXQgdmFsaWRSZXF1ZXN0ID0gZmFsc2U7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRNYXApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnRJZCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRcdHBhcmVudE1hcFtwYXJlbnRJZF0sXG5cdFx0XHRcdFx0XHRoYXNQYXJlbnQgPyArcGFyZW50SWQgOiBudWxsLFxuXHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR2YWxpZFJlcXVlc3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZhbGlkUmVxdWVzdCkge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdHMucHVzaCh0aGlzLmZpbmFsaXplUmVxdWVzdChyZXF1ZXN0UmVzb3VyY2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RzO1xuXHR9XG5cblx0aW5pdGlhbGl6ZVJlcXVlc3QgKCk6IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRyZXF1ZXN0VHlwZTogJ2NyZWF0ZScsXG5cdFx0XHRcdGl0ZW1zOiB7fSxcblx0XHRcdFx0Y29sdW1uczoge30sXG5cdFx0XHR9LFxuXHRcdFx0Y29sdW1uczogdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKSxcblx0XHRcdGl0ZW1zOiB7fSxcblx0XHRcdGNvbGxlY3Rpb25zOiB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmdldENvbGxlY3Rpb25NYXRjaGVyKCksXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgZXh0ZW5kUmVxdWVzdCAoXG5cdFx0aXRlbVZhbHVlczogSXRlbU1hcDxJbnRlcm5hbENyZWF0ZURlbHRhPixcblx0XHRyZXF1ZXN0UGFyZW50SWQ6IEl0ZW1JZCB8IG51bGwsXG5cdFx0ZGVzdGluYXRpb246IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0ID0gZGVzdGluYXRpb24ucmVxdWVzdDtcblx0XHRjb25zdCBpdGVtRW50cnlNYXAgPSBkZXN0aW5hdGlvbi5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaXRlbVZhbHVlcykge1xuXHRcdFx0aWYgKHJlcXVlc3QuaXRlbVR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXF1ZXN0Lml0ZW1UeXBlID0gaXRlbVR5cGUgYXMgSXRlbVR5cGVUeXBlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbUVudHJ5TWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGl0ZW1FbnRyeU1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdFx0cmVxdWVzdC5pdGVtc1tpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbVZhbHVlc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxDcmVhdGVEZWx0YTogSW50ZXJuYWxDcmVhdGVEZWx0YSA9IGl0ZW1WYWx1ZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGludGVybmFsQ3JlYXRlRGVsdGEuZW50cnk7XG5cblx0XHRcdFx0Y29uc3QgY2hpbGRFbnRyaWVzID0gZ2V0UGF0aChcblx0XHRcdFx0XHR0aGlzLmNvbXBpbGF0aW9uLFxuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBpdGVtUmVxdWVzdDogYW55ID0gcmVxdWVzdC5pdGVtc1tpdGVtVHlwZV1baXRlbUVudHJ5Lml0ZW1JZF0gPSB7fTtcblx0XHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhdGgoXG5cdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi50YWJSZXF1ZXN0UGFyYW1ldGVycyxcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAocmVxdWVzdFBhcmVudElkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0KHJlcXVlc3QucGFyZW50SWQgYXMge1tpdGVtSWQ6IHN0cmluZ106IEl0ZW1JZH0pW2l0ZW1FbnRyeS5pdGVtSWRdID0gcmVxdWVzdFBhcmVudElkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVzdGluYXRpb24uY29sdW1ucy5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIG5lZWQgdGhpcyA/XG5cdFx0XHRcdC8vIGRlc3RpbmF0aW9uLmNvbGxlY3Rpb25zLmV4cGFuZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdGl0ZW1FbnRyeU1hcFtpdGVtVHlwZV1baXRlbUlkXSA9IGl0ZW1FbnRyeTtcblxuXHRcdFx0XHRpdGVtUmVxdWVzdC52YWx1ZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXF1ZXN0TG9jYWwoXG5cdFx0XHRcdFx0aW50ZXJuYWxDcmVhdGVEZWx0YS5maWVsZHMsXG5cdFx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpdGVtUmVxdWVzdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcblxuXHRcdFx0XHRpZiAoY2hpbGRFbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGxpbmtzOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0gPSBpdGVtUmVxdWVzdC5saW5rcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY2hpbGRUeXBlIGluIGNoaWxkRW50cmllcykge1xuXHRcdFx0XHRcdGxpbmtzW2NoaWxkVHlwZV0gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGRJZCBpbiBjaGlsZEVudHJpZXNbY2hpbGRUeXBlXSkge1xuXHRcdFx0XHRcdFx0bGlua3NbY2hpbGRUeXBlXS5wdXNoKHBhcnNlSW50KFxuXHRcdFx0XHRcdFx0XHRjaGlsZElkLFxuXHRcdFx0XHRcdFx0XHQxMCxcblx0XHRcdFx0XHRcdCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRjaGlsZEVudHJpZXMsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEZpcnN0UHJvcGVydHkgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgZW51bSBPUEVSQVRPUlMge1xuXHRPUiA9ICdPUicsXG5cdEFORCA9ICdBTkQnXG59XG5cbmV4cG9ydCB0eXBlIE9QRVJBVE9SU19UWVBFID0gJ09SJyB8ICdBTkQnIHwgJ29yJyB8ICdhbmQnIHwgT1BFUkFUT1JTO1xuXG5leHBvcnQgZW51bSBDT01QQVJBVE9SUyB7XG5cdEVRVUFMUyA9ICc9Jyxcblx0Tk9UX0VRVUFMUyA9ICchPScsXG5cdExFU1NfVEhBTiA9ICc8Jyxcblx0TU9SRV9USEFOID0gJz4nLFxuXHRMRVNTX09SX0VRVUFMX1RIQU4gPSAnPD0nLFxuXHRFUVVBTF9PUl9NT1JFX1RIQU4gPSAnPj0nLFxuXHRJTiA9ICdJTidcbn1cblxuZXhwb3J0IHR5cGUgQ09NUEFSQVRPUlNfVFlQRSA9ICc9JyB8ICchPScgfCAnPCcgfCAnPicgfCAnPD0nIHwgJz49JyB8ICdJTicgfCBDT01QQVJBVE9SUztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF1ZXJ5UGFyc2VyQmFzZTxSZXR1cm5UeXBlIGV4dGVuZHMgYW55PiB7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcXVlcnk6IEFwaVF1ZXJ5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBwYXJzZSAocXVlcnk6IEFwaVF1ZXJ5ID0gdGhpcy5xdWVyeSk6IFJldHVyblR5cGUge1xuXHRcdGlmIChxdWVyeS5saW5rZWRUbyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUxpbmtlZFRvUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmxpbmtlZFRvLFxuXHRcdFx0XHRxdWVyeS5xdWVyeSxcblx0XHRcdFx0cXVlcnkucmV2ZXJzZSxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuY3VzdG9tICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlQ3VzdG9tUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmN1c3RvbSxcblx0XHRcdFx0cXVlcnkucGFyYW1ldGVycyxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuc2VhcmNoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU2VhcmNoUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LnNlYXJjaCxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuY29uZGl0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXhRdWVyeShcblx0XHRcdFx0cXVlcnkuY29uZGl0aW9ucyxcblx0XHRcdFx0cXVlcnkub3BlcmF0b3IsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5Lml0ZW1UeXBlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU3ViRmllbGRRdWVyeShcblx0XHRcdFx0cXVlcnkua2V5LFxuXHRcdFx0XHRxdWVyeS5pdGVtVHlwZSxcblx0XHRcdFx0cXVlcnkuZmllbGQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5rZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBxdWVyeS5xdWVyeSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTdWJRdWVyeShcblx0XHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdFx0cXVlcnkucXVlcnksXG5cdFx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVNpbXBsZVF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdHF1ZXJ5LnZhbHVlLFxuXHRcdFx0XHRxdWVyeS5jb21wYXJhdG9yLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtleSA9IGdldEZpcnN0UHJvcGVydHkocXVlcnkpO1xuXG5cdFx0aWYgKGtleSA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VFbXB0eVF1ZXJ5KCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWUgPSBxdWVyeVtrZXldO1xuXG5cdFx0Ly8gdHlwZW9mIG51bGwgaXMgYW4gb2JqZWN0IDp0aGlua2luZzpcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVN1YlF1ZXJ5KFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyc2VTaW1wbGVRdWVyeShcblx0XHRcdGtleSxcblx0XHRcdHZhbHVlLFxuXHRcdFx0cXVlcnkuY29tcGFyYXRvcixcblx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlRW1wdHlRdWVyeSAoKTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGZpZWxkOiBzdHJpbmcsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ3VzdG9tUXVlcnkgKFxuXHRcdGN1c3RvbTogc3RyaW5nLFxuXHRcdHBhcmFtZXRlcnM6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29tcGFyYXRvcjogQ09NUEFSQVRPUlNfVFlQRSxcblx0XHRub3Q/OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdHJldmVyc2U6IGJvb2xlYW4sXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUNvbXBsZXhRdWVyeSAoXG5cdFx0Y29uZGl0aW9uczogYW55W10sXG5cdFx0b3BlcmF0b3I6IE9QRVJBVE9SU19UWVBFLFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1uLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlNfVFlQRSB9IGZyb20gJy4vUXVlcnlQYXJzZXInO1xuaW1wb3J0IHsgT1BFUkFUT1JTX1RZUEUsIFF1ZXJ5UGFyc2VyQmFzZSB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5Q29sdW1uRXh0cmFjdG9yXG5cdGV4dGVuZHMgUXVlcnlQYXJzZXJCYXNlPEFwaVJlcXVlc3RDb2x1bW5bXT4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpIHtcblx0XHRzdXBlcihxdWVyeSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VFbXB0eVF1ZXJ5ICgpIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiBbe1trZXldOiB0aGlzLnBhcnNlKHN1YlF1ZXJ5KX1dO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0X2tleTogc3RyaW5nLFxuXHRcdF9pdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0X2ZpZWxkOiBzdHJpbmcsXG5cdFx0X3F1ZXJ5OiBBcGlRdWVyeSxcblx0XHRfbm90OiBib29sZWFuLFxuXHQpIHtcblx0XHRyZXR1cm4gW107XG5cdFx0Ly8gdG9kb1tjYWNoZV0gV2Ugc2hvdWxkIGV4cGFuZCB0aGUgcmVxdWVzdENvbHVtbnMgd2l0aCB7W2l0ZW1UeXBlXTogdGhpcy5wYXJzZShxdWVyeSl9IGJ1dCBjdXJyZW50bHkgY29sbGVjdGlvbnMgb25seSBhbGxvdyBmZXRjaGluZyBkaXJlY3QgY29sdW1uc1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2VhcmNoUXVlcnkgKFxuXHRcdF92YWx1ZTogYW55LFxuXHRcdF9ub3Q6IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVF1ZXJ5IChcblx0XHRfY3VzdG9tOiBzdHJpbmcsXG5cdFx0X3BhcmFtZXRlcnM6IGFueSxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVNpbXBsZVF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRfdmFsdWU6IGFueSxcblx0XHRfY29tcGFyYXRvcj86IENPTVBBUkFUT1JTX1RZUEUsXG5cdFx0X25vdD86IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBba2V5XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0X3F1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5LFxuXHRcdF9yZXZlcnNlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0X25vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayhcblx0XHRcdGxpbmtlZFRvLFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlQ29tcGxleFF1ZXJ5IChcblx0XHRjb25kaXRpb25zOiBhbnlbXSxcblx0XHRfb3BlcmF0b3I/OiBPUEVSQVRPUlNfVFlQRSxcblx0XHRfbm90PzogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyc2VDb25kaXRpb25zKGNvbmRpdGlvbnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUNvbmRpdGlvbnMgKGNvbmRpdGlvbnM6IGFueVtdKSB7XG5cdFx0cmV0dXJuIGNvbmRpdGlvbnMucmVkdWNlKFxuXHRcdFx0KFxuXHRcdFx0XHRhY2N1bXVsYXRvcixcblx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0KSA9PiBhY2N1bXVsYXRvci5jb25jYXQoXG5cdFx0XHRcdHRoaXMucGFyc2UoY29uZGl0aW9uKSxcblx0XHRcdCksXG5cdFx0XHRbXSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucywgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciB9IGZyb20gJy4uL0NvbGxlY3Rpb25NYXRjaGVyJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IFF1ZXJ5Q29sdW1uRXh0cmFjdG9yIH0gZnJvbSAnLi4vUXVlcnlDb2x1bW5FeHRyYWN0b3InO1xuaW1wb3J0IHsgaW5BcnJheSB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yIH0gZnJvbSAnLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIGVudHJpZXM6IENvbGxlY3Rpb25DYWNoZTtcblxuXHRwdWJsaWMgY29sbGVjdGlvbkNoYW5nZXM6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFtxdWVyeVN0cmluZzogc3RyaW5nXTogSXRlbUVudHJ5W11cblx0XHR9XG5cdH0gPSB7fTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuZW50cmllcyA9IGNvbGxlY3Rpb25DYWNoZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHNldENvbGxlY3Rpb25DaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbaXRlbVR5cGVdW3F1ZXJ5U3RyaW5nXSA9IGl0ZW1FbnRyaWVzO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25DaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiB1bmRlZmluZWQgfCBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXVtxdWVyeVN0cmluZ107XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFuZCBzdG9yZXMgaXQgaW4gdGhpcyB0cmFuc2FjdGlvbidzIHtAbGluayBDb2xsZWN0aW9uQ2FjaGUgQ29sbGVjdGlvbkNhY2hlfVxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uY29yZS5jb2xsZWN0aW9uRW50cnlGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXG5cdFx0dGhpcy5lbnRyaWVzLmFkZChjb2xsZWN0aW9uRW50cnkpO1xuXG5cdFx0dGhpcy5zZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRbXSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29yZS5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29yZS5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdChtYXRjaGVyVHlwZTogSXRlbVR5cGUpID0+IG1hdGNoZXJUeXBlID09PSBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVcblx0XHRcdFx0PyBbY29sbGVjdGlvbkVudHJ5XSBhcyBDb2xsZWN0aW9uRW50cnlbXVxuXHRcdFx0XHQ6IFtdLFxuXHRcdCk7XG5cblx0XHRjb25zdCB0cmFuc2FjdGlvbnM6IEFic3RyYWN0Q2FjaGVbXSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0VHJhbnNhY3Rpb25DaGFpbigpO1xuXG5cdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB0cmFuc2FjdGlvbnMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzID0gdHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyLmV4cGFuZChcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0Y2hhbmdlcyxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb2xsZWN0aW9uTWF0Y2hlci5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIHtAbGluayBDb2xsZWN0aW9uTWF0Y2hlciBDb2xsZWN0aW9uTWF0Y2hlcn0gd2l0aCB0aGUgdHJhbnNhY3Rpb24ncyBjb2xsZWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGdldENvbGxlY3Rpb25NYXRjaGVyICgpOiBDb2xsZWN0aW9uTWF0Y2hlcjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgY29sbGVjdGlvbnMgbGlua2VkIHRvIHRoZSBwYXNzZWQgcGFyZW50c1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSB8ICgoKSA9PiBJdGVtSWRbXSksXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb25zIHdpdGggdGhlIHBhc3NlZCBjb2x1bW5zXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZXhwYW5kQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXh0ZW5kcyB0aGUgY29sbGVjdGlvbnMnIHtAbGluayBDb2xsZWN0aW9uRW50cnkucXVlcnlQYXJhbXMgcXVlcnlQYXJhbXN9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5LnF1ZXJ5IHF1ZXJpZXN9IGFuZCBmZXRjaGVzIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB3aXRoIHRoZSBuZXcgcXVlcmllc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gdG8gdGhlIGNvbGxlY3Rpb24ncyBjaGFuZ2VzIG9uIHRoZSB0cmFuc2FjdGlvbixcblx0ICogd2lsbCBza2lwIHRoZSBJdGVtRW50cnkgaWYgdGhlIGBza2lwRW50cnlGaWx0ZXJGbmAgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWBcblx0ICovXG5cdHByb3RlY3RlZCBfYWRkSXRlbUVudHJpZXNUb0NvbGxlY3Rpb25DaGFuZ2VzPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdFx0c2tpcEVudHJ5RmlsdGVyRm46ICh0ZW1FbnRyeTogSXRlbUVudHJ5KSA9PiBib29sZWFuLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChpdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0KTtcblxuXHRcdGlmIChjaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhZGRlZEl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0Y2hhbmdlcy5pbmRleE9mKGl0ZW1FbnRyeSkgIT09IC0xXG5cdFx0XHRcdHx8IHNraXBFbnRyeUZpbHRlckZuKGl0ZW1FbnRyeSlcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y2hhbmdlcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2soXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGFkZGVkRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyByZW1vdmVJdGVtRW50cmllc0Zyb21Db2xsZWN0aW9uQ2hhbmdlcyAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0aWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRpZiAoaWRBcnJheS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0KTtcblxuXHRcdGlmIChjaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByZW1vdmVkSXRlbUVudHJpZXMgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuZmlsdGVyQXJyYXkoXG5cdFx0XHRjaGFuZ2VzLFxuXHRcdFx0aXRlbUVudHJ5ID0+ICFpbkFycmF5KFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRpZEFycmF5LFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuaGFuZGxlUmVtb3ZlZEl0ZW1FbnRyaWVzQ2FsbGJhY2soXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMsXG5cdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgaGFuZGxlUmVtb3ZlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRyZW1vdmVkSXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbixcblx0KTogdm9pZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4cGFuZHMgdGhlIG9wdGlvbidzIHtAbGluayBDb2xsZWN0aW9uRW50cnlPcHRpb25zLmNvbHVtbnMgY29sdW1uc30gd2l0aCB0aGUgY29sdW1ucyByZXF1aXJlZCBmb3IgdGhlIHtAbGluayBDb2xsZWN0aW9uTWF0Y2hlciBDb2xsZWN0aW9uTWF0Y2hlcn0gdG8gZnVuY3Rpb24uXG5cdCAqIERhdGEgZmV0Y2hlZCBmb3IgYSBwYXJlbnQgdHJhbnNhY3Rpb24gbWlnaHQgYWxzbyBmaXQgaW4gYSBjaGlsZCB0cmFuc2FjdGlvbiwgc28gdGhvc2Uge0BsaW5rIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMucXVlcnlDb2x1bW5zIHF1ZXJ5Q29sdW1uc30gc2hvdWxkIGFsc28gYmUgdGFrZW4gaW50byBhY2NvdW50XG5cdCAqL1xuXHRwcm90ZWN0ZWQgZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uRXh0cmFjdG9yID0gbmV3IFF1ZXJ5Q29sdW1uRXh0cmFjdG9yKFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRxdWVyeSxcblx0XHQpO1xuXG5cdFx0b3B0aW9ucy5xdWVyeUNvbHVtbnMgPSBjb2x1bW5FeHRyYWN0b3IucGFyc2UoKTtcblxuXHRcdC8vIGFscmVhZHkgaGF2ZSBhbGwgY29sdW1ucywgc28gY2FuJ3QgZXhwYW5kIHRoZW1cblx0XHRpZiAob3B0aW9ucy5jb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5xdWVyeUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZ2V0KClbaXRlbVR5cGVdO1xuXHR9XG59XG4iLCJpbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRBcGlSZXNwb25zZVByb2Nlc3Nvcixcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvbk1hdGNoZXIsXG5cdENvbGxlY3Rpb25RdWVyeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdGlzRnVuY3Rpb24sXG5cdEl0ZW1FbnRyeU9wdGlvbnMsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuLi8uLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5cbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL1NlcnZlckl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGNsYXNzIFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyXG5cdGV4dGVuZHMgQ29sbGVjdGlvbkhhbmRsZXJCYXNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBpdGVtSGFuZGxlcjogU2VydmVySXRlbUhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogU2VydmVyQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMoe1xuXHRcdFx0XHRcdGNvbHVtbnM6IG9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0XHRwYXJlbnQ6IG9wdGlvbnMucGFyZW50LFxuXHRcdFx0XHRcdHF1ZXJ5OiBxdWVyeSxcblx0XHRcdFx0fSksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nXSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4ob3B0aW9ucy5jb2x1bW5zKTtcblxuXHRcdHJldHVybiB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHBhcnNlZFF1ZXJ5LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdIHwgKCgpID0+IEl0ZW1JZFtdKSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiB7W3BhcmVudElkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeT59ID0ge307XG5cblx0XHRpZiAoaXNGdW5jdGlvbjwoKSA9PiBJdGVtSWRbXT4ocGFyZW50SWRBcnJheSkpIHtcblx0XHRcdHBhcmVudElkQXJyYXkgPSBwYXJlbnRJZEFycmF5KCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRjb25zdCBuZXdPcHRpb25zID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogcGFyZW50SWQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkobmV3T3B0aW9ucyk7XG5cblx0XHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXSBzaG91bGQgdGhpcyBiZSBpbiBhIGxvb3A/IGV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zIGNhbiBjaGFuZ2UgdGhlIGNvbHVtbnNcblx0XHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG5ld09wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRcdHByb21pc2VzW3BhcmVudElkXSA9IHRoaXMuZmV0Y2hDb2xsZWN0aW9uRGF0YShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCBleHRlbmRlZFF1ZXJ5ID0gY29sbGVjdGlvbkVudHJ5LmV4dGVuZFF1ZXJ5KHF1ZXJ5Q2FsbGJhY2spLm9iamVjdDtcblx0XHRjb25zdCBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuY3JlYXRlTm90SW4oXG5cdFx0XHRcdHRoaXNcblx0XHRcdFx0XHQuZ2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRcdCkhXG5cdFx0XHRcdFx0Lm1hcChcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdCksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMsXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCAhPT0gbnVsbCkge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cmVxdWVzdFR5cGU6ICdxdWVyeScsXG5cdFx0XHRcdFx0aXRlbVR5cGU6IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRjb2x1bW5zOiB7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnN9LFxuXHRcdFx0XHRcdHF1ZXJ5OiBleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0XHRcdGxpbWl0OiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRmdWxsUXVlcnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlID0gcHJvbWlzZTtcblxuXHRcdHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0ZGVsZXRlIGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlO1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld1JlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IHtcblx0XHRpZiAobmV3UmVxdWVzdENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25zKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Ly8gVE9ETzogZmlsdGVyIGxvY2FsIGl0ZW1zP1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bmV3UmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG5ld1JlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgb2YgcGFyZW50SWRBcnJheSkge1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbnM7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGlmICghaGFzUHJvcGVydGllcyhjb2xsZWN0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXHRcdGxldCBpdGVtSWRBcnJheTogSXRlbUlkW10gPSBbXTtcblxuXHRcdG9wdGlvbnMucXVlcnlQYXJhbXMgPSBxdWVyeUNhbGxiYWNrKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRjb2xsZWN0aW9uRW50cnkuZXh0ZW5kUXVlcnkocXVlcnlDYWxsYmFjayk7XG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHRcdGl0ZW1JZEFycmF5ID0gaXRlbUlkQXJyYXkuY29uY2F0KFxuXHRcdFx0XHR0aGlzXG5cdFx0XHRcdFx0LmdldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XHQpIVxuXHRcdFx0XHRcdC5tYXAoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkQW5kQ29uZGl0aW9uKFxuXHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKS5vYmplY3QsXG5cdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuY3JlYXRlTm90SW4oaXRlbUlkQXJyYXkpLFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0c3VwZXIuX2FkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Ly8gTG9jYWwgSXRlbUVudHJpZXMgZG9uJ3QgYmVsb25nIGluIHJlbW90ZSBjb2xsZWN0aW9uIGNoYW5nZXNcblx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXNMb2NhbCgpLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFeHBhbmRzIHRoZSBjb2x1bW5zIG9mIHRoZSBpdGVtcyBpbiB0aGUgY29sbGVjdGlvblxuXHQgKi9cblx0cHVibGljIGV4cGFuZENvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCB7bWVyZ2VkLCBkaWZmZXJlbmNlfSA9IGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zLm1lcmdlUmVxdWVzdENvbHVtbnMobmV3Q29sdW1ucyk7XG5cblx0XHRpZiAoZGlmZmVyZW5jZSAhPT0gdHJ1ZSAmJiBkaWZmZXJlbmNlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9uRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0bGV0IHByb21pc2U7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMubGltaXQgIT09IG51bGwpIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJlcXVlc3RUeXBlOiAncXVlcnknLFxuXHRcdFx0XHRcdGl0ZW1UeXBlOiBpdGVtVHlwZSxcblx0XHRcdFx0XHRjb2x1bW5zOiBtZXJnZWQsXG5cdFx0XHRcdFx0cXVlcnk6IGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0bGltaXQ6IGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmxpbWl0LCAvLyB0b2RvW2NhY2hlXSBhY3R1YWxseSBpbXBsZW1lbnQgbGltaXQgPyBDdXJyZW50bHkgZG9lbnMndCByZWFsbHkgd29ya1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG1lcmdlZCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb21pc2Vcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0bWVyZ2VkLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5leHBhbmRDb2x1bW5zKGNvbHVtbkV4cGFuc2lvbik7XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sdW1uRXhwYW5zaW9uO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0X2NvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRhZGRlZEVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChhZGRlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gT25seSB1c2VkIGluIHRoZSBmcm9udGVuZCBwbGFubmVyXG5cdFx0Ly8gY29sbGVjdGlvbkVudHJ5Lm9uQWRkSW5pdGlhbChhZGRlZEVudHJpZXMpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhbmRsZVJlbW92ZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRfY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0aWYgKHJlbW92ZWRJdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBPbmx5IHVzZWQgaW4gdGhlIGZyb250ZW5kIHBsYW5uZXJcblx0XHQvLyBjb2xsZWN0aW9uRW50cnkub25SZW1vdmVJbml0aWFsKHJlbW92ZWRJdGVtRW50cmllcyk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBwYXNzZWQgSXRlbVR5cGUvb3B0aW9ucywgd2lsbCBkbyBub3RoaW5nIGlmIHRoZSByZXF1ZXN0ZWQgQ29sbGVjdGlvbkVudHJ5L2NvbHVtbnMgYXJlIGFscmVhZHkgY2FjaGVkLlxuXHQgKiBXaWxsIGNyZWF0ZSBhIG5ldyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gaWYgdGhlIENvbGxlY3Rpb25FbnRyeSBkaWRuJ3QgZXhpc3QgeWV0XG5cdCAqL1xuXHRwcml2YXRlIGZldGNoQ29sbGVjdGlvbkRhdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0Y29sbGVjdGlvblF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRsZXQgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldEJ5UXVlcnkoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25RdWVyeSxcblx0XHQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gbnVsbCAmJiBjb2x1bW5TdWJzZXRDYWNoZS5ydW4oY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHQvLyBUaGVyZSBhbHJlYWR5IGlzIGFuIGVudHJ5IGFuZCBpdCBjb250YWlucyB0aGUgY29sdW1ucyB3ZSBuZWVkLCBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybiBpdFxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9uRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzTmV3bHlDcmVhdGVkQ29sbGVjdGlvbkVudHJ5OiBib29sZWFuID0gY29sbGVjdGlvbkVudHJ5ID09PSBudWxsO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSA9PT0gbnVsbCkge1xuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChvcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHtbaXRlbVR5cGVdOiBvcHRpb25zLmNvbHVtbnN9O1xuXG5cdFx0XHRsZXQgcmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yO1xuXG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHQucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlcXVlc3RUeXBlOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sdW1uczogcmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0XHRxdWVyeTogb3B0aW9ucy5xdWVyeSxcblx0XHRcdFx0XHRcdGxpbWl0OiBvcHRpb25zLmxpbWl0LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdClcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0X3Jlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gX3Jlc3BvbnNlO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0KVxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHQoKSA9PiByZXNwb25zZSxcblx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHRcdC5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvblF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25RdWVyeS5zdHJpbmcsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRpZiAoaXNOZXdseUNyZWF0ZWRDb2xsZWN0aW9uRW50cnkpIHtcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSEuY29sdW1ucyA9IHRoaXMudHJhbnNhY3Rpb24uY29yZS5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkhLmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHtcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxuXHRRdWVyeVBhcnNlckZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgfSBmcm9tICcuLi8uLi9DcmVhdGVkQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdENvbHVtbkV4cGFuc2lvbixcblx0Q29sdW1uU2V0LFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Q29sdW1uVXRpbCxcblx0UXVlcnlTZXJ2aWNlLFxuXHRSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0UmVxdWVzdEJ1ZmZlclJlc3BvbnNlLFxuXHRUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEl0ZW1IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0l0ZW1IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vU2VydmVyQ2FjaGUnO1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT47XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJJdGVtSGFuZGxlclxuXHRleHRlbmRzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIGl0ZW1DaGFuZ2VzOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzXG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJpdmF0ZSBxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0ZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0YXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFNlcnZlckNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1FbnRyeSAoXG5cdFx0Y3JlYXRlVHVwbGU6IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSxcblx0KTogSXRlbUVudHJ5IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSBzdXBlci5jcmVhdGVJdGVtRW50cnkoY3JlYXRlVHVwbGUpO1xuXG5cdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0gY3JlYXRlVHVwbGUuZmllbGRzO1xuXG5cdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUHJvY2Vzc2VzIHVwZGF0ZXMgb24gYSBjYWNoZWQgZW50cnlcblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXNUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZT4sXG5cdFx0X2ZvcmNlT3ZlcndyaXRlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0X3VwZGF0ZUluaXRpYWw6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRfaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdF9jcmVhdGVJdGVtQ2hhbmdlc0lmTm9uZUV4aXN0OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4gfCBudWxsIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cnlDaGFuZ2VzVHVwbGUuZW50cnk7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5jaGFuZ2VzO1xuXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgIT09IG51bGwpIHtcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zID0gY2hhbmdlcy5leHBhbmRlZENvbHVtbnMubWVyZ2VkO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByZXZpb3VzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHRcdHt9LFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0dGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGVzdFxuXHRcdGlmIChjaGFuZ2VzLmZpZWxkcy5pZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpdGVtRW50cnkuaXRlbUlkID0gY2hhbmdlcy5maWVsZHMuaWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByZXZpb3VzO1xuXHR9XG5cblx0cHVibGljIGNvcHlUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMgKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXM6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyxcblx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHQpOiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzIHtcblx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGl0ZW1FbnRyeUNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0ZW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRvcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0ZW50cnlPcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGVudHJ5T3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5XG5cdFx0XHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZFBhcmVudENvbmRpdGlvbihcblx0XHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRcdGVudHJ5T3B0aW9ucy5wYXJlbnQsXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQucGFyc2UoKSxcblx0XHRcdFx0ZW50cnlPcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgcmVzcG9uc2UubGlua3NbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gaXRlbUVudHJpZXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRvcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKTtcblx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTx2b2lkPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuZmV0Y2hJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMucHVzaChcblx0XHRcdFx0XHRcdFx0dGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdCkhLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gaXRlbUVudHJpZXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBJdGVtRW50cmllcyBsaW5rZWQgdG8gdGhlIHBhcmVudCBJdGVtc1xuXHQgKlxuXHQgKiBAcGFyYW0gY29sdW1ucyBzaG91bGQgY29udGFpbiBhIGRlcml2ZWQgY29sdW1uIHRoYXQgcmVmZXJzIHRvIHRoZSBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyBmZXRjaExpbmtlZEl0ZW1FbnRyaWVzRGF0YSAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gcXVlcnkgPT09IG51bGwgP1xuXHRcdFx0dGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5SWRzKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KSA6XG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5XG5cdFx0XHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsaW5rZWRUbzogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0XHRxdWVyeToge2lkOiBwYXJlbnRJZEFycmF5fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5wYXJzZSgpLFxuXHRcdFx0XHQvLyBzaG91bGQgY29udGFpbiBhIGRlcml2ZWQgY29sdW1uIHRoYXQgcmVmZXJzIHRvIHRoZSBwYXJlbnRcblx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdlbmVyYWwgd2F5IHRvIHByb2Nlc3MgYW4gQVBJIHJlc3BvbnNlLlxuXHQgKiBXaWxsIGNhbGwge0BsaW5rIENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZCBzZXRJdGVtQ3JlYXRlZH0gaWYgYW4gZW50cnkgZG9lc24ndCBleGlzdCB5ZXQsIGFuZCBvdGhlcndpc2Uge0BsaW5rIENoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZCBzZXRJdGVtVXBkYXRlZH0gaWYgaXQgZG9lcy5cblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzQXBpUmVzcG9uc2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbkV4cGFuc2lvbjogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IHZvaWQge1xuXHRcdC8vIFdlIHNob3VsZCByZS1jaGVjayBpZiBhbiBlbnRyeSBpcyBub3QgY3JlYXRlZCBpbiB0aGUgbWVhbnRpbWVcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGZpZWxkcyA9IHJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGaWVsZHMgbm90IGZvdW5kIGluIHJlc3BvbnNlIGZvciAke2l0ZW1UeXBlfToke2l0ZW1JZH1gKTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5fc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24ucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgcGFzc2VkIEl0ZW1UeXBlL0l0ZW1JZC9jb2x1bW5zLCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlIHJlcXVlc3RlZCBJdGVtRW50cnkvY29sdW1ucyBhcmUgYWxyZWFkeSBjYWNoZWQuXG5cdCAqIFdpbGwgY3JlYXRlIGEgbmV3IHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBpZiB0aGUgSXRlbUVudHJ5IGRpZG4ndCBleGlzdCB5ZXRcblx0ICovXG5cdHByaXZhdGUgZmV0Y2hJdGVtRW50cnlEYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uU3Vic2V0Q2FjaGUucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0Ly8gVGhlcmUgYWxyZWFkeSBpcyBhbiBlbnRyeSBhbmQgaXQgY29udGFpbnMgdGhlIGNvbHVtbnMgd2UgbmVlZCwgc28gd2UgY2FuIHNhZmVseSByZXR1cm4gaXRcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlJZChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUucmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBub29wLCBSbUNvcmUgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlRGVwZW5kZW5jeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRFbnRyeVBhcmVudCxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vLi4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgT25BZnRlckNyZWF0ZUNhbGxiYWNrIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc1Byb2Nlc3Nvcic7XG5pbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi8uLi9Db2x1bW5TZXQnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yIH0gZnJvbSAnLi4vQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlciB9IGZyb20gJy4vU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL1NlcnZlckl0ZW1IYW5kbGVyJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSB7QGxpbmsgU2VydmVyQ2FjaGUgU2VydmVyQ2FjaGV9IGlzIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyaWVzfVxuICogd2hpY2ggYXJlIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuXG4gKlxuICogSXQncyBiYXNpY2FsbHkgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YWJhc2VcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZlckNhY2hlXG5cdGV4dGVuZHMgQWJzdHJhY3RDYWNoZSB7XG5cblx0cHVibGljIHJlYWRvbmx5IGl0ZW1IYW5kbGVyOiBTZXJ2ZXJJdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcjtcblxuXHRwdWJsaWMgcGFyZW50OiBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGRlcGVuZGVuY2llczogU2VydmVyQ2FjaGVEZXBlbmRlbmN5SW50ZXJmYWNlLFxuXHRcdGNvcmU6IFJtQ29yZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRkZXBlbmRlbmNpZXMsXG5cdFx0XHRjb3JlLFxuXHRcdCk7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyID0gbmV3IFNlcnZlckl0ZW1IYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdGRlcGVuZGVuY2llcy5xdWVyeVNlcnZpY2UsXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlcixcblx0XHRcdGRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2x1bW5VdGlsLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmFwaUZvcm1hdHRlcixcblx0XHRcdGRlcGVuZGVuY2llcy5pdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGRlcGVuZGVuY2llcy5yZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdGRlcGVuZGVuY2llcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLFxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlcixcblx0XHRcdGRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5xdWVyeVNlcnZpY2UsXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sdW1uVXRpbCxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NSZXNwb25zZSAoXG5cdFx0cmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yLFxuXHRcdHJlcXVlc3RDb2x1bW5NYXA6IEFwaVJlcXVlc3RDb2x1bW5NYXAsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEgPSB0aGlzLmNvcmUuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnNPYmplY3QgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2UuaXRlbXMpIHtcblx0XHRcdGxldCBjb2x1bW5TZXQ6IENvbHVtblNldDtcblxuXHRcdFx0aWYgKGl0ZW1UeXBlID09PSByZXNwb25zZS5pdGVtVHlwZSkge1xuXHRcdFx0XHRjb2x1bW5TZXQgPSB0aGlzLmNvcmUuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVxdWVzdENvbHVtbk1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zT2JqZWN0LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29sdW1uU2V0ID0gdGhpcy5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb3JlLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogY29sdW1uU2V0LnJlcXVlc3QsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUlkU3RyaW5nIGluIHJlc3BvbnNlLml0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZFN0cmluZyksXG5cdFx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGFuZ2VzRGVsdGEgY3JlYXRlZCBieSB0aGUgQVBJIGNhbGwgKHtAbGluayBDaGFuZ2VzUHJvY2Vzc29yIENoYW5nZXNQcm9jZXNzb3J9L3tAbGluayBTb2NrZXRNZXNzYWdlSGFuZGxlciBTb2NrZXRNZXNzYWdlSGFuZGxlcn0sIG9yIG1hbnVhbGx5IHRocm91Z2ggYSBtb2R1bGUgZnVuY3Rpb24pIG9uIGFsbCBjYWNoZXNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tUGFyZW50IChcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF0sXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcblx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBmaWVsZHMgcmVxdWlyZWQgdG8gc2V0IHRoZSBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyBnZXRMaW5rRmllbGRzQnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50LFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCk6IFBhcnRpYWw8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGxpbmtUcmVlID0gdGhpcy5kZXBlbmRlbmNpZXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cdFx0Y29uc3QgcmVzdWx0OiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRyZXN1bHRbbGlua1RyZWVFbnRyeS5maWVsZF0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQuaXRlbXR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgZW50cnkgdG8gZ2V0IHRoZSBwYXJlbnQgZnJvbVxuXHQgKiBAcGFyYW0gX2Zyb21Jbml0aWFsIFVudXNlZCBwYXJhbWV0ZXIsIHRoZXJlIGZvciBhbGlnbm1lbnQgd2l0aCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnRdXG5cdCAqIEBwYXJhbSBfcHJvdmlkZWRGaWVsZHMgVW51c2VkIHBhcmFtZXRlciwgdGhlcmUgZm9yIGFsaWdubWVudCB3aXRoIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudF1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBVc2Uge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5nZXRQYXJlbnQgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudH0gaW5zdGVhZCBvZiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnR9IGlmIHlvdSdyZSBnZXR0aW5nIHRoZSBwYXJlbnQgaW4gdGhlIG9uUmVtb3ZlIGNhbGxiYWNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRfZnJvbUluaXRpYWw6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdF9wcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXM7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdFx0Y2hhbmdlcyxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBObyBsb2NhbCBlbnRyeSBmb3VuZGApO1xuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvcihgTm8gbG9jYWwgZmllbGRzIGZvdW5kIGZvciBJdGVtRW50cnkgd2l0aCBJdGVtVHlwZSAnJHtpdGVtRW50cnkuaXRlbVR5cGV9J2ApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBPbmx5IHRha2VzIHRoZSBsb2NhbCBjaGFuZ2VzIGludG8gYWNjb3VudCwgdXNlZCBmb3Igc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IHtcblx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNoYW5nZXM6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXNcblx0fSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZ2V0IGEgbG9jYWwgSXRlbUVudHJ5IHdpdGggZW50cnlJZCAnJHtpdGVtRW50cnlJZH0nIGJ1dCBjb3VsZG4ndCBmaW5kIGl0YCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGVudHJ5OiBpdGVtRW50cnksXG5cdFx0XHRjaGFuZ2VzOiB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBJdGVtRW50cnlbXSB7XG5cdFx0Y29uc3QgZW50cnkgPSB0aGlzLmdldExvY2FsQ29sbGVjdGlvbkVudHJ5KGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRsZXQgY2hhbmdlcyA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRlbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNoYW5nZXMgPSBbXTtcblxuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLnNldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdGVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdGVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY2hhbmdlcztcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIGxvY2FsIGNvbGxlY3Rpb24gaXRlbXMgZm91bmQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSW52YWxpZGF0ZXMgdGhlIGNvbXBsZXRlIHNlcnZlciBjYWNoZSwgYWxsIGl0ZW1zIHdpbGwgYmUgcmUtZmV0Y2hlZCB3aGVuZXZlciB0aGV5IGFyZSByZXF1ZXN0ZWRcblx0ICovXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ2FjaGUgKCk6IHZvaWQge1xuXHRcdC8vIHRoZSBpdGVtSGFuZGxlciBjYWNoZSBvbmx5IGNvbnRhaW5zIHJlbW90ZSBlbnRyaWVzXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LnF1ZXVlUmVsb2FkKCksXG5cdFx0KTtcblxuXHRcdC8vIHF1ZXVlUmVsb2FkIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciBlYWNoIGluZGl2aWR1YWwgaXRlbVxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5mb3JFYWNoKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IGNvbGxlY3Rpb25FbnRyeS5xdWV1ZVJlbG9hZCgpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoYW5nZXMgZnJvbSB0aGUgY2hpbGQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHNob3VsZG4ndCB0aGlzIGRvIGV2ZXJ5dGhpbmcgZnJvbSBUcmFuc2FjdGlvbkNhY2hlLnNhdmUgP1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdFx0YnJlYWtVcEJ5UGFyZW50LFxuXHRcdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHQpXG5cdFx0XHQuZXhlY3V0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIGNoYW5nZXMgdG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgaXRzIGNoaWxkcmVuXG5cdCAqIERpZmZlcnMgZnJvbSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhfSBpbiB0aGUgaGFuZGxpbmcgb2YgZGVsZXRlZCBlbnRyaWVzIGFuZCB0aGUgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBjYWxsXG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlDaGFuZ2VzRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlOiBib29sZWFuID0gdHJ1ZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKGNoYW5nZXNEZWx0YS5pc0VtcHR5KCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdFx0cm9sbGJhY2s6IG5vb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hVcGRhdGVkRGVyaXZlZFZhbHVlc0Zyb21EZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtyZXN1bHQsIGludGVybmFsQ2hhbmdlc0RlbHRhLCByb2xsYmFja0Z1bmN0aW9uc30gPSBzdXBlci5fYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb2xkQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRkZWxldGUgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9sZENoYW5nZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHRcdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0aXNDYWxsZWRBZnRlckFwaVNhdmUsXG5cdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5QnlRdWVyeVN0cmluZyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5UXVlcnlTdHJpbmcoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoY29sbGVjdGlvbkVudHJ5SWQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGNoYW5nZXNPYmplY3Q6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIGNoYW5nZXNPYmplY3Q7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbGxlY3Rpb25RdWVyeSwgSXRlbUVudHJ5TWFwLCBJdGVtRW50cnlQYXJlbnRJZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ2FjaGUge1xuXG5cdHByaXZhdGUgZW50cmllczogSXRlbUVudHJ5TWFwPGFueT4gPSB7fTtcblxuXHRwdWJsaWMgZW50cmllc0J5RW50cnlJZDoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdldEJ5RW50cnlJZCAoaXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnlJZF07XG5cdH1cblxuXHRzb21lIChjYWxsYmFjazogKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGlmIChjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Z2V0QnlJdGVtVHlwZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2l0ZW1JZF0pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBlbnRyaWVzW2l0ZW1JZF07XG5cblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5tYXRjaFF1ZXJ5KFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldExvY2FsQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXG5cdFx0XHRpZiAoIWl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLm1hdGNoUXVlcnkoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldEJ5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBlbnRyaWVzW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpO1xuXG5cdFx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0aWYgKHBhcmVudC5pdGVtVHlwZSA9PT0gcGFyZW50VHlwZSAmJiBwYXJlbnQuaXRlbUlkID09IHBhcmVudElkKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGJhdGNoR2V0TG9jYWxCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkczogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRhZGRpdGlvbmFsUXVlcnk6IGFueSxcblx0KTogSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIG9mIHBhcmVudElkcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IFtdO1xuXHRcdH1cblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhcmVudC5pdGVtVHlwZSAhPT0gcGFyZW50VHlwZSB8fCByZXN1bHRbcGFyZW50Lml0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFF1ZXJ5ID09PSBudWxsIHx8IHRoaXMubWF0Y2hRdWVyeShcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRhZGRpdGlvbmFsUXVlcnksXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdFtwYXJlbnQuaXRlbUlkXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZvckVhY2ggKFxuXHRcdGNhbGxiYWNrOiAoXG5cdFx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHQpID0+IHZvaWQsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qXHRmaWx0ZXIgKGNhbGxiYWNrOiAoaXRlbUVudHJ5OiBJdGVtRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IEl0ZW1FbnRyeU1hcCA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0IGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0IGlmIChjYWxsYmFjayhpdGVtRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdID0gaXRlbUVudHJ5O1xuXHQgfVxuXHQgfVxuXG5cdCB0aGlzLmVudHJpZXMgPSBmaWx0ZXJlZEVudHJpZXM7XG5cdCB9XG5cdCAqL1xuXHR0b0FycmF5ICgpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGFkZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnkuaWRdID0gaXRlbUVudHJ5O1xuXG5cdFx0cmV0dXJuIGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1FbnRyeS5pdGVtSWRdID0gaXRlbUVudHJ5O1xuXHR9XG5cblx0Z2V0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogdW5kZWZpbmVkIHwgSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHQvLyBzaG91bGQgYmUgZmFzdFxuXHRjb250YWlucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dXBkYXRlSXRlbUlkPFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55Pj4gKFxuXHRcdGl0ZW1FbnRyeTogVCxcblx0XHRvbGRJdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogVCB7XG5cdFx0Y29uc3QgZW50cnlNYXAgPSB0aGlzLmVudHJpZXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGRlbGV0ZSBlbnRyeU1hcFtvbGRJdGVtSWRdO1xuXHRcdHJldHVybiBlbnRyeU1hcFtpdGVtRW50cnkuaXRlbUlkXSA9IGl0ZW1FbnRyeTtcblx0fVxuXG5cdGNsZWFyIChpdGVtRW50cnk/OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5lbnRyaWVzID0ge307XG5cdFx0XHR0aGlzLmVudHJpZXNCeUVudHJ5SWQgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXJCeUl0ZW1JZChcblx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdGNsZWFyQnlJdGVtSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCFlbnRyaWVzLmhhc093blByb3BlcnR5KGl0ZW1JZCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRkZWxldGUgdGhpcy5lbnRyaWVzQnlFbnRyeUlkW2VudHJpZXNbaXRlbUlkXS5pZF07XG5cblx0XHRyZXR1cm4gZGVsZXRlIGVudHJpZXNbaXRlbUlkXTtcblx0fVxuXG5cdG1hdGNoUXVlcnkgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdHVwbGUgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKGl0ZW1FbnRyeS5pZCk7XG5cblx0XHRyZXR1cm4gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdCh0aGlzLnRyYW5zYWN0aW9uIGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpXG5cdFx0XHRcdFx0PyB0dXBsZS5jaGFuZ2VzXG5cdFx0XHRcdFx0OiB0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGl0ZW1FbnRyeSksXG5cdFx0XHQpXG5cdFx0XHQubWF0Y2hRdWVyeShxdWVyeS5vYmplY3QpID09PSB0cnVlOyAvLyBUT0RPOiBtYXliZT9cblx0fVxufVxuIiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBBTExfUEVSTUlTU0lPTlMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXV0aEludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0RW50cnlQYXJlbnQsXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0RmllbGRNYXAsXG5cdEl0ZW1FcnJvcixcblx0SXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1UeXBlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlTZXJ2aWNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIG1hdGNoUGFyZW50IChcblx0XHRvbGRQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG9sZFBhcmVudCA9PT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdChvbGRQYXJlbnQgPT09IG51bGwgJiYgbmV3UGFyZW50ICE9PSBudWxsKVxuXHRcdFx0fHwgKG9sZFBhcmVudCAhPT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGhleSBjYW4ndCBiZSBudWxsIGFueW1vcmUgaGVyZSByaWdodCA/XG5cdFx0cmV0dXJuIChcblx0XHRcdG9sZFBhcmVudCEuaXRlbVR5cGUgPT09IG5ld1BhcmVudCEuaXRlbVR5cGVcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHQmJiBvbGRQYXJlbnQhLml0ZW1JZCA9PSBuZXdQYXJlbnQhLml0ZW1JZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGZpZWxkcyByZXF1aXJlZCB0byBzZXQgdGhlIHBhcmVudFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldFBhcmVudEJ5RmllbGRzIEl0ZW1FbnRyeVNlcnZpY2UuZ2V0UGFyZW50QnlGaWVsZHN9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IFBhcnRpYWw8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4gPSB7fTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5LnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdHJlc3VsdFtsaW5rVHJlZUVudHJ5LmZpZWxkXSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdC5pdGVtdHlwZSA9IHBhcmVudC5pdGVtVHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtID0gcGFyZW50Lml0ZW1JZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIGFuIHtAbGluayBFbnRyeVBhcmVudCBFbnRyeVBhcmVudH0gb2JqZWN0IGZyb20gdGhlIGZpZWxkc1xuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudCBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudH1cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnRCeUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnRUeXBlXVtpdGVtRW50cnkuaXRlbVR5cGUgYXMgc3RyaW5nXTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm9uIGV4aXN0aW5nIGxpbmsgYmV0d2VlbiAnJHtwYXJlbnRUeXBlfSctPicke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBFbnRyeVBhcmVudCA9IHt9IGFzIEVudHJ5UGFyZW50O1xuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLkRJUkVDVCkge1xuXHRcdFx0cmVzdWx0Lml0ZW1UeXBlID0gcGFyZW50VHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHNbbGlua1RyZWVFbnRyeS5maWVsZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGFscmVhZHkga25vdyB0aGUgcGFyZW50VHlwZT9cblx0XHRcdHJlc3VsdC5pdGVtVHlwZSA9IGZpZWxkcy5pdGVtdHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHMuaXRlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGdldERpc3BsYXlOYW1lPEl0ZW1FbnRyeVR5cGUgZXh0ZW5kcyBJdGVtRW50cnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0KTogc3RyaW5nIHtcblxuXHRcdHN3aXRjaCAoaXRlbUVudHJ5Lml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdFx0cmV0dXJuIGZpZWxkcy50eXBlID09PSAnYmVkcmlqZidcblx0XHRcdFx0XHQ/IGZpZWxkcy5iZWRyaWpmXG5cdFx0XHRcdFx0OiB0aGlzLmdldEZ1bGxOYW1lKFxuXHRcdFx0XHRcdFx0ZmllbGRzLnZvb3JuYWFtLFxuXHRcdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0XHRmaWVsZHMubmFhbSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnTWVkZXdlcmtlcic6XG5cdFx0XHRjYXNlICdQZXJzb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRGdWxsTmFtZShcblx0XHRcdFx0XHRmaWVsZHMudm9vcm5hYW0sXG5cdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0ZmllbGRzLmFjaHRlcm5hYW0sXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmllbGRzW3RoaXMuZ2V0VGl0bGVGaWVsZChpdGVtRW50cnkuaXRlbVR5cGUpXTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9ucyAob3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UpOiBJdGVtRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHQvLyB0b2RvOiB0cmFuc2xhdGVcblx0Y3JlYXRlVW5mb3VuZFJlbW90ZUl0ZW1FcnJvciAoKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6ICdUaGUgcmVxdWVzdGVkIGl0ZW0gY291bGQgbm90IGJlIGZvdW5kIC8geW91ciBjdXJyZW50IHBlcm1pc3Npb25zIGFyZSBub3Qgc3VmZmljaWVudCd9O1xuXHR9XG5cblx0Y3JlYXRlVW5mb3VuZExvY2FsSXRlbUVycm9yIChpdGVtVHlwZTogSXRlbVR5cGUpOiBJdGVtRXJyb3Ige1xuXHRcdHJldHVybiB7bWVzc2FnZTogYEEgbG9jYWwgaXRlbSBvZiB0eXBlICR7aXRlbVR5cGV9IGNvdWxkIG5vdCBiZSBmb3VuZGB9O1xuXHR9XG5cblx0Y3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvciAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGl0ZW0gb2YgdHlwZSAke2l0ZW1UeXBlfSBub3QgYmUgY3JlYXRlZCwgdGhlIElEIGlzIGFscmVhZHkgaW4gdXNlYH07XG5cdH1cblxuXHRnZXRGdWxsTmFtZSAoXG5cdFx0Zmlyc3ROYW1lOiBzdHJpbmcgPSAnJyxcblx0XHRpbmZpeDogc3RyaW5nID0gJycsXG5cdFx0bGFzdE5hbWU6IHN0cmluZyA9ICcnLFxuXHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaXJzdE5hbWVcblx0XHRcdC50cmltKClcblx0XHRcdC5jb25jYXQoXG5cdFx0XHRcdCcgJyxcblx0XHRcdFx0aW5maXgsXG5cdFx0XHQpXG5cdFx0XHQudHJpbSgpXG5cdFx0XHQuY29uY2F0KFxuXHRcdFx0XHQnICcsXG5cdFx0XHRcdGxhc3ROYW1lLFxuXHRcdFx0KVxuXHRcdFx0LnRyaW0oKTtcblx0fVxuXG5cdGdldFRpdGxlRmllbGQgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHN0cmluZyB7XG5cdFx0c3dpdGNoIChpdGVtVHlwZSkge1xuXHRcdFx0Y2FzZSAnRXhlbXBsYWFyJzpcblx0XHRcdFx0cmV0dXJuICdzZXJpZW51bW1lcic7XG5cdFx0XHRjYXNlICdGYWN0dXVyJzpcblx0XHRcdFx0cmV0dXJuICdudW1tZXInO1xuXHRcdFx0Y2FzZSAnRmlsZXMnOlxuXHRcdFx0XHRyZXR1cm4gJ2ZyaWVuZGx5bmFtZSc7XG5cdFx0XHRjYXNlICdGdW5jdGllJzpcblx0XHRcdGNhc2UgJ1N0YW5kYWFyZGZ1bmN0aWUnOlxuXHRcdFx0XHRyZXR1cm4gJ25hYW1pbnRlcm4nO1xuXHRcdFx0Y2FzZSAnVm9vcnJhYWRtdXRhdGllJzpcblx0XHRcdFx0cmV0dXJuICdvbXNjaHJpanZpbmcnO1xuXHRcdFx0Y2FzZSAnQmFyY29kZSc6XG5cdFx0XHRcdHJldHVybiAnY29kZSc7XG5cdFx0XHRjYXNlICdCZXRhYWxtaWRkZWwnOlxuXHRcdFx0Y2FzZSAnQmV0YWxpbmdzY29uZGl0aWUnOlxuXHRcdFx0Y2FzZSAnQnJpZWZwYXBpZXInOlxuXHRcdFx0Y2FzZSAnVGF4Q2xhc3MnOlxuXHRcdFx0Y2FzZSAnVGF4U2NoZW1hJzpcblx0XHRcdGNhc2UgJ0NvbmRpdGlvbic6XG5cdFx0XHRjYXNlICdGYWN0dXVybW9tZW50Jzpcblx0XHRcdGNhc2UgJ0Z1bmN0aWVncm9lcCc6XG5cdFx0XHRjYXNlICdHcm9vdGJvZWsnOlxuXHRcdFx0Y2FzZSAnSW5odXVyJzpcblx0XHRcdGNhc2UgJ0luaHV1cmdyb2VwJzpcblx0XHRcdGNhc2UgJ0luaHV1cm1hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdNYXRlcmlhYWwnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsQ2F0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXJ0YXJpZWYnOlxuXHRcdFx0Y2FzZSAnTm90aXRpZSc6XG5cdFx0XHRjYXNlICdQbGFubmluZ21hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1N0YWZmZWxncm9lcCc6XG5cdFx0XHRjYXNlICdTdWJwcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1RhYWsnOlxuXHRcdFx0Y2FzZSAnVGFnJzpcblx0XHRcdGNhc2UgJ1RlbXBsYXRlJzpcblx0XHRcdGNhc2UgJ1RpamQnOlxuXHRcdFx0Y2FzZSAnVGl0ZWwnOlxuXHRcdFx0Y2FzZSAnVHlwZSc6XG5cdFx0XHRjYXNlICdWb2VydHVpZyc6XG5cdFx0XHRcdHJldHVybiAnbmFhbSc7XG5cdFx0XHQvLyBjYXNlICdDb250YWN0Jzpcblx0XHRcdC8vIGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Ly8gY2FzZSAnUGVyc29uJzpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIG9ubHkgdXNlIGRpc3BsYXluYW1lIGZvciBpdGVtcyB0aGF0IGRvbnQndCBoYXZlIGEgc2ltcGxlLCB3cml0YWJsZSBuYW1lIGZpZWxkXG5cdFx0XHRcdC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciB0ZW1wbGF0ZWQgaXRlbXNcblx0XHRcdFx0cmV0dXJuICdkaXNwbGF5bmFtZSc7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETzogd2UgY2FuIHJlbW92ZSB0aGVzZSBvbmNlIGFsbCBjb2x1bW5zIGFyZSByZXNwZWN0ZWQgZm9yIGxvY2FsIGl0ZW1zIFtSTTQtMTAzNzhdXG5cdHB1YmxpYyBnZXRMb2NhbERlZmF1bHRWYWx1ZXMgKCk6IEZpZWxkTWFwIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGVybWlzc2lvbnM6IEFMTF9QRVJNSVNTSU9OUyxcblx0XHRcdGNyZWF0b3I6IHRoaXMuYXV0aEludGVyZmFjZS5nZXRVc2VySWQoKSxcblx0XHRcdGNyZWF0ZWQ6IG1vbWVudCgpLFxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IERVUExJQ0FURV9LRVlXT1JELCBEVVBMSUNBVEVfUFJFRklYLCBORVdfS0VZV09SRCwgTkVXX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJdGVtSWQsIFN0YXRlS2V5LCBTdGF0ZUtleVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlTZXJ2aWNlIHtcblx0c2VwYXJhdG9yOiBzdHJpbmcgPSAnOic7XG5cblx0Y29uc3RydWN0b3IgKCkge31cblxuXHRnZXRTaW5nbGVLZXkgKGl0ZW1UeXBlOiBzdHJpbmcsIGl0ZW1JZDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gaXRlbVR5cGUgKyB0aGlzLnNlcGFyYXRvciArIGl0ZW1JZDtcblx0fVxuXG5cdGdldENzc0tleSAoLi4uYXJncyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFyZ3Muam9pbignXycpO1xuXHR9XG5cblx0cGFyc2VTdGF0ZUtleSAoc3RhdGVLZXk6IHN0cmluZyk6IFN0YXRlS2V5IHwgbnVsbCB7XG5cdFx0c3RhdGVLZXkgPSBzdGF0ZUtleS50b1N0cmluZygpO1xuXG5cdFx0aWYgKHN0YXRlS2V5LnN1YnN0cmluZygwLCBORVdfS0VZV09SRC5sZW5ndGgpID09PSBORVdfS0VZV09SRClcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IFN0YXRlS2V5VHlwZS5OZXcsXG5cdFx0XHRcdHRlbXBsYXRlOiBzdGF0ZUtleS5zdWJzdHJpbmcoTkVXX0tFWVdPUkQubGVuZ3RoKSAvLyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgdXNlZCwgcmVldmFsdWF0ZVxuXHRcdFx0fTtcblxuXHRcdGlmIChzdGF0ZUtleS5zdWJzdHJpbmcoMCwgRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKSA9PT0gRFVQTElDQVRFX0tFWVdPUkQpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBTdGF0ZUtleVR5cGUuRHVwbGljYXRlLFxuXHRcdFx0XHRpdGVtSWQ6ICtzdGF0ZUtleS5zdWJzdHJpbmcoRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKVxuXHRcdFx0fTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0RHVwbGljYXRlU3RhdGVLZXkgKGl0ZW1JZDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gRFVQTElDQVRFX0tFWVdPUkQgKyBpdGVtSWQ7XG5cdH1cblxuXHRnZXROZXdTdGF0ZUtleSAodGVtcGxhdGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBORVdfS0VZV09SRCArIHRlbXBsYXRlVHlwZTtcblx0fVxuXG5cdGdldExvY2FsSWQgKCk6IEl0ZW1JZCB7XG5cdFx0cmV0dXJuICsoTkVXX1BSRUZJWCArIHRoaXMuZ2V0UmFuZG9tU3RyaW5nKCkpO1xuXHR9XG5cblx0Z2V0TG9jYWxEdXBsaWNhdGVJZCAoKTogSXRlbUlkIHtcblx0XHRyZXR1cm4gKyhEVVBMSUNBVEVfUFJFRklYICsgdGhpcy5nZXRSYW5kb21TdHJpbmcoKSk7XG5cdH1cblxuXHRnZXRSYW5kb21TdHJpbmcgKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICgnJyArIE1hdGgucmFuZG9tKCkpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIDgpO1xuXHR9XG5cblx0Ly8gbm90ZTogdGhlIGNoYW5nZXMgY29tcGlsZXIgdXNlcyB0aGlzXG5cdC8vIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIHVuZGVmaW5lZCAoaXRlbUhhbmRsZXIuY3JlYXRlUmVxdWVzdClcblx0aXNMb2NhbElkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pc05ld0lkKGl0ZW1JZCkgfHwgdGhpcy5pc0R1cGxpY2F0ZUlkKGl0ZW1JZCkpO1xuXHR9XG5cblx0aXNOZXdJZCAoaXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gaXRlbUlkID09PSBORVdfS0VZV09SRCB8fCAoJycgKyBpdGVtSWQpLnN1YnN0cmluZygwLCBORVdfUFJFRklYLmxlbmd0aCkgPT09IE5FV19QUkVGSVg7XG5cdH1cblxuXHRpc0R1cGxpY2F0ZUlkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgPT09IERVUExJQ0FURV9LRVlXT1JEIHx8ICgnJyArIGl0ZW1JZCkuc3Vic3RyaW5nKDAsIERVUExJQ0FURV9QUkVGSVgubGVuZ3RoKSA9PT0gRFVQTElDQVRFX1BSRUZJWDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1NYXAsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBMb2NrVG9rZW4gPSB7aXNGb3JlaWduOiBmYWxzZSwgaWQ6IG51bWJlciwgdG9rZW46IHN0cmluZ30gfCB7aXNGb3JlaWduOiB0cnVlLCBtZXNzYWdlOiBzdHJpbmd9O1xuXG5leHBvcnQgY2xhc3MgTG9ja1NlcnZpY2Uge1xuXG5cdHByaXZhdGUgbG9ja0l0ZW1zOiBJdGVtTWFwPExvY2tUb2tlbj4gPSB7fTtcblx0cHJpdmF0ZSBwcm9taXNlczogSXRlbU1hcDxQcm9taXNlSW50ZXJmYWNlPExvY2tUb2tlbj4+ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGdldExvY2tzICgpOiBMb2NrU2VydmljZVsnbG9ja0l0ZW1zJ10ge1xuXHRcdHJldHVybiB0aGlzLmxvY2tJdGVtcztcblx0fVxuXG5cdHB1YmxpYyBoYXNMb2NrIChsb2NrVG9rZW5JZDogSXRlbUlkKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxvY2tJdGVtcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbG9ja0l0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBsb2NrSXRlbSA9IGxvY2tJdGVtc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRpZiAoIWxvY2tJdGVtLmlzRm9yZWlnbiAmJiBsb2NrSXRlbS5pZCA9PSBsb2NrVG9rZW5JZCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gc2hvdWxkIGJlIGZhc3QgKHdhdGNoZWQpXG5cdHB1YmxpYyBpc0xvY2tlZCAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxvY2tJdGVtID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMubG9ja0l0ZW1zLFxuXHRcdCk7XG5cblx0XHRpZiAobG9ja0l0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5pc0ZvcmVpZ247XG5cdH1cblxuXHRwdWJsaWMgZ2V0TWVzc2FnZSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG5cdFx0Y29uc3QgbG9ja0l0ZW0gPSB0aGlzLmdldFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0KTtcblxuXHRcdGlmIChsb2NrSXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmICghbG9ja0l0ZW0uaXNGb3JlaWduKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5tZXNzYWdlO1xuXHR9XG5cblx0Ly8gZG9lcyBub3QgcmVqZWN0IHdoZW4gYSBmb3JlaWduIGxvY2sgaXMgZW5jb3VudGVyZWRcblx0Ly8gaXMgYWxzbyB1c2VkIGJ5IGRlbGV0ZUxvY2tcblx0cHVibGljIGZldGNoQ2FjaGVkTG9jayAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8dW5kZWZpbmVkIHwgTG9ja1Rva2VuPiB7XG5cdFx0Y29uc3QgbG9jayA9IHRoaXMuZ2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHQpO1xuXG5cdFx0aWYgKGxvY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihsb2NrKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMucHJvbWlzZXMsXG5cdFx0KTtcblxuXHRcdGlmIChwcm9taXNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuZXJyb3JIYW5kbGVyO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWRMb2NrKGl0ZW1FbnRyeSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRsb2NrSXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKGxvY2tJdGVtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBsb2NrSXRlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TG9jayhpdGVtRW50cnkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGxvY2tJdGVtID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbG9ja0l0ZW0uaXNGb3JlaWduID9cblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QobG9ja0l0ZW0ubWVzc2FnZSkgOlxuXHRcdFx0XHRcdFx0bG9ja0l0ZW0udG9rZW47XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlcXVlc3RMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxMb2NrVG9rZW4+IHtcblx0XHRjb25zdCB7aXRlbVR5cGUsIGl0ZW1JZH0gPSBpdGVtRW50cnk7XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LmNyZWF0ZShcblx0XHRcdFx0J0xvY2t0b2tlbicsXG5cdFx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpdGVtdHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbTogaXRlbUlkLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wcm9taXNlc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFZhbHVlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5saW5rcy5Mb2NrdG9rZW5bMF0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3IgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnByb21pc2VzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgPT09IDMwMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlzRm9yZWlnbjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRwcm9taXNlLFxuXHRcdFx0dGhpcy5wcm9taXNlcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGRlbGV0ZUxvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5mZXRjaENhY2hlZExvY2soaXRlbUVudHJ5KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNhY2hlZExvY2sgPT4ge1xuXHRcdFx0XHRcdC8vIHVuZGVmaW5lZDogbm90IHJlcXVlc3RlZCB5ZXRcblx0XHRcdFx0XHRpZiAoY2FjaGVkTG9jayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGNhY2hlZExvY2suaXNGb3JlaWduKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmNsZWFyTG9jayhpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRbY2FjaGVkTG9jay5pZF0sXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY2xlYXJMb2NrKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChsb2NrSXRlbXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWxldGUgbG9ja0l0ZW1zW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRWYWx1ZTxUPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRtYXA6IEl0ZW1NYXA8VD4sXG5cdCk6IHVuZGVmaW5lZCB8IFQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtRW50cnkuaXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgc2V0VmFsdWU8VD4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0dmFsdWU6IFQsXG5cdFx0bWFwOiBJdGVtTWFwPFQ+LFxuXHQpOiBUIHtcblx0XHRyZXR1cm4gY3JlYXRlUGF0aChcblx0XHRcdG1hcCxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0SXRlbU1hcCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmNvbnN0IEVNUFRZX0VOVFJZID0ge307XG5cbmV4cG9ydCB0eXBlIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCA9IHtcblx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0aXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwXG59O1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblxuXHRwdWJsaWMgcGFyZW50TWFwOiBhbnkgPSB7fTtcblx0cHVibGljIGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0SXRlbU1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHByb2Nlc3MgKCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCB7XG5cdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBIFRyYW5zYWN0aW9uQ2FjaGUgcm9vdEl0ZW0gaXMgcmVxdWlyZWQgZm9yIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbicpO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyZW50TWFwID0gdGhpcy5jcmVhdGVQYXJlbnRNYXAoKTtcblxuXHRcdHRoaXMucHJvY2Vzc0l0ZW1zKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5yb290SXRlbS5pdGVtVHlwZSxcblx0XHRcdFt0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtXSxcblx0XHRcdHt9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQ6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbUlkLFxuXHRcdFx0aXRlbXM6IHRoaXMuZGVzdGluYXRpb24sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUGFyZW50TWFwICgpIHtcblx0XHRjb25zdCByZXN1bHQ6IHtcblx0XHRcdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtwYXJlbnRJZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gPSB7fTtcblxuXHRcdC8vIHRvZG86IGFsc28gaW5jbHVkZSBwYXJlbnQncyBlbnRyaWVzID8gcHJvYmFibHkgbm90Li4uXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblx0XHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHQvLyB3ZSBkb24ndCBjYXJlIGZvciBpdGVtcyB0aGF0IGFyZSBub3QgbGlua2VkIHRvIHRoZSByb290IGl0ZW1cblx0XHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHBhcmVudFR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRcdGNvbnN0IHBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFtwYXJlbnRUeXBlXVtwYXJlbnRJZF1baXRlbVR5cGVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdW2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0bGlua0FjY3VtdWxhdG9yOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0sXG5cdCkge1xuXHRcdGlmICh0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGxpbmtBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0Ly8gZWFjaCBpdGVtIG9ubHkgaGFzIGEgc2luZ2xlIHBhcmVudCwgc28gd2UgY2FuIHNhZmVseSBkbyB0aGlzXG5cdFx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSA9IHRoaXMucHJvY2Vzc0l0ZW0oaXRlbUVudHJ5KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0KToge3ZhbHVlcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sIGxpbmtzPzoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119fSB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHRjb25zdCBjaGlsZEl0ZW1zID0gdGhpcy5nZXRJdGVtc0J5UGFyZW50KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoaWxkQ29sbGVjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0Q29sbGVjdGlvbnNCeVBhcmVudChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZvcm1hdFJlcXVlc3QoaXRlbUVudHJ5KTtcblx0XHRjb25zdCBsaW5rcyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZFR5cGUgaW4gY2hpbGRJdGVtcykge1xuXHRcdFx0dGhpcy5wcm9jZXNzSXRlbXMoXG5cdFx0XHRcdGNoaWxkVHlwZSxcblx0XHRcdFx0Y2hpbGRJdGVtc1tjaGlsZFR5cGVdLFxuXHRcdFx0XHRsaW5rcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY2hpbGRDb2xsZWN0aW9ucykge1xuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLnF1ZXJ5ICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2Nlc3NJdGVtcyhcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkoY29sbGVjdGlvbkVudHJ5LmlkKSxcblx0XHRcdFx0bGlua3MsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhc1ZhbHVlcyA9IGhhc1Byb3BlcnRpZXModmFsdWVzKTtcblx0XHRjb25zdCBoYXNMaW5rcyA9IGhhc1Byb3BlcnRpZXMobGlua3MpO1xuXG5cdFx0aWYgKGhhc1ZhbHVlcyAmJiBoYXNMaW5rcykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dmFsdWVzOiB2YWx1ZXMsXG5cdFx0XHRcdGxpbmtzOiBsaW5rcyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc1ZhbHVlcykge1xuXHRcdFx0cmV0dXJuIHt2YWx1ZXM6IHZhbHVlc307XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0xpbmtzKSB7XG5cdFx0XHRyZXR1cm4ge2xpbmtzOiBsaW5rc307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEVNUFRZX0VOVFJZO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRJdGVtc0J5UGFyZW50IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHQpIHtcblx0XHRjb25zdCBtYXBFbnRyeSA9IHRoaXMucGFyZW50TWFwW3BhcmVudFR5cGVdO1xuXG5cdFx0aWYgKG1hcEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cblx0XHRpZiAobWFwRW50cnlbcGFyZW50SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwRW50cnlbcGFyZW50SWRdO1xuXHR9XG59XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzLCBpbkFycmF5IH0gZnJvbSAnLi9VdGlsJztcblxuY29uc3QgTUFZQkUgPSAnbWF5YmUnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlNYXRjaGVyIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRwdWJsaWMgZmllbGRzOiBGaWVsZE1hcCxcblx0XHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpIHtcblxuXHR9XG5cblx0cHJpdmF0ZSBjb21wYXJlVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdHF1ZXJ5VmFsdWU6IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG1vbWVudC5pc01vbWVudChxdWVyeVZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVNb21lbnRPYmplY3RzKFxuXHRcdFx0XHRxdWVyeVZhbHVlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc0R1cmF0aW9uKHF1ZXJ5VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29tcGFyZUR1cmF0aW9ucyhcblx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHF1ZXJ5VmFsdWUgPT0gdmFsdWU7XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmN1c3RvbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0Ly8gbGlua2VkVG8gYWxzbyBjb250YWlucyAucXVlcnlcblx0XHRpZiAocXVlcnkubGlua2VkVG8gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubWF0Y2hMaW5rZWRUb1F1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkucXVlcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jb25kaXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoQ29tcGxleFF1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHRoaXMuZmllbGRzW3F1ZXJ5LmtleV0sXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5TWF0Y2hlcjogVW5zdXBwb3J0ZWQgcXVlcnkhIFBhcnNlZD8nKTtcblx0fVxuXG5cdHByaXZhdGUgbWF0Y2hMaW5rZWRUb1F1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnJldmVyc2UpIHtcblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblx0XHRsZXQgbWF0Y2g7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRtYXRjaCA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAocXVlcnkubGlua2VkVG8gIT09IHBhcmVudC5pdGVtVHlwZSkge1xuXHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2ggPSB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFtYXRjaCA6ICEhbWF0Y2g7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoQ29tcGxleFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3QgY29uZGl0aW9ucyA9IHF1ZXJ5LmNvbmRpdGlvbnM7XG5cblx0XHRsZXQgcmVzdWx0O1xuXHRcdGxldCB0ZXJtaW5hbDtcblxuXHRcdHN3aXRjaCAocXVlcnkub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgJ0FORCc6XG5cdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdHRlcm1pbmFsID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnT1InOlxuXHRcdFx0XHRyZXN1bHQgPSBmYWxzZTtcblx0XHRcdFx0dGVybWluYWwgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBvcGVyYXRvcicpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaFF1ZXJ5KGNvbmRpdGlvbik7XG5cblx0XHRcdGlmIChtYXRjaCA9PT0gdGVybWluYWwpIHtcblx0XHRcdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICF0ZXJtaW5hbCA6IHRlcm1pbmFsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRcdHJlc3VsdCA9IE1BWUJFO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZXN1bHQgPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFyZXN1bHQgOiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoU2ltcGxlUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3Qga2V5ID0gcXVlcnkua2V5O1xuXHRcdGxldCBxdWVyeVZhbHVlID0gcXVlcnkudmFsdWU7XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSAvLyBDb3VsZCBiZSBsaW5rZWRUbyBhbiBlbXB0eSBvYmplY3Rcblx0XHR7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnUmVxdWlyZWQgZmllbGQnLFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdCdub3QgZm91bmQgZm9yJyxcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnlWYWx1ZSA9PT0gJ05PVycpIHtcblx0XHRcdHF1ZXJ5VmFsdWUgPSBtb21lbnQoKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHF1ZXJ5LmNvbXBhcmF0b3IpIHtcblx0XHRcdGNhc2UgJz0nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICchPSc6XG5cdFx0XHRcdHJldHVybiAhdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICc8Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDwgcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJzw9Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDw9IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICc+Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID4gcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJz49Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID49IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICdJTic6XG5cdFx0XHRcdC8vIE9ubHkgSU4gc3VwcG9ydHMgTk9ULCBhbGwgb3RoZXIgY29tcGFyYXRvcnMgYXJlIGZsaXBwZWQgaW4gdGhlIFF1ZXJ5UGFyc2VyXG5cdFx0XHRcdGNvbnN0IHJlcyA9IGluQXJyYXkoXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZXR1cm4gcXVlcnkubm90ID8gIXJlcyA6IHJlcztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBjb21wYXJhdG9yOiAnICsgcXVlcnkuY29tcGFyYXRvciArICcgaW4gcXVlcnkgJyArIHF1ZXJ5KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENPTVBBUkFUT1JTLCBPUEVSQVRPUlMsIE9QRVJBVE9SU19UWVBFLCBRdWVyeVBhcnNlckJhc2UgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyQmFzZSc7XG5cbmV4cG9ydCBlbnVtIENPTlNUQU5UUyB7XG5cdE9CSiA9IDAsXG5cdFNUUiA9IDEsXG5cdFNFUCA9ICc6J1xufVxuXG5jb25zdCBWQUxJRF9DT01QQVJBVE9SUyA9IE9iamVjdC5rZXlzKENPTVBBUkFUT1JTKVxuXHQubWFwKFxuXHRcdGtleSA9PiBDT01QQVJBVE9SU1trZXldLFxuXHQpO1xuXG5leHBvcnQgdHlwZSBDT01QQVJBVE9SU19UWVBFID0gJz0nIHwgJyE9JyB8ICc8JyB8ICc+JyB8ICc8PScgfCAnPj0nIHwgJ0lOJyB8IENPTVBBUkFUT1JTO1xuXG5jb25zdCBPUFBPU0lURV9DT01QQVJBVE9SX01BUDogeyBba2V5IGluIENPTVBBUkFUT1JTXTogQ09NUEFSQVRPUlMgfSA9IHtcblx0W0NPTVBBUkFUT1JTLkVRVUFMU106IENPTVBBUkFUT1JTLk5PVF9FUVVBTFMsXG5cdFtDT01QQVJBVE9SUy5OT1RfRVFVQUxTXTogQ09NUEFSQVRPUlMuRVFVQUxTLFxuXHRbQ09NUEFSQVRPUlMuTU9SRV9USEFOXTogQ09NUEFSQVRPUlMuTEVTU19PUl9FUVVBTF9USEFOLFxuXHRbQ09NUEFSQVRPUlMuTEVTU19USEFOXTogQ09NUEFSQVRPUlMuRVFVQUxfT1JfTU9SRV9USEFOLFxuXHRbQ09NUEFSQVRPUlMuTEVTU19PUl9FUVVBTF9USEFOXTogQ09NUEFSQVRPUlMuTU9SRV9USEFOLFxuXHRbQ09NUEFSQVRPUlMuRVFVQUxfT1JfTU9SRV9USEFOXTogQ09NUEFSQVRPUlMuTEVTU19USEFOLFxuXHQvLyBJbiB1c2VzICdub3Q6IHRydWUnIGluc3RlYWQgb2YgcmV2ZXJzaW5nIHRoZSBxdWVyeVxuXHRbQ09NUEFSQVRPUlMuSU5dOiBDT01QQVJBVE9SUy5JTixcbn07XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVBhcnNlclxuXHRleHRlbmRzIFF1ZXJ5UGFyc2VyQmFzZTxbb2JqZWN0LCBzdHJpbmddPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRwcml2YXRlIHBhcmFtZXRlcnM6IG9iamVjdCxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlRW1wdHlRdWVyeSAoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHt9LFxuXHRcdFx0J3t9Jyxcblx0XHRdIGFzIFtvYmplY3QsIHN0cmluZ107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnBhcnNlKHN1YlF1ZXJ5KTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGtleSxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgJ3N1YicgKyBDT05TVEFOVFMuU0VQICsga2V5ICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcgPSAnJyxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUgPSAnJyxcblx0XHRmaWVsZDogc3RyaW5nID0gJycsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2UocXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdHF1ZXJ5OiBwYXJzZWRRdWVyeVtDT05TVEFOVFMuT0JKXSxcblx0XHRcdFx0bm90LFxuXHRcdFx0fSxcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcblx0XHRcdCdbJyArICdzdWJGaWVsZCcgKyBDT05TVEFOVFMuU0VQICsga2V5ICsgQ09OU1RBTlRTLlNFUCArIGl0ZW1UeXBlICsgQ09OU1RBTlRTLlNFUCArIGZpZWxkICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2VhcmNoUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRzZWFyY2g6IHZhbHVlW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgJ3NlYXJjaCcgKyBDT05TVEFOVFMuU0VQICsgdmFsdWVbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDdXN0b21RdWVyeSAoXG5cdFx0Y3VzdG9tOiBzdHJpbmcsXG5cdFx0cGFyYW1ldGVyczogYW55LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRpZiAocGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y3VzdG9tLFxuXHRcdFx0XHRcdG5vdCxcblx0XHRcdFx0fSxcblx0XHRcdFx0J1snICsgY3VzdG9tICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRcdF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyc2VkUGFyYW1ldGVycyA9IHRoaXMucGFyc2VDdXN0b21QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0Y3VzdG9tLFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJzZWRQYXJhbWV0ZXJzW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgY3VzdG9tICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFBhcmFtZXRlcnNbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDdXN0b21QYXJhbWV0ZXJzIChwYXJhbWV0ZXJzOiBhbnkpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVycylcblx0XHRcdC5zb3J0KCk7XG5cblx0XHRjb25zdCBxdWVyeTogQXBpUXVlcnkgPSB7fSBhcyBBcGlRdWVyeTtcblx0XHRsZXQgc3RyaW5nID0gJyc7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbaV07XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUocGFyYW1ldGVyc1trZXldKTtcblxuXHRcdFx0cXVlcnlba2V5XSA9IHZhbHVlW0NPTlNUQU5UUy5PQkpdO1xuXG5cdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0c3RyaW5nICs9IENPTlNUQU5UUy5TRVA7XG5cdFx0XHR9XG5cblx0XHRcdHN0cmluZyArPSB2YWx1ZVtDT05TVEFOVFMuU1RSXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0cXVlcnksXG5cdFx0XHRzdHJpbmcsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVNpbXBsZVF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHRcdGNvbXBhcmF0b3I/OiBDT01QQVJBVE9SU19UWVBFLFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHR2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUodmFsdWUpO1xuXG5cdFx0aWYgKGNvbXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29tcGFyYXRvciA9IEFycmF5LmlzQXJyYXkodmFsdWVbQ09OU1RBTlRTLk9CSl0pID8gQ09NUEFSQVRPUlMuSU4gOiBDT01QQVJBVE9SUy5FUVVBTFM7XG5cdFx0fVxuXG5cdFx0aWYgKFZBTElEX0NPTVBBUkFUT1JTLmluZGV4T2YoY29tcGFyYXRvcikgPT09IC0xKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tcGFyYXRvciAnJHtjb21wYXJhdG9yfScsIGl0IG1pZ2h0IGJlIHRoYXQgdGhlIGJhY2tlbmQgc3VwcG9ydHMgaXQgYnV0IHRoZSBmcm9udGVuZCBkb2Vzbid0ICFgKTtcblx0XHR9XG5cblx0XHRpZiAobm90KSB7XG5cdFx0XHRjb21wYXJhdG9yID0gT1BQT1NJVEVfQ09NUEFSQVRPUl9NQVBbY29tcGFyYXRvcl07XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIG90aGVyIGNvbXBhcmF0b3JzIGNhbiBiZSBpbnZlcnRlZFxuXHRcdGNvbnN0IGlzTm90SW4gPSBjb21wYXJhdG9yID09PSBDT01QQVJBVE9SUy5JTiAmJiBub3Q7XG5cblx0XHRjb25zdCByZXN1bHQ6IFtvYmplY3QsIHN0cmluZ10gPSBbXG5cdFx0XHR7XG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRjb21wYXJhdG9yLFxuXHRcdFx0XHRub3Q6IGlzTm90SW4sXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgY29tcGFyYXRvciArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgdmFsdWVbQ09OU1RBTlRTLlNUUl0gKyAnXScsXG5cdFx0XTtcblxuXHRcdGlmIChpc05vdEluKSB7XG5cdFx0XHRyZXN1bHRbMV0gPSByZXN1bHRbMV0uc2xpY2UoXG5cdFx0XHRcdDAsXG5cdFx0XHRcdC0xLFxuXHRcdFx0KTtcblx0XHRcdHJlc3VsdFsxXSArPSBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VMaW5rZWRUb1F1ZXJ5IChcblx0XHRsaW5rZWRUbzogYW55LFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5LFxuXHRcdHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnBhcnNlKHF1ZXJ5KTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGxpbmtlZFRvOiBsaW5rZWRUbyxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRyZXZlcnNlOiByZXZlcnNlLFxuXHRcdFx0XHRub3Q6IG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnbGlua2VkVG8nICsgQ09OU1RBTlRTLlNFUCArIGxpbmtlZFRvICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIHJldmVyc2UgKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDb21wbGV4UXVlcnkgKFxuXHRcdGNvbmRpdGlvbnM6IGFueVtdLFxuXHRcdG9wZXJhdG9yOiBPUEVSQVRPUlNfVFlQRSA9IE9QRVJBVE9SUy5BTkQsXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdG9wZXJhdG9yID0gb3BlcmF0b3IudG9VcHBlckNhc2UoKSBhcyBPUEVSQVRPUlM7XG5cblx0XHRjb25zdCBwYXJzZWRDb25kaXRpb25zID0gdGhpcy5wYXJzZUNvbmRpdGlvbnMoY29uZGl0aW9ucyk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRjb25kaXRpb25zOiBwYXJzZWRDb25kaXRpb25zW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRvcGVyYXRvcixcblx0XHRcdFx0bm90LFxuXHRcdFx0fSxcblx0XHRcdCdbJyArIG9wZXJhdG9yICsgcGFyc2VkQ29uZGl0aW9uc1tDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VDb25kaXRpb25zIChjb25kaXRpb25zOiBhbnlbXSk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGxldCBwYXJzZWRDb25kaXRpb25zOiBBcnJheTxbb2JqZWN0LCBzdHJpbmddPiA9IFtdO1xuXHRcdGNvbnN0IHF1ZXJ5OiBvYmplY3RbXSA9IFtdO1xuXHRcdGxldCBzdHJpbmcgPSAnJztcblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdHBhcnNlZENvbmRpdGlvbnMucHVzaCh0aGlzLnBhcnNlKGNvbmRpdGlvbikpO1xuXHRcdH1cblxuXHRcdHBhcnNlZENvbmRpdGlvbnMgPSBwYXJzZWRDb25kaXRpb25zLnNvcnQoKFxuXHRcdFx0YSxcblx0XHRcdGIsXG5cdFx0KSA9PiB0aGlzLmNvbXBhcmVQYXJzZWRRdWVyaWVzKFxuXHRcdFx0YSxcblx0XHRcdGIsXG5cdFx0KSk7XG5cblx0XHRmb3IgKGNvbnN0IHBhcnNlZENvbmRpdGlvbiBvZiBwYXJzZWRDb25kaXRpb25zKSB7XG5cdFx0XHRxdWVyeS5wdXNoKHBhcnNlZENvbmRpdGlvbltDT05TVEFOVFMuT0JKXSk7XG5cdFx0XHRzdHJpbmcgKz0gcGFyc2VkQ29uZGl0aW9uW0NPTlNUQU5UUy5TVFJdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHRxdWVyeSxcblx0XHRcdHN0cmluZyxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXRWYWx1ZTxUPiAodmFsdWU6IFQpOiBbVCwgc3RyaW5nXSB7XG5cdFx0bGV0IHByb2Nlc3NlZFZhbHVlO1xuXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuY2hhckF0KDApID09PSAnJicpIHtcblx0XHRcdGNvbnN0IGtleSA9IHZhbHVlLnN1YnN0cmluZygxKTtcblxuXHRcdFx0dmFsdWUgPSB0aGlzLnBhcmFtZXRlcnNba2V5XTtcblxuXHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdxdWVyeVBhcnNlcjogVW5kZWZpbmVkIHRlbXBsYXRlIHBhcmFtZXRlciBcXCcnICsga2V5ICsgJ1xcJycpO1xuXHRcdFx0fVxuXG5cdFx0XHRwcm9jZXNzZWRWYWx1ZSA9IHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlKTtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0cHJvY2Vzc2VkVmFsdWUsXG5cdFx0XHRcdGtleSArICc+JyArIHZhbHVlLFxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHRwcm9jZXNzZWRWYWx1ZSA9IHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRwcm9jZXNzZWRWYWx1ZSxcblx0XHRcdCcnICsgcHJvY2Vzc2VkVmFsdWUsXG5cdFx0XTtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlPFQ+ICh2YWx1ZTogVFtdKTogVFtdO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBtb21lbnQuTW9tZW50O1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZSAodmFsdWU6IG1vbWVudC5EdXJhdGlvbik6IG1vbWVudC5EdXJhdGlvbjtcblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUKTogVDtcblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUIHwgVFtdIHwgbW9tZW50Lk1vbWVudCB8IG1vbWVudC5EdXJhdGlvbikge1xuXHRcdC8vIGFsZ29yaXRobSBpcyBub3QgaW1wb3J0YW50LCBhcyBsb25nIGFzIGFsbCBhcnJheXMgYXJlIHNvcnRlZCB0aGUgc2FtZSB3YXlcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHQuc2xpY2UoKVxuXHRcdFx0XHQuc29ydCgpO1xuXHRcdH1cblxuXHRcdGlmIChtb21lbnQuaXNNb21lbnQodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKTtcblx0XHR9XG5cblx0XHRpZiAobW9tZW50LmlzRHVyYXRpb24odmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRwcml2YXRlIGNvbXBhcmVQYXJzZWRRdWVyaWVzIChcblx0XHRhOiBbb2JqZWN0LCBzdHJpbmddLFxuXHRcdGI6IFtvYmplY3QsIHN0cmluZ10sXG5cdCkge1xuXHRcdGlmIChhW0NPTlNUQU5UUy5TVFJdID09PSBiW0NPTlNUQU5UUy5TVFJdKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYVtDT05TVEFOVFMuU1RSXSA+IGJbQ09OU1RBTlRTLlNUUl0gPyAxIDogLTE7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEl0ZW1JZCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENPTVBBUkFUT1JTLCBPUEVSQVRPUlMgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVNlcnZpY2Uge1xuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdH1cblxuXHRhZGRBbmRDb25kaXRpb24gKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRjb25kaXRpb246IEFwaVF1ZXJ5LFxuXHQpOiBBcGlRdWVyeSB7XG5cdFx0aWYgKHF1ZXJ5LmNvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5vcGVyYXRvciA9PT0gT1BFUkFUT1JTLk9SKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjb25kaXRpb25zOiBbXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0XHRdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIGFuICdhbmQnIGNvbmRpdGlvblxuXHRcdHJldHVybiB7Y29uZGl0aW9uczogcXVlcnkuY29uZGl0aW9ucy5jb25jYXQoY29uZGl0aW9uKX07XG5cdH1cblxuXHRhZGRPckNvbmRpdGlvbiAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbmRpdGlvbjogQXBpUXVlcnksXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRpZiAocXVlcnkub3BlcmF0b3IgPT09IE9QRVJBVE9SUy5PUikge1xuXHRcdFx0cmV0dXJuIHtjb25kaXRpb25zOiBxdWVyeS5jb25kaXRpb25zLmNvbmNhdChjb25kaXRpb24pfTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIGFuICdhbmQnIGNvbmRpdGlvblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb25kaXRpb25zOiBbXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRdLFxuXHRcdFx0b3BlcmF0b3I6IE9QRVJBVE9SUy5PUixcblx0XHR9O1xuXHR9XG5cblx0YWRkUGFyZW50Q29uZGl0aW9uIChcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRsZXQgbGlua2VkVG9RdWVyeTtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBxdWVyeTtcblx0XHR9XG5cblx0XHRsaW5rZWRUb1F1ZXJ5ID0ge1xuXHRcdFx0bGlua2VkVG86IHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdHF1ZXJ5OiBwYXJlbnQuaXRlbUlkLFxuXHRcdH07XG5cblx0XHRyZXR1cm4gcXVlcnkgPT09IG51bGwgPyBsaW5rZWRUb1F1ZXJ5IDogdGhpcy5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRxdWVyeSxcblx0XHRcdGxpbmtlZFRvUXVlcnksXG5cdFx0KTtcblx0fVxuXG5cdGNyZWF0ZU5vdEluIChpZEFycmF5OiBJdGVtSWRbXSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb21wYXJhdG9yOiBDT01QQVJBVE9SUy5JTixcblx0XHRcdGtleTogJ2lkJyxcblx0XHRcdHZhbHVlOiBpZEFycmF5LFxuXHRcdFx0bm90OiB0cnVlXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0LCBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbnR5cGUgUmVxdWVzdENvbHVtbk1hcCA9IHtbaXRlbVR5cGU6IHN0cmluZ106IEFwaVJlcXVlc3RDb2x1bW5zfTtcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24ge1xuXHRwcml2YXRlIGNvbHVtbnM6IFJlcXVlc3RDb2x1bW5NYXAgPSB7fTtcblx0cHJpdmF0ZSBjb2x1bW5TZXRJZE1hcDoge1tjb2x1bW5TZXRJZDogbnVtYmVyXTogYm9vbGVhbn0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRXaXRoUmVxdWVzdENvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cblx0XHRpZiAoY29sdW1uc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uVXRpbFxuXHRcdFx0Lm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC5tZXJnZWQ7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kPFQgZXh0ZW5kcyBDb2x1bW5TZXQ8SXRlbVR5cGU+PiAoY29sdW1uU2V0OiBUKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY29sdW1uU2V0SWRNYXBbY29sdW1uU2V0LmlkXSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2x1bW5TZXQuaXRlbVR5cGU7XG5cblx0XHRpZiAoY29sdW1uc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uVXRpbFxuXHRcdFx0Lm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRjb2x1bW5TZXQucmVxdWVzdCxcblx0XHRcdClcblx0XHRcdC5tZXJnZWQ7XG5cblx0XHR0aGlzLmNvbHVtblNldElkTWFwW2NvbHVtblNldC5pZF0gPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGdldCAoKTogUmVxdWVzdENvbHVtbk1hcCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1ucztcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksIFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbk1hdGNoUmVzdWx0LFxuXHRGaWVsZE1hcCxcblx0RnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2UsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFJlc3BvbnNlQ29sdW1uLFxuXHRTb2NrZXRNZXNzYWdlLFxuXHRTb2NrZXRNZXNzYWdlQ3JlYXRlLFxuXHRTb2NrZXRNZXNzYWdlRGVsZXRlLFxuXHRTb2NrZXRNZXNzYWdlTGlua1RvLFxuXHRTb2NrZXRNZXNzYWdlVXBkYXRlLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcblxuZXhwb3J0IHR5cGUgU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7W2l0ZW1JZDogbnVtYmVyXTogQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT59O1xuXG5leHBvcnQgY2xhc3MgU29ja2V0TWVzc2FnZUhhbmRsZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb25DYWNoZUZhY3Rvcnk6IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBvbk1lc3NhZ2VSZWNlaXZlZCAobWVzc2FnZTogU29ja2V0TWVzc2FnZSk6IGFueSB7XG5cdFx0c3dpdGNoIChtZXNzYWdlLmJvZHkuZXZlbnRUeXBlKSB7XG5cdFx0XHRjYXNlICd1cGRhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVVcGRhdGUobWVzc2FnZSk7XG5cdFx0XHRjYXNlICdjcmVhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVDcmVhdGUobWVzc2FnZSk7XG5cdFx0XHRjYXNlICdkZWxldGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVEZWxldGUobWVzc2FnZSk7XG5cdFx0XHRjYXNlICdsaW5rVG8nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVMaW5rTW92ZShtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGZvcm1hdE1lc3NhZ2VWYWx1ZXMgKFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCByZXN1bHQ6IEZpZWxkTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNvbHVtbnMpIHtcblx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0XHRjb2x1bW5zW2NvbHVtbklkXS50eXBlLFxuXHRcdFx0XHR2YWx1ZXNbY29sdW1uSWRdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtczoge1tpdGVtSWQ6IG51bWJlcl06IGFueX0sXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0KTogU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCByZXN1bHQ6IFNvY2tldENvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbXMpIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSBpdGVtc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gaXRlbS5wYXJlbnQgIT09IG51bGwgPyBpdGVtLnBhcmVudCA6IHt9O1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5mb3JtYXRNZXNzYWdlVmFsdWVzKFxuXHRcdFx0XHRpdGVtLnZhbHVlcyxcblx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdCk7XG5cblx0XHRcdHJlc3VsdFtpdGVtSWRdID0gc2VydmVyQ2FjaGUuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUZpdHRpbmdJdGVtKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dmFsdWVzLFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGdldFJlcXVlc3RDb2x1bW5zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2xsZWN0aW9uTWFwOiBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBjb2xsZWN0aW9uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9ucyA9IGNvbGxlY3Rpb25NYXBbaXRlbUlkXTtcblx0XHRcdGNvbnN0IGZpdHRpbmdDb2xsZWN0aW9ucyA9IGNvbGxlY3Rpb25zLmZpdHRpbmc7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgZml0dGluZ0NvbGxlY3Rpb24gb2YgZml0dGluZ0NvbGxlY3Rpb25zKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoZml0dGluZ0NvbGxlY3Rpb24uY29sdW1ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24uZXhwYW5kKGl0ZW1FbnRyeS5jb2x1bW5zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzTWVzc2FnZTxUIGV4dGVuZHMgU29ja2V0TWVzc2FnZVsnYm9keSddPiAoXG5cdFx0Ym9keTogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBib2R5Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IHJlcXVlc3RJZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWFwID0gdGhpcy5jcmVhdGVDb2xsZWN0aW9uTWFwKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRib2R5Lml0ZW1zW2l0ZW1UeXBlXSxcblx0XHRcdGJvZHkuY29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0KTtcblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5nZXRSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbk1hcCxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWRTdHJpbmcgaW4gY29sbGVjdGlvbk1hcCkge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWRTdHJpbmcsXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCBpdGVtSWQgPSAraXRlbUlkU3RyaW5nO1xuXG5cdFx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVxdWVzdElkcy5wdXNoKGl0ZW1JZCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uTWFwW2l0ZW1JZF0uZml0dGluZy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3RJZHMucHVzaChpdGVtSWQpO1xuXHRcdH1cblxuXHRcdGlmIChyZXF1ZXN0SWRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQucXVlcnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0XHRcdGNvbXBhcmF0b3I6ICdJTicsXG5cdFx0XHRcdFx0dmFsdWU6IHJlcXVlc3RJZHMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gc2VydmVyQ2FjaGUucHJvY2Vzc1Jlc3BvbnNlKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZTxUIGV4dGVuZHMgU29ja2V0TWVzc2FnZVsnYm9keSddPiAoXG5cdFx0Ym9keTogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBpdGVtcyA9IGJvZHkuaXRlbXMuRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZTtcblx0XHRjb25zdCByZXF1ZXN0SWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbXMpIHtcblx0XHRcdGNvbnN0IGZ1bmN0aW9uSWQgPSBpdGVtc1tpdGVtSWRdLnBhcmVudC5pdGVtSWQ7XG5cdFx0XHRjb25zdCBmdW5jdGlvbkVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0ZnVuY3Rpb25JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0ZnVuY3Rpb25FbnRyeSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdHx8IGZ1bmN0aW9uRW50cnkuY29sdW1ucy5yZXNwb25zZS5GdW5jdGllLm5ld2NoYW5nZXMgPT09IHVuZGVmaW5lZFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0SWRzLnB1c2goZnVuY3Rpb25JZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RJZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdC5mZXRjaEJ5SWRzKFxuXHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdHJlcXVlc3RJZHMsXG5cdFx0XHRcdFsnbmV3Y2hhbmdlcyddLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGJ1ZmZlclJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBpc24ndCB0aGlzIGFscmVhZHkgaGFuZGxlZCBpbiB0aGUgUmVxdWVzdEJ1ZmZlciA/XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlSWRzID0gYnVmZmVyUmVzcG9uc2UucmVzcG9uc2UubGlua3MuRnVuY3RpZTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIHJlc3BvbnNlSWRzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0J0Z1bmN0aWUnLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdFx0Y29uc3QgcHJldmlvdXMgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRjb25zdCByZXNwb25zZVZhbHVlcyA9IGJ1ZmZlclJlc3BvbnNlLnJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlVmFsdWVzID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VWYWx1ZXMubmV3Y2hhbmdlcyA9PT0gcHJldmlvdXMubmV3Y2hhbmdlc1xuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e25ld2NoYW5nZXM6IHJlc3BvbnNlVmFsdWVzLm5ld2NoYW5nZXN9LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5ub3RpZnlFcnJvcixcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGlzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZU1lc3NhZ2UgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2UpOiBtZXNzYWdlIGlzIEZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmVTb2NrZXRNZXNzYWdlIHtcblx0XHRyZXR1cm4gbWVzc2FnZS5ib2R5Lml0ZW1UeXBlID09PSAnRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZSc7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZSAobWVzc2FnZTogRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2UpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+O1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZUNyZWF0ZSk6IFByb21pc2VJbnRlcmZhY2U8bnVsbD47XG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlKTogYW55IHtcblx0XHRjb25zdCBib2R5ID0gbWVzc2FnZS5ib2R5O1xuXG5cdFx0aWYgKHRoaXMuaXNGdW5jdGlvbkNoYW5nZXNSZXNvbHZlTWVzc2FnZShtZXNzYWdlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvY2Vzc0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmUoYm9keSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5wcm9jZXNzTWVzc2FnZShib2R5KVxuXHRcdFx0LmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlVXBkYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlVXBkYXRlKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5wcm9jZXNzTWVzc2FnZShtZXNzYWdlLmJvZHkpXG5cdFx0XHQuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IpO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVEZWxldGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VEZWxldGUpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGJvZHkgPSBtZXNzYWdlLmJvZHk7XG5cdFx0Y29uc3QgZW50cmllc1RvQmVEZWxldGVkOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgYm9keS5pdGVtcykge1xuXHRcdFx0Y29uc3QgY2FjaGVkRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0Ym9keS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGVudHJpZXNUb0JlRGVsZXRlZC5wdXNoKGNhY2hlZEVudHJ5KTtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbXNEZWxldGVkKGVudHJpZXNUb0JlRGVsZXRlZCk7XG5cblx0XHRzZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHR0cnVlLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUxpbmtNb3ZlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlTGlua1RvKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc01lc3NhZ2UobWVzc2FnZS5ib2R5KVxuXHRcdFx0LmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yKTtcblx0fVxuXG5cdC8qXHRoYW5kbGVMaW5rTW92ZSAobWVzc2FnZSkge1xuXHQgcHJvY2Vzc01lc3NhZ2UoXG5cdCBtZXNzYWdlLFxuXHQgZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGl0ZW1FbnRyaWVzKSB7XG5cdCAvLyBmaXRzIGluIHRoaXMgY29sbGVjdGlvbiwgdG9kbzogZ2V0IHRoZSBvbGQgY29sbGVjdGlvbiBpdCBiZWxvbmdlZCB0b1xuXHQgY29sbGVjdGlvbi5tb3ZlSXRlbXMoaXRlbUVudHJpZXMsIG51bGwsIHRydWUpO1xuXHQgfSxcblx0IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBpdGVtRW50cmllcykge1xuXHQgLy8gbWF5YmUgZml0c1xuXHQgLy8gdG9kbzogYWxzbyByZW1vdmUgdGhlbSBmcm9tIHRoZSBvbGQgY29sbGVjdGlvblxuXHQgY29sbGVjdGlvbi5leHRlbmQoYW5ndWxhci5pZGVudGl0eSwgZmFsc2UsIGZhbHNlKTtcblx0IH0sXG5cdCBmdW5jdGlvbiAoY29sbGVjdGlvbiwgaWRzKSB7XG5cdCAvLyBub3QgZml0dGluZyBpbiB0aGlzIGNvbGxlY3Rpb24sIHJlbW92ZSBpdCA/XG5cdCBjb2xsZWN0aW9uLnJlbW92ZUl0ZW1zKGlkcywgbnVsbCwgbWVzc2FnZSk7XG5cdCB9XG5cdCApO1xuXHQgfVxuXHQgKi9cbn1cbiIsImltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q2hhbmdlc0RlbHRhLFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uUXVlcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbnZlcnNpb25NYXAsXG5cdGlzRnVuY3Rpb24sXG5cdEl0ZW1FbnRyeU9wdGlvbnMsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdE1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyRGVwZW5kZW5jeUludGVyZmFjZSxcblx0VHJhbnNhY3Rpb25JdGVtSGFuZGxlcixcbn0gZnJvbSAnLi4vLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1UeXBlLFxuXHRRdWVyeUNhbGxiYWNrLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciB9IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXJcblx0ZXh0ZW5kcyBDb2xsZWN0aW9uSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyBjb2xsZWN0aW9uUmVzb3VyY2VzOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uUmVzb3VyY2VbXVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZGVwZW5kZW5jaWVzOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyRGVwZW5kZW5jeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGl0ZW1IYW5kbGVyOiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2x1bW5VdGlsLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGlmICghdGhpcy5pc0xvY2FsKG9wdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0LmZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbHVtbnM6IG9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0XHRcdHBhcmVudDogb3B0aW9ucy5wYXJlbnQsXG5cdFx0XHRcdFx0XHRxdWVyeTogcXVlcnksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmddLFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cmllcztcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHF1ZXJ5U3RyaW5nIGluIHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsQ29sbGVjdGlvbkVudHJ5QnlRdWVyeVN0cmluZyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkICYmIGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSA9PT0gaXRlbVR5cGUpIHtcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXMucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2xsZWN0aW9uRW50cmllcztcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAoIXRoaXMuaXNMb2NhbChvcHRpb25zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHRcdC5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3VwZXIuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENhbGxzIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy5vbkl0ZW1zQ3JlYXRlZCBvbkl0ZW1zQ3JlYXRlZH0gY2FsbGJhY2sgd2hlbmV2ZXIgYSBjcmVhdGUgcmVxdWVzdCBpcyBkb25lIG9uIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZml0IGluIHRoZSBjb2xsZWN0aW9uXG5cdCAqIENhbiBiZSB1c2VkIHRvIHVwZGF0ZSBtYXBzIHRoYXQgdXNlIHtAbGluayBJdGVtRW50cnkuaXRlbUlkIEl0ZW1FbnRyeS5pdGVtSWR9XG5cdCAqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFlvdSBzaG91bGQgdXNlIHJlZ2lzdGVyIGEge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUucmVnaXN0ZXJGaWVsZENoYW5nZUNhbGxiYWNrIGZpZWxkIGNoYW5nZSBjYWxsYmFja30gYW5kIGNvbXBhcmUgcHJldmlvdXMuaWQgd2l0aCBmaWVsZHMuaWRcblx0ICovXG5cdHB1YmxpYyBvbkl0ZW1FbnRyaWVzQ3JlYXRlZCAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0Y29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRpZiAocmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkl0ZW1zQ3JlYXRlZChjb252ZXJzaW9uTWFwKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjbGVhckVudHJ5IChlbnRyeTogQ29sbGVjdGlvbkVudHJ5KTogdm9pZCB7XG5cdFx0dGhpcy5lbnRyaWVzLmNsZWFyKGVudHJ5KTtcblxuXHRcdGRlbGV0ZSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbZW50cnkuaWRdO1xuXHRcdC8vIHRvZG9bY2FjaGVdIGZpZ3VyZSBvdXQgd2hlbiB3ZSB3YW50IHRvIGRlbGV0ZSBxdWVyeSBtYXRjaGVzXG5cdFx0Ly8gZGVsZXRlIHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbZW50cnkucXVlcnkuc3RyaW5nXTtcblx0fVxuXG5cdHB1YmxpYyBhZGRSZXNvdXJjZSAocmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGxldCByZXNvdXJjZUFycmF5ID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZUFycmF5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc291cmNlQXJyYXkgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdID0gW107XG5cdFx0fVxuXG5cdFx0cmVzb3VyY2VBcnJheS5wdXNoKHJlc291cmNlKTtcblx0fVxuXG5cdHB1YmxpYyBjbGVhclJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblx0XHRjb25zdCBpbmRleCA9IHJlc291cmNlcy5pbmRleE9mKHJlc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJlc291cmNlcy5zcGxpY2UoXG5cdFx0XHRcdGluZGV4LFxuXHRcdFx0XHQxLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0ZGVsZXRlIHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBwYXJlbnRzIG9mIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30sIHJldHVybnMgYHZvaWRgIGJlY2F1c2UgeW91IHNob3VsZCB1c2UgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLm9uQWRkIG9uQWRkfSBhbmQge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMub25SZW1vdmUgb25SZW1vdmV9IGNhbGxiYWNrc1xuXHQgKi9cblx0cHVibGljIG1vdmVJdGVtczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0c291cmNlQ29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoc291cmNlQ29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlICE9PSBkZXN0aW5hdGlvbkNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlOiBDYW5ub3QgbW92ZSBpdGVtczogaXRlbVR5cGUgbWlzbWF0Y2gnKTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gcGFyZW50IG51bGwgP1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5LnBhcmVudCEsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXh0ZW5kQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRzb3VyY2VFbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge30sXG5cdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2s/OiBNb2RpZnlGaWVsZHNDYWxsYmFjayxcblx0KTogdm9pZCB7XG5cdFx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHdlIGNhbGwgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSBpbiBjYXNlIHRoZSBzb3VyY2VFbnRyeSB3YXNuJ3Qgb24gdGhpcyB0cmFuc2FjdGlvbiA/XG5cdFx0Y29uc3Qgc291cmNlSXRlbUVudHJpZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRzb3VyY2VFbnRyeS5pZCxcblx0XHQpO1xuXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5jbG9uZUl0ZW1FbnRyaWVzKFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0c291cmNlSXRlbUVudHJpZXMsXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKCF0aGlzLmlzTG9jYWwob3B0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRsZXQgY29sbGVjdGlvbkVudHJ5O1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0X2NvbGxlY3Rpb25FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gX2NvbGxlY3Rpb25FbnRyeTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gY29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10gfCAoKCkgPT4gSXRlbUlkW10pLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKGlzRnVuY3Rpb248KCkgPT4gSXRlbUlkW10+KHBhcmVudElkQXJyYXkpKSB7XG5cdFx0XHRwYXJlbnRJZEFycmF5ID0gcGFyZW50SWRBcnJheSgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW90ZVBhcmVudElkczogSXRlbUlkW10gPSBbXTtcblx0XHRjb25zdCBsb2NhbFBhcmVudElkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIHBhcmVudElkQXJyYXkpIHtcblx0XHRcdGlmICh0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRcdGxvY2FsUGFyZW50SWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW90ZVBhcmVudElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHtcblx0XHRcdFx0cmVtb3RlOiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0XHQuZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRyZW1vdGVQYXJlbnRJZHMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0bG9jYWw6IHRoaXMuZmV0Y2hMaW5rZWRMb2NhbENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0bG9jYWxQYXJlbnRJZHMsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdH0pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzdWx0ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0Li4ucmVzdWx0LnJlbW90ZSxcblx0XHRcdFx0XHRcdC4uLnJlc3VsdC5sb2NhbCxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4ge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXhwYW5kQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2xsZWN0aW9ucyxcblx0XHRcdFx0bmV3Q29sdW1ucyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kQ29sbGVjdGlvbkVudHJpZXM8VCBleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0XHRjb2xsZWN0aW9uczogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHRlbmRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHRcdGNvbGxlY3Rpb25zLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXM8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdHN1cGVyLl9hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdCgpID0+IGZhbHNlLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMgfCBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5pc0xvY2FsSWQocGFyZW50Lml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5VHlwZT4ge1xuXHRcdGNvbnN0IHtkaWZmZXJlbmNlfSA9IGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zLm1lcmdlUmVxdWVzdENvbHVtbnMobmV3Q29sdW1ucyk7XG5cblx0XHRpZiAoZGlmZmVyZW5jZSAhPT0gdHJ1ZSAmJiBkaWZmZXJlbmNlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5IYW5kbGVyXG5cdFx0XHQuZmV0Y2goXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRkaWZmZXJlbmNlLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdFx0XHRcdC5leHBhbmRMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRcdFx0XHQpISxcblx0XHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5leHBhbmRDb2x1bW5zKGNvbHVtbkV4cGFuc2lvbik7XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFdoZW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYXJlIGFkZGVkIHRvIHRoZSBjaGFuZ2VzIG9mIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFsbCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZXN9XG5cdCAqIHNob3VsZCBnZXQgbmV3IHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gZm9yIHRoZSBuZXdseSBhZGRlZCBlbnRyaWVzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaGFuZGxlQWRkZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0YWRkZWRFbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHQvLyBXaGVuIHRoZXJlIGFyZSBubyBDb2xsZWN0aW9uUmVzb3VyY2VzIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBJdGVtUmVzb3VyY2VzXG5cdFx0aWYgKFxuXHRcdFx0YWRkZWRFbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZS5hZGRJdGVtUmVzb3VyY2VzKGFkZGVkRW50cmllcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaGVuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFyZSByZW1vdmVkIGZyb20gdGhlIGNoYW5nZXMgb2YgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gb2YgdGhlIEl0ZW1FbnRyaWVzIHNob3VsZCBiZSByZW1vdmVkIGZyb20gYWxsIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlc31cblx0ICovXG5cdHByb3RlY3RlZCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvblJlc291cmNlcyA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKFxuXHRcdFx0cmVtb3ZlZEl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHJlbW92ZWRSZXNvdXJjZXMgPSBjb2xsZWN0aW9uUmVzb3VyY2UucmVtb3ZlSXRlbVJlc291cmNlcyhyZW1vdmVkSXRlbUVudHJpZXMpO1xuXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2UuY2FsbE9uUmVtb3ZlKHJlbW92ZWRSZXNvdXJjZXMpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZmV0Y2hDb2xsZWN0aW9uRGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRjb2xsZWN0aW9uUXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNhY2hlZENvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllcy5nZXRCeVF1ZXJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uUXVlcnksXG5cdFx0KTtcblxuXHRcdGlmIChjYWNoZWRDb2xsZWN0aW9uRW50cnkgIT09IG51bGwpIHtcblx0XHRcdC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gZW50cnkgYW5kIGl0IGNvbnRhaW5zIHRoZSBjb2x1bW5zIHdlIG5lZWQsIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIGl0XG5cblx0XHRcdGlmIChjb2x1bW5TdWJzZXRDYWNoZS5ydW4oY2FjaGVkQ29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKGNhY2hlZENvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmV4cGFuZENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRjYWNoZWRDb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmNvbHVtbkhhbmRsZXJcblx0XHRcdC5mZXRjaChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zID0gdGhpcy50cmFuc2FjdGlvbi5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyaWVzfSBvZiB3aGljaCB0aGUgcGFyZW50cyBhcmUgbG9jYWxcblx0ICovXG5cdHByaXZhdGUgZmV0Y2hMaW5rZWRMb2NhbENvbGxlY3Rpb25FbnRyaWVzIChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KSB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5kZXBlbmRlbmNpZXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCBwcm9taXNlczoge1twYXJlbnRJZDogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRjb25zdCBuZXdPcHRpb25zID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogcGFyZW50SWQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShuZXdPcHRpb25zKTtcblxuXHRcdFx0dGhpcy5leHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ld09wdGlvbnMsXG5cdFx0XHRcdHBhcnNlZFF1ZXJ5Lm9iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5kZXBlbmRlbmNpZXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChuZXdPcHRpb25zLmNvbHVtbnMpO1xuXG5cdFx0XHRwcm9taXNlc1twYXJlbnRJZF0gPSB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwID0+IHtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9pbmRleCc7XG5pbXBvcnQgeyBpc1Byb21pc2VMaWtlIH0gZnJvbSAnLi4vLi4vVXRpbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlLCBUcmFuc2FjdGlvbkVycm9yTGV2ZWwgfSBmcm9tICcuL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSB7XG5cdGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IFRyYW5zYWN0aW9uVmFsaWRhdG9yO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25WYWxpZGF0b3Ige1xuXG5cdHByaXZhdGUgbGFzdENhbGxJZDoge1xuXHRcdGdsb2JhbDoge1xuXHRcdFx0W2tleTogc3RyaW5nXTogc3RyaW5nXG5cdFx0fSxcblx0XHRpdGVtOiB7XG5cdFx0XHRbaXRlbUVudHJ5SWQ6IHN0cmluZ106IHN0cmluZ1xuXHRcdH1cblx0fSA9IHtcblx0XHRnbG9iYWw6IHt9LFxuXHRcdGl0ZW06IHt9LFxuXHR9O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaWxsIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9LCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tQ2hpbGQgYXBwbHlDaGFuZ2VzRnJvbUNoaWxkfSBvciB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX0gaXMgY2FsbGVkXG5cdCAqIEFsbG93cyB5b3UgdG8gc2V0IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmVycm9ycyBnbG9iYWwgZXJyb3JzfVxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IHZhbGlkYXRlVHJhbnNhY3Rpb24gKCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGlzIGNoYW5nZWQsIGFsbG93cyB5b3UgdG8gc2V0IGVycm9ycyBvbiB0aGUgdHJhbnNhY3Rpb25cblx0ICogQHBhcmFtIGl0ZW1FbnRyeVxuXHQgKiBAcGFyYW0gZmllbGRzXG5cdCAqIEBwYXJhbSBwcmV2aW91c1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IHZhbGlkYXRlSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkO1xuXG5cdHByb3RlY3RlZCBzZXRHbG9iYWxFcnJvciAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0aXNJbnZhbGlkOiBib29sZWFuIHwgUHJvbWlzZUludGVyZmFjZTxib29sZWFuPixcblx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuOiAoKSA9PiBzdHJpbmcsXG5cdFx0bGV2ZWw6IFRyYW5zYWN0aW9uRXJyb3JMZXZlbCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmFuZElkID0gdGhpcy5nZXRSYW5kb21JZCgpO1xuXG5cdFx0dGhpcy5sYXN0Q2FsbElkLmdsb2JhbFtrZXldID0gcmFuZElkO1xuXG5cdFx0aWYgKCFpc1Byb21pc2VMaWtlKGlzSW52YWxpZCkpIHtcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uX3NldEdsb2JhbEVycm9yKFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdGlzSW52YWxpZCxcblx0XHRcdFx0c2F2ZUJ1dHRvbkVycm9yVHJhbnNsYXRpb25Gbixcblx0XHRcdFx0bGV2ZWwsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIHRyYW5zYWN0aW9uIGlzIGludmFsaWQgd2hpbGUgaXQncyBwZW5kaW5nXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5pc1ZhbGlkID0gZmFsc2U7XG5cblx0XHRpc0ludmFsaWQudGhlbihcblx0XHRcdGlzSW52YWxpZFJlc3VsdCA9PiB7XG5cdFx0XHRcdGlmIChyYW5kSWQgIT09IHRoaXMubGFzdENhbGxJZC5nbG9iYWxba2V5XSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmxhc3RDYWxsSWQuZ2xvYmFsW2tleV07XG5cblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5fc2V0R2xvYmFsRXJyb3IoXG5cdFx0XHRcdFx0a2V5LFxuXHRcdFx0XHRcdGlzSW52YWxpZFJlc3VsdCxcblx0XHRcdFx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRcdGxldmVsLFxuXHRcdFx0XHQpO1xuXHRcdFx0fSxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5fc2V0SXNWYWxpZCgpO1xuXHRcdFx0fSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHNldEl0ZW1FcnJvciAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHRcdGVycm9yS2V5OiBzdHJpbmcsXG5cdFx0aXNJbnZhbGlkOiBib29sZWFuIHwgUHJvbWlzZUludGVyZmFjZTxib29sZWFuPixcblx0XHRmaWVsZEVycm9yVHJhbnNsYXRpb25GbjogKCkgPT4gc3RyaW5nLFxuXHRcdHNhdmVCdXR0b25FcnJvclRyYW5zbGF0aW9uRm46ICgpID0+IHN0cmluZyxcblx0XHRsZXZlbDogVHJhbnNhY3Rpb25FcnJvckxldmVsLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCByYW5kSWQgPSB0aGlzLmdldFJhbmRvbUlkKCk7XG5cblx0XHR0aGlzLmxhc3RDYWxsSWQuaXRlbVtpdGVtRW50cnlJZF0gPSByYW5kSWQ7XG5cblx0XHRpZiAoIWlzUHJvbWlzZUxpa2UoaXNJbnZhbGlkKSkge1xuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5fc2V0SXRlbUVycm9yKFxuXHRcdFx0XHRpdGVtRW50cnlJZCxcblx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdGVycm9yS2V5LFxuXHRcdFx0XHRpc0ludmFsaWQsXG5cdFx0XHRcdGZpZWxkRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRsZXZlbCxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnRyYW5zYWN0aW9uLmlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdGlzSW52YWxpZC50aGVuKFxuXHRcdFx0aXNJbnZhbGlkUmVzdWx0ID0+IHtcblx0XHRcdFx0aWYgKHJhbmRJZCAhPT0gdGhpcy5sYXN0Q2FsbElkLml0ZW1baXRlbUVudHJ5SWRdKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMubGFzdENhbGxJZC5pdGVtW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLl9zZXRJdGVtRXJyb3IoXG5cdFx0XHRcdFx0aXRlbUVudHJ5SWQsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0ZXJyb3JLZXksXG5cdFx0XHRcdFx0aXNJbnZhbGlkUmVzdWx0LFxuXHRcdFx0XHRcdGZpZWxkRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRcdHNhdmVCdXR0b25FcnJvclRyYW5zbGF0aW9uRm4sXG5cdFx0XHRcdFx0bGV2ZWwsXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLl9zZXRJc1ZhbGlkKCk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGdldFJhbmRvbUlkICgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBNYXRoXG5cdFx0XHQucmFuZG9tKClcblx0XHRcdC50b1N0cmluZygpXG5cdFx0XHQuc3BsaXQoJy4nKVsxXTtcblx0fVxuXG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0FwaUZvcm1hdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzQ29tcGlsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzUHJvY2Vzc29yJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblJlc291cmNlU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uRXhwYW5zaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkluZm8nO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5TZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5TdWJzZXRDYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9Db252ZXJzaW9uTWFwU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vS2V5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uRXZlbnRIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vTG9ja1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeU1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeVBhcnNlcic7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Tb2NrZXRNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvblZhbGlkYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzRGVsdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdEJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1DcmVhdGVTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlZENoYW5nZXNEZWx0YSc7XG4iLCJpbXBvcnQgeyBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFudGlhdGVPcHRpb25zIChcblx0b3B0aW9uczoge1trZXk6IHN0cmluZ106IGFueX0sXG5cdHZhbHVlczogb2JqZWN0LFxuKTogdm9pZCB7XG5cdGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuXHRcdGlmICghKGtleSBpbiBvcHRpb25zKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKHZhbHVlc1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdG9wdGlvbnNba2V5XSA9IHZhbHVlc1trZXldO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93TWVyZ2UgKFxuXHRvYmplY3QsXG5cdGRlZmF1bHRzLFxuKSB7XG5cdGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBkZWZhdWx0cztcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IHt9O1xuXG5cdGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG5cdFx0cmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdGRlZmF1bHRzW2tleV0gOiBvYmplY3Rba2V5XTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0aWVzIChvYmplY3QpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0UHJvcGVydHkgKG9iamVjdCkge1xuXHRpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuXHRcdHJldHVybiBrZXk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluQXJyYXkgKFxuXHRuZWVkbGUsXG5cdGhheXN0YWNrLFxuKSB7XG5cdGZvciAoY29uc3QgaGF5IG9mIGhheXN0YWNrKSB7XG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRpZiAobmVlZGxlID09IGhheSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQXJyYXk8VD4gKFxuXHRzb3VyY2U6IFRbXSxcblx0Y2FsbGJhY2s6IChlbGVtOiBUKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpbHRlcmVkOiBUW10gPSBbXTtcblxuXHRmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2UpIHtcblx0XHRpZiAoY2FsbGJhY2soc3JjKSkge1xuXHRcdFx0ZmlsdGVyZWQucHVzaChzcmMpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IHNvdXJjZS5sZW5ndGgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRlbXB0eUFycmF5KHNvdXJjZSk7XG5cblx0Zm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVyZWQpIHtcblx0XHRzb3VyY2UucHVzaChmaWx0ZXIpO1xuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eUFycmF5IChhcnJheSk6IHZvaWQge1xuXHRhcnJheS5zcGxpY2UoMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRXhpc3RzIChcblx0c291cmNlLFxuXHRwYXRoLFxuKSB7XG5cdGlmICh0eXBlb2Ygc291cmNlID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG5cdFx0aWYgKHR5cGVvZiBzb3VyY2VbcF0gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c291cmNlID0gc291cmNlW3BdO1xuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRoPFQ+IChcblx0b2JqZWN0OiBhbnksXG5cdHBhdGg6IEFycmF5PG51bWJlciB8IHN0cmluZz4sXG5cdGRlZmF1bHRzOiBhbnlbXSxcbik6IFQge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCB2YWx1ZSA9IHBhdGhbaV07XG5cblx0XHRpZiAob2JqZWN0W3ZhbHVlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvYmplY3RbdmFsdWVdID0gZGVmYXVsdHNbaV07XG5cdFx0fVxuXG5cdFx0b2JqZWN0ID0gb2JqZWN0W3ZhbHVlXTtcblx0fVxuXG5cdHJldHVybiBvYmplY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoIChcblx0b2JqZWN0OiB7fSxcblx0cGF0aDogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPixcblx0Y3JlYXRlOiBib29sZWFuID0gZmFsc2UsXG4pOiBhbnkge1xuXHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Zm9yIChjb25zdCBwIG9mIHBhdGgpIHtcblx0XHRvYmplY3QgPSBvYmplY3RbcF07IC8vIHdvbid0IGFsdGVyIHRoZSBjYWxsZXIncyB2YXJcblxuXHRcdGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCAmJiAhY3JlYXRlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8vIFRha2VuIGZyb20gQW5ndWxhckpTLCBhZGRlZCBjb21tZW50cyB0byBpZ25vcmUgVHlwZVNjcmlwdCBlcnJvcnNcbmZ1bmN0aW9uIGJhc2VFeHRlbmQgKFxuXHRkc3QsXG5cdG9ianMsXG5cdGRlZXAsXG4pIHtcblx0Zm9yIChsZXQgaSA9IDAsIGlpID0gb2Jqcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG5cdFx0Y29uc3Qgb2JqID0gb2Jqc1tpXTtcblxuXHRcdGlmICghaXNPYmplY3Qob2JqKSAmJiAhaXNGdW5jdGlvbihvYmopKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblxuXHRcdGZvciAobGV0IGogPSAwLCBqaiA9IGtleXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuXHRcdFx0Y29uc3Qga2V5ID0ga2V5c1tqXTtcblx0XHRcdGNvbnN0IHNyYyA9IG9ialtrZXldO1xuXG5cdFx0XHRpZiAoZGVlcCAmJiBpc09iamVjdChzcmMpKSB7XG5cdFx0XHRcdGlmIChpc0RhdGUoc3JjKSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gbmV3IERhdGUoc3JjLnZhbHVlT2YoKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNSZWdFeHAoc3JjKSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gbmV3IFJlZ0V4cChzcmMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNyYy5ub2RlTmFtZSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gc3JjLmNsb25lTm9kZSh0cnVlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0VsZW1lbnQoc3JjKSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gc3JjLmNsb25lKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCFpc09iamVjdChkc3Rba2V5XSkpIHtcblx0XHRcdFx0XHRcdGRzdFtrZXldID0gaXNBcnJheShzcmMpID8gW10gOiB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRiYXNlRXh0ZW5kKFxuXHRcdFx0XHRcdFx0ZHN0W2tleV0sXG5cdFx0XHRcdFx0XHRbc3JjXSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZHN0W2tleV0gPSBzcmM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGRzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCAoXG5cdGRzdCxcblx0Li4uYXJnc1xuKSB7XG5cdHJldHVybiBiYXNlRXh0ZW5kKFxuXHRcdGRzdCxcblx0XHRhcmdzLFxuXHRcdGZhbHNlLFxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UgKFxuXHRkc3QsXG5cdC4uLmFyZ3Ncbikge1xuXHRyZXR1cm4gYmFzZUV4dGVuZChcblx0XHRkc3QsXG5cdFx0YXJncyxcblx0XHR0cnVlLFxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QgKHZhbHVlKSB7XG5cdC8vIGh0dHA6Ly9qc3BlcmYuY29tL2lzb2JqZWN0NFxuXHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQmxhbmtPYmplY3QgKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcgKHZhbHVlKSB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIgKHZhbHVlKSB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlICh2YWx1ZSkge1xuXHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZXhwb3J0IGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbjxUPiAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFQge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlTGlrZTxUID0gYW55PiAob2JqOiBhbnkpOiBvYmogaXMgUHJvbWlzZUludGVyZmFjZTxUPiB7XG5cdHJldHVybiBvYmogJiYgaXNGdW5jdGlvbihvYmoudGhlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ0V4cCAodmFsdWUpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50IChub2RlKSB7XG5cdHJldHVybiAhIShub2RlICYmXG5cdFx0KFxuXHRcdFx0bm9kZS5ub2RlTmFtZSAgLy8gV2UgYXJlIGEgZGlyZWN0IGVsZW1lbnQuXG5cdFx0XHR8fCAobm9kZS5wcm9wICYmIG5vZGUuYXR0ciAmJiBub2RlLmZpbmQpXG5cdFx0KVxuXHQpOyAgLy8gV2UgaGF2ZSBhbiBvbiBhbmQgZmluZCBtZXRob2QgcGFydCBvZiBqUXVlcnkgQVBJLlxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3cgKG9iaikge1xuXHRyZXR1cm4gb2JqICYmIG9iai53aW5kb3cgPT09IG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZCAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMgKFxuXHRvMSxcblx0bzIsXG4pIHtcblx0aWYgKG8xID09PSBvMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKG8xID09PSBudWxsIHx8IG8yID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuXHRpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IC8vIE5hTiA9PT0gTmFOXG5cblx0Y29uc3QgdDEgPSB0eXBlb2YgbzE7XG5cdGNvbnN0IHQyID0gdHlwZW9mIG8yO1xuXG5cdGxldCBsZW5ndGg7XG5cdGxldCBrZXk7XG5cdGxldCBrZXlTZXQ7XG5cblx0aWYgKHQxID09PSB0MiAmJiB0MSA9PT0gJ29iamVjdCcpIHtcblx0XHRpZiAoaXNBcnJheShvMSkpIHtcblx0XHRcdGlmICghaXNBcnJheShvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZW5ndGggPSBvMS5sZW5ndGg7XG5cblx0XHRcdGlmIChvMS5sZW5ndGggPT09IG8yLmxlbmd0aCkge1xuXHRcdFx0XHRmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHtcblx0XHRcdFx0XHRpZiAoIWVxdWFscyhcblx0XHRcdFx0XHRcdG8xW2tleV0sXG5cdFx0XHRcdFx0XHRvMltrZXldLFxuXHRcdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzRGF0ZShvMSkpIHtcblx0XHRcdGlmICghaXNEYXRlKG8yKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaW1wbGVDb21wYXJlKFxuXHRcdFx0XHRvMS5nZXRUaW1lKCksXG5cdFx0XHRcdG8yLmdldFRpbWUoKSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChpc1JlZ0V4cChvMSkpIHtcblx0XHRcdGlmICghaXNSZWdFeHAobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG8xLnRvU3RyaW5nKCkgPT09IG8yLnRvU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChpc1dpbmRvdyhvMSkgfHwgaXNXaW5kb3cobzIpIHx8IGlzQXJyYXkobzIpIHx8IGlzRGF0ZShvMikgfHwgaXNSZWdFeHAobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0a2V5U2V0ID0gY3JlYXRlTWFwKCk7XG5cdFx0XHRmb3IgKGtleSBpbiBvMSkge1xuXHRcdFx0XHRpZiAoaXNGdW5jdGlvbihvMVtrZXldKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFlcXVhbHMoXG5cdFx0XHRcdFx0bzFba2V5XSxcblx0XHRcdFx0XHRvMltrZXldLFxuXHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5U2V0W2tleV0gPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGtleSBpbiBvMikge1xuXHRcdFx0XHRpZiAoIShrZXkgaW4ga2V5U2V0KSAmJiBpc0RlZmluZWQobzJba2V5XSkgJiYgIWlzRnVuY3Rpb24obzJba2V5XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXAgKCkge1xuXHRyZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuZnVuY3Rpb24gc2ltcGxlQ29tcGFyZSAoXG5cdGEsXG5cdGIsXG4pIHtcblx0cmV0dXJuIGEgPT09IGIgfHwgKGEgIT09IGEgJiYgYiAhPT0gYik7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRPYmplY3RNYXhEZXB0aCAobWF4RGVwdGgpIHtcblx0cmV0dXJuIGlzTnVtYmVyKG1heERlcHRoKSAmJiBtYXhEZXB0aCA+IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5IChcblx0c291cmNlLFxuXHRkZXN0aW5hdGlvbj8sXG5cdG1heERlcHRoPyxcbikge1xuXHRjb25zdCBzdGFja1NvdXJjZSA9IFtdO1xuXHRjb25zdCBzdGFja0Rlc3QgPSBbXTtcblxuXHRtYXhEZXB0aCA9IGlzVmFsaWRPYmplY3RNYXhEZXB0aChtYXhEZXB0aCkgPyBtYXhEZXB0aCA6IE5hTjtcblxuXHRpZiAoZGVzdGluYXRpb24pIHtcblx0XHRpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNvcHkhIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGlkZW50aWNhbC4nKTtcblx0XHR9XG5cblx0XHQvLyBFbXB0eSB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG5cdFx0aWYgKGlzQXJyYXkoZGVzdGluYXRpb24pKSB7XG5cdFx0XHRkZXN0aW5hdGlvbi5sZW5ndGggPSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBkZXN0aW5hdGlvbikge1xuXHRcdFx0XHRkZWxldGUgZGVzdGluYXRpb25ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0c3RhY2tTb3VyY2UucHVzaChzb3VyY2UpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja0Rlc3QucHVzaChkZXN0aW5hdGlvbik7XG5cblx0XHRyZXR1cm4gY29weVJlY3Vyc2UoXG5cdFx0XHRzb3VyY2UsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdG1heERlcHRoLFxuXHRcdCk7XG5cdH1cblxuXHRyZXR1cm4gY29weUVsZW1lbnQoXG5cdFx0c291cmNlLFxuXHRcdG1heERlcHRoLFxuXHQpO1xuXG5cdGZ1bmN0aW9uIGNvcHlSZWN1cnNlIChcblx0XHRfc291cmNlLFxuXHRcdF9kZXN0aW5hdGlvbixcblx0XHRfbWF4RGVwdGgsXG5cdCkge1xuXHRcdF9tYXhEZXB0aC0tO1xuXG5cdFx0aWYgKF9tYXhEZXB0aCA8IDApIHtcblx0XHRcdHJldHVybiAnLi4uJztcblx0XHR9XG5cblx0XHRpZiAoaXNBcnJheShfc291cmNlKSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGlpID0gX3NvdXJjZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdFx0XHRcdF9kZXN0aW5hdGlvbi5wdXNoKGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdF9zb3VyY2VbaV0sXG5cdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHQpKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzQmxhbmtPYmplY3QoX3NvdXJjZSkpIHtcblx0XHRcdC8vIGNyZWF0ZU1hcCgpIGZhc3QgcGF0aCAtLS0gU2FmZSB0byBhdm9pZCBoYXNPd25Qcm9wZXJ0eSBjaGVjayBiZWNhdXNlIHByb3RvdHlwZSBjaGFpbiBpcyBlbXB0eVxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gX3NvdXJjZSkge1xuXHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdF9zb3VyY2Vba2V5XSxcblx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChfc291cmNlICYmIHR5cGVvZiBfc291cmNlLmhhc093blByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvLyBTbG93IHBhdGgsIHdoaWNoIG11c3QgcmVseSBvbiBoYXNPd25Qcm9wZXJ0eVxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gX3NvdXJjZSkge1xuXHRcdFx0XHRpZiAoX3NvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0X2Rlc3RpbmF0aW9uW2tleV0gPSBjb3B5RWxlbWVudChcblx0XHRcdFx0XHRcdF9zb3VyY2Vba2V5XSxcblx0XHRcdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFNsb3dlc3QgcGF0aCAtLS0gaGFzT3duUHJvcGVydHkgY2FuJ3QgYmUgY2FsbGVkIGFzIGEgbWV0aG9kXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG5cdFx0XHRcdFx0X3NvdXJjZSxcblx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gX2Rlc3RpbmF0aW9uO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29weUVsZW1lbnQgKFxuXHRcdF9zb3VyY2UsXG5cdFx0X21heERlcHRoID0gNSxcblx0KSB7XG5cdFx0Ly8gU2ltcGxlIHZhbHVlc1xuXHRcdGlmICghaXNPYmplY3QoX3NvdXJjZSkpIHtcblx0XHRcdHJldHVybiBfc291cmNlO1xuXHRcdH1cblxuXHRcdC8vIEFscmVhZHkgY29waWVkIHZhbHVlc1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRjb25zdCBpbmRleCA9IHN0YWNrU291cmNlLmluZGV4T2YoX3NvdXJjZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gc3RhY2tEZXN0W2luZGV4XTtcblx0XHR9XG5cblx0XHRpZiAoaXNXaW5kb3coX3NvdXJjZSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjb3B5ISBNYWtpbmcgY29waWVzIG9mIFdpbmRvdyBpbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcblx0XHR9XG5cblx0XHRsZXQgbmVlZHNSZWN1cnNlID0gZmFsc2U7XG5cdFx0bGV0IF9kZXN0aW5hdGlvbiA9IGNvcHlUeXBlKF9zb3VyY2UpO1xuXG5cdFx0aWYgKF9kZXN0aW5hdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRfZGVzdGluYXRpb24gPSBpc0FycmF5KF9zb3VyY2UpID8gW10gOiBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihfc291cmNlKSk7XG5cdFx0XHRuZWVkc1JlY3Vyc2UgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja1NvdXJjZS5wdXNoKF9zb3VyY2UpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja0Rlc3QucHVzaChfZGVzdGluYXRpb24pO1xuXG5cdFx0cmV0dXJuIG5lZWRzUmVjdXJzZVxuXHRcdFx0PyBjb3B5UmVjdXJzZShcblx0XHRcdFx0X3NvdXJjZSxcblx0XHRcdFx0X2Rlc3RpbmF0aW9uLFxuXHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHQpXG5cdFx0XHQ6IF9kZXN0aW5hdGlvbjtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvcHlUeXBlIChfc291cmNlKSB7XG5cdFx0c3dpdGNoICh0b1N0cmluZy5jYWxsKF9zb3VyY2UpKSB7XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDhBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBJbnQxNkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDMyQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRmxvYXQzMkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBVaW50OEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQxNkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQzMkFycmF5XSc6XG5cdFx0XHRcdHJldHVybiBuZXcgX3NvdXJjZS5jb25zdHJ1Y3Rvcihcblx0XHRcdFx0XHRjb3B5RWxlbWVudChfc291cmNlLmJ1ZmZlciksXG5cdFx0XHRcdFx0X3NvdXJjZS5ieXRlT2Zmc2V0LFxuXHRcdFx0XHRcdF9zb3VyY2UubGVuZ3RoLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEFycmF5QnVmZmVyXSc6XG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTBcblx0XHRcdFx0aWYgKCFfc291cmNlLnNsaWNlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgd2UncmUgaW4gdGhpcyBjYXNlIHdlIGtub3cgdGhlIGVudmlyb25tZW50IHN1cHBvcnRzIEFycmF5QnVmZmVyXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cblx0XHRcdFx0XHRjb25zdCBjb3BpZWQgPSBuZXcgQXJyYXlCdWZmZXIoX3NvdXJjZS5ieXRlTGVuZ3RoKTtcblx0XHRcdFx0XHRuZXcgVWludDhBcnJheShjb3BpZWQpLnNldChuZXcgVWludDhBcnJheShfc291cmNlKSk7XG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSAqL1xuXHRcdFx0XHRcdHJldHVybiBjb3BpZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIF9zb3VyY2Uuc2xpY2UoMCk7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBOdW1iZXJdJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IERhdGVdJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKF9zb3VyY2UudmFsdWVPZigpKTtcblxuXHRcdFx0Y2FzZSAnW29iamVjdCBSZWdFeHBdJzpcblx0XHRcdFx0Y29uc3QgcmUgPSBuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdF9zb3VyY2UuX3NvdXJjZSxcblx0XHRcdFx0XHRfc291cmNlLnRvU3RyaW5nKClcblx0XHRcdFx0XHRcdC5tYXRjaCgvW14vXSokLylbMF0sXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0cmUubGFzdEluZGV4ID0gX3NvdXJjZS5sYXN0SW5kZXg7XG5cblx0XHRcdFx0cmV0dXJuIHJlO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEJsb2JdJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKFxuXHRcdFx0XHRcdFtfc291cmNlXSxcblx0XHRcdFx0XHR7dHlwZTogX3NvdXJjZS50eXBlfSxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoaXNGdW5jdGlvbihfc291cmNlLmNsb25lTm9kZSkpIHtcblx0XHRcdHJldHVybiBfc291cmNlLmNsb25lTm9kZSh0cnVlKTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEVudHJ5UGFyZW50TnVsbCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSA9IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz47XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlPcHRpb25zIHtcblx0cHVibGljIGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gdHJ1ZTtcblx0cHVibGljIHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0cHVibGljIHRlbXBsYXRlT3B0aW9uczogYW55ID0ge307IC8vIFRPRE9cblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBJdGVtRW50cnlPcHRpb25zSW50ZXJmYWNlKSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKFxuXHRcdFx0dGhpcyxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgaWQ6IG51bWJlciA9ICsrY3VycmVudElkO1xuXHRwdWJsaWMgcmVsb2FkUXVldWVkOiBib29sZWFuID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgaXRlbUlkOiBJdGVtSWQsXG5cdFx0cHVibGljIGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBxdWV1ZVJlbG9hZCAoKTogdGhpcyB7XG5cdFx0dGhpcy5yZWxvYWRRdWV1ZWQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZmFjdG9yeS5rZXlTZXJ2aWNlLmlzTG9jYWxJZCh0aGlzLml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NrYWJsZSAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoICh0aGlzLml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ01hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Y2FzZSAnVm9lcnR1aWcnOlxuXHRcdFx0Y2FzZSAnVGVtcGxhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OICgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IHRoaXMuaWQsXG5cdFx0XHRjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUGF0aCwgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UsIFJlc3BvbnNlQ29sdW1uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cblx0cHVibGljIGNvbHVtbnM6IHtbY29sdW1uSWQ6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1ufTtcblx0cHVibGljIGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblx0cHVibGljIGluaXRpYWw6IFJlYWRvbmx5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRwdWJsaWMgcmVhZG9ubHkgZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHByb3RlY3RlZCByZWFkb25seSBfaXNOZXc6IGJvb2xlYW4sXG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLnJlc3BvbnNlW2VudHJ5LmNvbHVtbnMuaXRlbVR5cGVdO1xuXHRcdHRoaXMuaW5pdGlhbCA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmluaXRpYWw7XG5cdFx0dGhpcy5maWVsZHMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcztcblxuXHRcdHRoaXMub25Db25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8vIFVzZWQgZm9yIHJlc291cmNlIGNsZWFyaW5nIHRlc3RzXG5cdHB1YmxpYyBvbkNvbnN0cnVjdCAoKTogdm9pZCB7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXBkYXRlcyB0aGUgZmllbGRzIG9mIHRoZSBpdGVtIGFuZCBjYWxscyBvbkNoYW5nZSwgd2hlbiB1cGRhdGluZyBtYW55IGZpZWxkcyBvZiBtYW55IGl0ZW1zIGl0J3MgYmV0dGVyIHRvIGNyZWF0ZSBhIHtAbGluayBDaGFuZ2VzRGVsdGEgQ2hhbmdlc0RlbHRhfSB5b3Vyc2VsZiBzbyBhbGwgY2hhbmdlcyBjYW4gYmUgYXBwbGllZCBhdCBvbmNlXG5cdCAqL1xuXHRwdWJsaWMgc2V0RmllbGRzIChcblx0XHR2YWx1ZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dGhpcz4ge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHZhbHVlcykge1xuXHRcdFx0Y29uc3QgY29sdW1uID0gY29sdW1uc1tjb2x1bW5JZF07XG5cblx0XHRcdGlmIChjb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0J3NldEZpZWxkczogbm8gY29sdW1uIGZvdW5kIGZvcicsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVDaGFuZ2VzRGVsdGEoKTtcblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMsXG5cdFx0XHRcdHRoaXMuZmFjdG9yeS5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjb3B5RmllbGRzIChkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyeTtcblxuXHRcdHRoaXMuZmFjdG9yeS5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHRoaXMuZmllbGRzLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgSXRlbVJlc291cmNlJ3MgcGFyZW50IHdpdGggdGhlIGN1cnJlbnQgZmllbGRzXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byBnZXQgdGhlIHBhcmVudCBhZnRlciBhbiBpdGVtIGhhcyBiZWVuIGRlbGV0ZWRcblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQgKFxuXHRcdGZyb21Jbml0aWFsPzogYm9vbGVhbixcblx0KTogRW50cnlQYXJlbnROdWxsIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0ZnJvbUluaXRpYWwsXG5cdFx0XHR0aGlzLmZpZWxkcyxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSB0cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YX0gaW5zdGVhZFxuXHQgKi9cblx0cHVibGljIGNhbGxPbkNoYW5nZSAoKTogdm9pZCB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVc2Ugc2V0RmllbGRzIGluc3RlYWQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXRpbGl0eSBmdW5jdGlvbiB0byBlYXNpbHkgY2hlY2sgaWYgYSBmaWVsZCBpcyBjaGFuZ2VkLlxuXHQgKiBXaWxsIHJldHVybiBgZmFsc2VgIGlmIHRoZSBmaWVsZCBpcyBjaGFuZ2VkXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIG9uQ2hhbmdlOiAoXG5cdCAqICAgICBpdGVtUmVzb3VyY2UsXG5cdCAqICAgICBwcmV2aW91cyxcblx0ICogICAgIGNvbXBhcmVJdGVtRmllbGRcblx0ICogKSB7XG5cdCAqICAgICBpZiAoIWNvbXBhcmVJdGVtRmllbGQoJ2NvbHVtbklkJykpIHtcblx0ICogICAgICAgICBwcm9jZXNzSXRlbShpdGVtUmVzb3VyY2UpO1xuXHQgKiAgICAgfVxuXHQgKiB9XG5cdCAqL1xuXHRwdWJsaWMgY29tcGFyZUl0ZW1GaWVsZCAoXG5cdFx0Y29sdW1uSWQ6IGtleW9mIEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uc1tjb2x1bW5JZF07XG5cblx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTWlzc2luZyBjb2x1bW4gaW4gSXRlbVJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5mYWN0b3J5LmFwaUZvcm1hdHRlci5jb21wYXJlRmllbGRzKFxuXHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHR0aGlzLmZpZWxkc1tjb2x1bW5JZF0sXG5cdFx0XHRwcmV2aW91c1tjb2x1bW5JZF0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBoYXNDaGFuZ2VzICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdC5kZXRlY3RFbnRyeUNoYW5nZXModGhpcy5lbnRyeS5pZCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0VHJhbnNhY3Rpb25QYXJhbWV0ZXJzIChcblx0XHRwYXJhbWV0ZXJzOiBhbnksXG5cdCk6IHZvaWQge1xuXHRcdGNyZWF0ZVBhdGgoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0W1xuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiAnaXNOZXcnIG1lYW5zIHRoYXQgdGhlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBpcyBhIGxvY2FsIGl0ZW0gYW5kIHRoYXQgdGhpcyByZXNvdXJjZSB3YXMgY3JlYXRlZCB3aGVuIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gd2FzIGZpcnN0IGNyZWF0ZWRcblx0ICovXG5cdHB1YmxpYyBpc05ldyAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzTmV3O1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJ5LmlzTG9jYWwoKTtcblx0fVxuXG5cdHB1YmxpYyB0b0pTT04gKCkge1xuXHRcdGNvbnN0IGNvbHVtbklkczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdGhpcy5jb2x1bW5zKSB7XG5cdFx0XHRjb2x1bW5JZHMucHVzaChjb2x1bW5JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbHVtbnM6IGNvbHVtbklkcyxcblx0XHRcdGZpZWxkczogdGhpcy5maWVsZHMsXG5cdFx0XHRlbnRyeTogdGhpcy5lbnRyeSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uUGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHBhdGggY291bGRuJ3QgYmUgdHJhdmVyc2VkXG5cdCAqXG5cdCAqIEBwYXJhbSBjb2x1bW5QYXRoIENhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgY29sdW1uSWRzIChbJ2NvbHVtbicsICdjb2x1bW4yJ10pIG9yIGEgY29uZmlnIGNvbHVtbiBzdHJpbmcgKCdjb2x1bW4+Y29sdW1uMicpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlPFQgZXh0ZW5kcyBhbnkgPSBhbnk+IChjb2x1bW5QYXRoOiBzdHJpbmdbXSB8IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmdldERlcml2ZWRWYWx1ZShcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgY29sdW1uIHBhdGggYW5kIHJldHVybnMgdGhlIGZpZWxkcyBvZiB0aGUgZGVyaXZlZCBpdGVtLCByZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaXRlbSBpc24ndCBmb3VuZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBBc3N1bWVzIHRoZSBkZXJpdmVkIGl0ZW0ncyB2YWx1ZXMgYXJlIGFscmVhZHkgY2FjaGVkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlcyAoXG5cdFx0Y29sdW1uUGF0aDogc3RyaW5nW10sXG5cdCk6IFJlYWRvbmx5PEZpZWxkTWFwPiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZ2V0RGVyaXZlZFZhbHVlcyhcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBBcGlSZXF1ZXN0TGltaXQsIEVudHJ5UGFyZW50TnVsbCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSA9IFBhcnRpYWw8Q29sbGVjdGlvbkVudHJ5T3B0aW9ucz47XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnlPcHRpb25zIHtcblx0Y29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSBbXTtcblx0cXVlcnk6IEFwaVF1ZXJ5IHwgbnVsbCA9IG51bGw7XG5cdHF1ZXJ5UGFyYW1zOiBhbnkgPSB7fTsgLy8gVE9ET1xuXHRxdWVyeUNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gW107XG5cdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0ZGVmZXJSZXF1ZXN0OiBib29sZWFuID0gZmFsc2U7XG5cdGxpbWl0OiBBcGlSZXF1ZXN0TGltaXQgfCBudWxsID0gbnVsbDtcblx0ZW50cnlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yICh2YWx1ZXM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UpIHtcblx0XHRpbnN0YW50aWF0ZU9wdGlvbnMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0dmFsdWVzLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uUmVzb3VyY2UsIEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbnZlcnNpb25NYXAsIEZpZWxkQ2hhbmdlQ2FsbGJhY2ssIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSAoXG5cdGl0ZW1SZXNvdXJjZXM6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlT25BZGRDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSAoXG5cdGl0ZW1SZXNvdXJjZXM6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0aXNJbml0aWFsQ2FsbDogYm9vbGVhbixcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlSW5pdGlhbENhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IChcblx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgT25JdGVtc0NyZWF0ZWRDYWxsYmFjayA9IChjb252ZXJzaW9uTWFwOiBDb252ZXJzaW9uTWFwKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IFBhcnRpYWw8Q29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+PjtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblx0Y2FsbE9uQWRkV2l0aEluaXRpYWxJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKiBZb3Ugc2hvdWxkIHVzZSByZWdpc3RlciBhIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLnJlZ2lzdGVyRmllbGRDaGFuZ2VDYWxsYmFjayBmaWVsZCBjaGFuZ2UgY2FsbGJhY2t9IGFuZCBjb21wYXJlIHByZXZpb3VzLmlkIHdpdGggZmllbGRzLmlkXG5cdCAqL1xuXHRvbkl0ZW1zQ3JlYXRlZDogT25JdGVtc0NyZWF0ZWRDYWxsYmFjayA9IG5vb3A7XG5cdG9uQWRkOiBDb2xsZWN0aW9uUmVzb3VyY2VPbkFkZENhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRvblJlbW92ZTogQ29sbGVjdGlvblJlc291cmNlQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPiA9IG5vb3A7XG5cdG9uQ2hhbmdlOiBGaWVsZENoYW5nZUNhbGxiYWNrID0gbm9vcDtcblx0b25BZGRJbml0aWFsOiBDb2xsZWN0aW9uUmVzb3VyY2VJbml0aWFsQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPiA9IG5vb3A7XG5cdG9uUmVtb3ZlSW5pdGlhbDogQ29sbGVjdGlvblJlc291cmNlSW5pdGlhbENhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRyZXNvdXJjZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdGN1c3RvbTogYW55ID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4pIHtcblx0XHRpbnN0YW50aWF0ZU9wdGlvbnMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0dmFsdWVzLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsIENvbHVtbkV4cGFuc2lvbiwgQ29sdW1uSW5mbywgQ29sdW1uU2V0LCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2xsZWN0aW9uUXVlcnksXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0SXRlbUlkLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5sZXQgY3VycmVudElkID0gMDtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXG5cdHB1YmxpYyBpZDogbnVtYmVyID0gY3VycmVudElkKys7XG5cdHB1YmxpYyBwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCA9IG51bGw7XG5cdHB1YmxpYyBxdWVyeTogQ29sbGVjdGlvblF1ZXJ5O1xuXHRwdWJsaWMgY29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT47XG5cdHB1YmxpYyByZWxvYWRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHVibGljIHByb21pc2U6IFByb21pc2VJbnRlcmZhY2U8dGhpcz47XG5cblx0Ly8gcHJpdmF0ZSB0ZW1wbGF0ZUNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHwgbnVsbCA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHB1YmxpYyBvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpIHtcblx0XHR0aGlzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXHRcdHRoaXMucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucyk7XG5cdFx0dGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdFN0dWIoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudC5pdGVtSWQpO1xuXHR9XG5cblx0cHVibGljIG1hdGNoUGFyZW50IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vID09IHRvIGNvbXBhcmUgaXRlbUlkc1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHBhcmVudC5pdGVtVHlwZSA9PT0gaXRlbVR5cGUgJiYgcGFyZW50Lml0ZW1JZCA9PSBpdGVtSWQ7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kUXVlcnkgKGNhbGxiYWNrPzogUXVlcnlDYWxsYmFjayk6IEFwaVF1ZXJ5IHtcblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0aWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnF1ZXJ5O1xuXHRcdH1cblxuXHRcdG9wdGlvbnMucXVlcnlQYXJhbXMgPSBjYWxsYmFjayhvcHRpb25zLnF1ZXJ5UGFyYW1zKTtcblxuXHRcdHJldHVybiB0aGlzLnF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG9wdGlvbnMpO1xuXHR9XG5cblx0cHVibGljIHF1ZXVlUmVsb2FkICgpOiB2b2lkIHtcblx0XHR0aGlzLnJlbG9hZFF1ZXVlZCA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29sdW1ucyAoY29sdW1uRXhwYW5zaW9uOiBDb2x1bW5FeHBhbnNpb248SXRlbVR5cGVUeXBlPik6IHZvaWQge1xuXHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGNvbHVtbkV4cGFuc2lvbi5ydW4odGhpcy5jb2x1bW5zKTtcblxuXHRcdGlmIChleHBhbnNpb25SZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmNvbHVtbnMgPSBleHBhbnNpb25SZXN1bHQubWVyZ2VkO1xuXHRcdC8vIHRoaXMudGVtcGxhdGVDb2x1bW5zID0gbnVsbDtcblx0XHR0aGlzLm9wdGlvbnMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5yZXF1ZXN0O1xuXHR9XG5cblx0cHVibGljIGV4cGFuZFJlcXVlc3RDb2x1bW5zIChyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiB2b2lkIHtcblx0XHR0aGlzLmNvbHVtbnMuZXhwYW5kUmVxdWVzdENvbHVtbnMocmVxdWVzdENvbHVtbnMpO1xuXHRcdHRoaXMub3B0aW9ucy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLnJlcXVlc3Q7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VXBkYXRlZEl0ZW1Db2x1bW5zIChcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiB7W2NvbHVtbklkOiBzdHJpbmddOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT59IHtcblx0XHRjb25zdCBpdGVtQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5pdGVtO1xuXHRcdGNvbnN0IHJlc3VsdDoge1tjb2x1bW5JZDogc3RyaW5nXTogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgaXRlbUNvbHVtbnMpIHtcblx0XHRcdGlmIChjb252ZXJzaW9uTWFwW2NvbHVtbi5hcGlDb2x1bW4uaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbi5pZF0gPSBjb2x1bW47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdXG5cdC8vIGdldEFkZGVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IHRydWUpOiBJdGVtSWRbXTtcblx0Ly8gZ2V0QWRkZWRJdGVtcyAocmV0dXJuSXRlbUlkcz86IGJvb2xlYW4pOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cdC8vIGdldEFkZGVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHQvLyBcdGNvbnN0IGluaXRpYWwgPSB0aGlzLmluaXRpYWw7XG5cdC8vIFx0Y29uc3QgbW9kaWZpZWQgPSB0aGlzLml0ZW1zO1xuXHQvLyBcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4gfCBJdGVtSWQ+ID0gW107XG5cdC8vXG5cdC8vIFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgbW9kaWZpZWQpIHtcblx0Ly8gXHRcdGlmIChpbml0aWFsLmluZGV4T2YoaXRlbUVudHJ5KSA9PT0gLTEpIHtcblx0Ly8gXHRcdFx0cmVzdWx0LnB1c2gocmV0dXJuSXRlbUlkcyA/IGl0ZW1FbnRyeS5pdGVtSWQgOiBpdGVtRW50cnkpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRyZXR1cm4gcmVzdWx0O1xuXHQvLyB9XG5cdC8vXG5cdC8vIGdldFJlbW92ZWRJdGVtcyAocmV0dXJuSXRlbUlkczogdHJ1ZSk6IEl0ZW1JZFtdO1xuXHQvLyBnZXRSZW1vdmVkSXRlbXMgKHJldHVybkl0ZW1JZHM/OiBib29sZWFuKTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXHQvLyBnZXRSZW1vdmVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHQvLyBcdGNvbnN0IGluaXRpYWwgPSB0aGlzLmluaXRpYWw7XG5cdC8vIFx0Y29uc3QgbW9kaWZpZWQgPSB0aGlzLml0ZW1zO1xuXHQvLyBcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4gfCBJdGVtSWQ+ID0gW107XG5cdC8vXG5cdC8vIFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW5pdGlhbCkge1xuXHQvLyBcdFx0aWYgKG1vZGlmaWVkLmluZGV4T2YoaXRlbUVudHJ5KSA9PT0gLTEpIHtcblx0Ly8gXHRcdFx0cmVzdWx0LnB1c2gocmV0dXJuSXRlbUlkcyA/IGl0ZW1FbnRyeS5pdGVtSWQgOiBpdGVtRW50cnkpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRyZXR1cm4gcmVzdWx0O1xuXHQvLyB9XG5cdC8vXG5cdC8vIGdldFVwZGF0ZWRJdGVtcyAoKTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0Ly8gXHRjb25zdCBtb2RpZmllZCA9IHRoaXMuaXRlbXM7XG5cdC8vIFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0Ly9cblx0Ly8gXHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBtb2RpZmllZCkge1xuXHQvLyBcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpICYmIGl0ZW1FbnRyeS5oYXNDaGFuZ2VzKCkpIHtcblx0Ly8gXHRcdFx0cmVzdWx0LnB1c2goaXRlbUVudHJ5KTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vXG5cdC8vIFx0cmV0dXJuIHJlc3VsdDtcblx0Ly8gfVxuXG5cdC8vIHRvZG9bY2FjaGVdIFRoaXMgaXMgdXNlZCBpbiB0aGUgZnJvbnRlbmQgaW4gdGhlIHBsYW5uZXIsIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCBmaXggdGhhdCBpbiB0aGUgZnJvbnRlbmQgc29tZSBvdGhlciB3YXlcblx0Ly8gcHVibGljIG9uQWRkSW5pdGlhbCAoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pik6IHZvaWQge1xuXHQvLyBcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy5yZXNvdXJjZXMpIHtcblx0Ly8gXHRcdHRyeSB7XG5cdC8vIFx0XHRcdHJlc291cmNlLm9wdGlvbnMub25BZGRJbml0aWFsKFxuXHQvLyBcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHQvLyBcdFx0XHRcdHRoaXMsXG5cdC8vIFx0XHRcdCk7XG5cdC8vIFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHQvLyBcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly8gfVxuXHQvL1xuXHQvLyBwdWJsaWMgb25SZW1vdmVJbml0aWFsIChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KTogdm9pZCB7XG5cdC8vIFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLnJlc291cmNlcykge1xuXHQvLyBcdFx0dHJ5IHtcblx0Ly8gXHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vblJlbW92ZUluaXRpYWwoXG5cdC8vIFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdC8vIFx0XHRcdFx0dGhpcyxcblx0Ly8gXHRcdFx0KTtcblx0Ly8gXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvLyB9XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJBcnJheSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi9jbGFzc2VzL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsIEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdENvbXBhcmVGaWVsZENhbGxiYWNrLFxuXHREZXJlZ0Z1bmN0aW9uLFxuXHRGaWVsZENoYW5nZUNhbGxiYWNrLFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtUmVzb3VyY2VJdGVtSWRNYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRRdWVyeUNhbGxiYWNrLFxuXHRSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgaXRlbXM6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pjtcblx0cHVibGljIGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA7XG5cdHByb3RlY3RlZCBpdGVtSWRNYXA6IEl0ZW1SZXNvdXJjZUl0ZW1JZE1hcDxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gPSB7fTtcblxuXHRwcml2YXRlIGZpZWxkQ2hhbmdlRGVyZWdGbnM6IHtcblx0XHRbaXRlbUlkOiBzdHJpbmddOiBEZXJlZ0Z1bmN0aW9uXG5cdH0gPSB7fTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG9uQ2hhbmdlOiBGaWVsZENoYW5nZUNhbGxiYWNrO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgZmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRwdWJsaWMgZW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHB1YmxpYyBvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHVibGljIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLml0ZW1zID0gW107XG5cdFx0dGhpcy5pdGVtSWRNYXAgPSB7fTtcblx0XHR0aGlzLmNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLnJlc3BvbnNlO1xuXG5cdFx0Ly8gdGhpcyBhbGxvd3MgdXMgdG8gdXBkYXRlIHRoZSBvbkNoYW5nZSBmdW5jdGlvbiBpbiB0aGUgb3B0aW9uc1xuXHRcdHRoaXMub25DaGFuZ2UgPSAoXG5cdFx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0Y29tcGFyZUZpZWxkOiBDb21wYXJlRmllbGRDYWxsYmFjayxcblx0XHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4sXG5cdFx0XHRwcmV2aW91czogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHQpID0+IHtcblx0XHRcdGlmICghY29tcGFyZUZpZWxkKCdpZCcpKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUlkTWFwW2ZpZWxkcy5pZF0gPSB0aGlzLmdldEl0ZW1CeUlkKHByZXZpb3VzLmlkKTtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUlkTWFwW3ByZXZpb3VzLmlkXTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5vcHRpb25zLm9uQ2hhbmdlKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGNvbXBhcmVGaWVsZCxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdCk7XG5cdFx0fTtcblxuXHRcdHRoaXMuYWRkSXRlbVJlc291cmNlcyhcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0dGhpcy5lbnRyeS5pZCxcblx0XHRcdCksXG5cdFx0XHR0cnVlLFxuXHRcdCk7XG5cblx0XHR0aGlzLm9uQ29uc3RydWN0KCk7XG5cdH1cblxuXHQvLyBVc2VkIGZvciByZXNvdXJjZSBjbGVhcmluZyB0ZXN0c1xuXHRwdWJsaWMgb25Db25zdHJ1Y3QgKCk6IHZvaWQge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogVXNlIHtAbGluayBDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkIENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWR9XG5cdCAqL1xuXHRwdWJsaWMgbW92ZUl0ZW1zIChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGRlc3RpbmF0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5tb3ZlSXRlbXMoXG5cdFx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRcdGRlc3RpbmF0aW9uUmVzb3VyY2UuZW50cnksXG5cdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVJdGVtcyAoXG5cdFx0aWRBcnJheTogSXRlbUlkW10sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZmFjdG9yeS5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IHJlbW92ZWRJdGVtRW50cmllczogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIHRoaXMuaXRlbXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1SZXNvdXJjZS5lbnRyeTtcblxuXHRcdFx0aWYgKGlkQXJyYXkuaW5kZXhPZihpdGVtRW50cnkuaXRlbUlkKSA9PT0gLTEpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlbW92ZWRJdGVtRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1zRGVsZXRlZChyZW1vdmVkSXRlbUVudHJpZXMpO1xuXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUl0ZW0gKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmVJdGVtcyhcblx0XHRcdFtpdGVtSWRdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkSXRlbXMgKFxuXHRcdHZhbHVlc0FycmF5OiBBcnJheTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+Pixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLnRyYW5zYWN0aW9uLmNyZWF0ZUNoYW5nZXNEZWx0YSgpO1xuXG5cdFx0aWYgKHRoaXMuZW50cnkucGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBwYXJlbnRGaWVsZHMgPSB0aGlzLmZhY3RvcnkuaXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnQoXG5cdFx0XHRcdHRoaXMuZW50cnkucGFyZW50LFxuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCB2YWx1ZXMgb2YgdmFsdWVzQXJyYXkpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0XHR2YWx1ZXNbY29sdW1uSWRdID0gcGFyZW50RmllbGRzW2NvbHVtbklkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjaGFuZ2VzRGVsdGFcblx0XHRcdC5zZXRJdGVtc0NyZWF0ZWQoXG5cdFx0XHRcdHRoaXMuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdHZhbHVlc0FycmF5LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkSXRlbSAoXG5cdFx0dmFsdWVzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD4ge1xuXHRcdHJldHVybiB0aGlzLmFkZEl0ZW1zKFxuXHRcdFx0W3ZhbHVlc10sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRJZEFycmF5ICgpOiBJdGVtSWRbXSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbXMubWFwKFxuXHRcdFx0aXRlbVJlc291cmNlID0+IGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bdHlwZV0gSXRlbXMgY2FuIGJlIHVuZGVmaW5lZCwgYnV0IHRoaXMgZ2l2ZXMgYSBsb3Qgb2YgZXJyb3JzIGZyb250ZW5kXG5cdHB1YmxpYyBnZXRJdGVtQnlJZCAoaXRlbUlkOiBudW1iZXIpOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUlkTWFwW2l0ZW1JZF07XG5cdH1cblxuXHRwdWJsaWMgYWRkSXRlbVJlc291cmNlcyAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRpc0luaXRpYWxDYWxsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7IC8vIHNob3VsZCBiZSBmYXN0XG5cdFx0aWYgKGl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvY2FsSXRlbUVudHJpZXMgPSB0aGlzLml0ZW1zLm1hcChcblx0XHRcdGl0ZW1SZXNvdXJjZSA9PiBpdGVtUmVzb3VyY2UuZW50cnksXG5cdFx0KTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIGxvb2sgaW4gaXRlbUlkTWFwID8gd2Ugb25seSB3YW50IHRvIGFkZCByZXNvdXJjZXMgaWYgdGhlcmUgaXMgbm9uZSB5ZXRcblx0XHRpdGVtRW50cmllcyA9IGl0ZW1FbnRyaWVzLmZpbHRlcihcblx0XHRcdGl0ZW1FbnRyeSA9PiBsb2NhbEl0ZW1FbnRyaWVzLmluZGV4T2YoaXRlbUVudHJ5KSA9PT0gLTEsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmNyZWF0ZUl0ZW1SZXNvdXJjZXMoXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbVJlc291cmNlLmVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0aWYgKHRoaXMuaXRlbUlkTWFwW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGEgcmVzb3VyY2Ugb2YgYW4gZW50cnkgdGhhdCB3YXMgYWxyZWFkeSBpbiB0aGUgY29sbGVjdGlvbiAhJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaXRlbXMucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0dGhpcy5pdGVtSWRNYXBbaXRlbUlkXSA9IGl0ZW1SZXNvdXJjZTtcblxuXHRcdFx0dGhpcy5maWVsZENoYW5nZURlcmVnRm5zW2l0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWRdID0gdGhpcy50cmFuc2FjdGlvbi5yZWdpc3RlckZpZWxkQ2hhbmdlQ2FsbGJhY2soXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbVJlc291cmNlLmVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0dGhpcy5vbkNoYW5nZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFpc0luaXRpYWxDYWxsIHx8IHRoaXMub3B0aW9ucy5jYWxsT25BZGRXaXRoSW5pdGlhbEl0ZW1zKSB7XG5cdFx0XHR0aGlzLmNhbGxPbkFkZChcblx0XHRcdFx0aXRlbVJlc291cmNlcyxcblx0XHRcdFx0aXNJbml0aWFsQ2FsbCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGl0ZW1SZXNvdXJjZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gdGhhdCB3aGVyZSByZW1vdmVkIGZyb20gdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgY29sbGVjdGlvbn0uXG5cdCAqIEZpbHRlcnMgb24ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9LntAbGluayBJdGVtRW50cnkgZW50cnl9ID09PSB7QGxpbmsgSXRlbUVudHJ5IGVudHJ5fVxuXHQgKi9cblx0cHVibGljIHJlbW92ZUl0ZW1SZXNvdXJjZXMgKGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRmaWx0ZXJBcnJheShcblx0XHRcdHRoaXMuaXRlbXMsXG5cdFx0XHRpdGVtUmVzb3VyY2UgPT4ge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdGlmIChpdGVtUmVzb3VyY2UuZW50cnkgPT09IGl0ZW1FbnRyeSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1JZE1hcFtpdGVtRW50cnkuaXRlbUlkXTtcblxuXHRcdFx0XHRcdFx0dGhpcy5maWVsZENoYW5nZURlcmVnRm5zW2l0ZW1FbnRyeS5pdGVtSWRdKCk7XG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5maWVsZENoYW5nZURlcmVnRm5zW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGNhbGxPbkFkZCAoXG5cdFx0aXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGlzSW5pdGlhbENhbGw6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMub3B0aW9ucy5vbkFkZChcblx0XHRcdFx0aXRlbVJlc291cmNlcyxcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0aXNJbml0aWFsQ2FsbCxcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2FsbE9uUmVtb3ZlIChpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4pOiB2b2lkIHtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5vcHRpb25zLm9uUmVtb3ZlKFxuXHRcdFx0XHRpdGVtUmVzb3VyY2VzLFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5mYWN0b3J5LmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb3JFYWNoIChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4pID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZpbHRlciAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+KSA9PiBib29sZWFuKTogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0aWYgKGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZpcnN0IChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4pID0+IGJvb2xlYW4pOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0aWYgKGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSkpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW1SZXNvdXJjZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBzb21lIChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4pID0+IGJvb2xlYW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5maXJzdChjYWxsYmFjaykgIT09IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZ3JvdXBCeSAoYXJndW1lbnQ6IHN0cmluZyB8ICgoaXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPikgPT4gc3RyaW5nIHwgbnVsbCkpOiB7W2tleTogc3RyaW5nXTogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+fSB7XG5cdFx0Y29uc3QgaXRlbXNSZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXHRcdGNvbnN0IHJlc3VsdDoge1trZXk6IHN0cmluZ106IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pn0gPSB7fTtcblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAodGhpcy5lbnRyeS5jb2x1bW5zLnJlc3BvbnNlW3RoaXMuZW50cnkuaXRlbVR5cGVdW2FyZ3VtZW50XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIGdyb3VwIG9uIGEgY29sdW1uIG5vdCByZXF1ZXN0ZWQgYnkgdGhpcyBjb2xsZWN0aW9uISAoY29sdW1uICcke2FyZ3VtZW50fScpYCk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1zUmVzb3VyY2VzKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gaXRlbVJlc291cmNlLmZpZWxkc1thcmd1bWVudF07XG5cblx0XHRcdFx0aWYgKHJlc3VsdFt2YWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFt2YWx1ZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdFt2YWx1ZV0ucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1zUmVzb3VyY2VzKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXJndW1lbnQoaXRlbVJlc291cmNlKTtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRbdmFsdWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbdmFsdWVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbdmFsdWVdLnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIG1hcDxVPiAoYXJndW1lbnQ6IHN0cmluZyB8ICgoaXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPikgPT4gVSkpOiBVW10ge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXHRcdGNvbnN0IGxlbmd0aCA9IGl0ZW1SZXNvdXJjZXMubGVuZ3RoO1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuXG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gaXRlbVJlc291cmNlc1tpXS5maWVsZHNbYXJndW1lbnRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gYXJndW1lbnQoaXRlbVJlc291cmNlc1tpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyByZWR1Y2U8VT4gKFxuXHRcdGNhbGxiYWNrOiAoXG5cdFx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0dmFsdWU6IFUsXG5cdFx0KSA9PiBVLFxuXHRcdHZhbHVlOiBVLFxuXHQpOiBVIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdHZhbHVlID0gY2FsbGJhY2soXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBuZXcgaXRlbXMgYW5kIGFkZHMgdGhlbSB0byB0aGUgY29sbGVjdGlvblxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIFVzZWQgdG8gcmV0dXJuIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30sIGJ1dCB5b3Ugc2hvdWxkIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLm9uQWRkIG9uQWRkKSBpbnN0ZWFkXG5cdCAqL1xuXHRwdWJsaWMgZXh0ZW5kIChcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXh0ZW5kQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0XHRxdWVyeUNhbGxiYWNrLFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZX0gZnJvbSB0aGUge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9XG5cdCAqXG5cdCAqIEByZW1hcmtzXG5cdCAqIC0gRG9lc24ndCByZXZlcnQgY2hhbmdlcyBvbiB0aGUgaXRlbXMgdGhlbXNlbHZlc1xuXHQgKi9cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIHRoaXMuZmllbGRDaGFuZ2VEZXJlZ0Zucykge1xuXHRcdFx0dGhpcy5maWVsZENoYW5nZURlcmVnRm5zW2l0ZW1JZF0oKTtcblx0XHRcdGRlbGV0ZSB0aGlzLmZpZWxkQ2hhbmdlRGVyZWdGbnNbaXRlbUlkXTtcblx0XHR9XG5cblx0XHR0aGlzLnRyYW5zYWN0aW9uLmNsZWFyQ29sbGVjdGlvblJlc291cmNlKHRoaXMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRlbXBsYXRlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXNwb25zZSwgRmllbGRNYXAsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwO1xuXHRjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPjsgLy8gVE9ETzogcmVuYW1lIHRvIGNvbHVtblNldFxuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBUZW1wbGF0ZUZhY3RvcnksXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cHVibGljIHJlc3BvbnNlOiBBcGlSZXNwb25zZSxcblx0XHRhZGRpdGlvbmFsUmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5NYXAsXG5cdFx0YWRkaXRpb25hbFJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KSB7XG5cdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gcmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCk7XG5cblx0XHR0aGlzLnJlc3BvbnNlQ29sdW1ucyA9IGZhY3RvcnkuY29sdW1uVXRpbC5tZXJnZVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnMsXG5cdFx0KS5tZXJnZWQ7XG5cblx0XHQvLyBXZSBoYXZlIHRvIHJlY29uc3RydWN0IHRoZSByZXF1ZXN0Q29sdW1ucyBvbmx5IGZyb20gdGhlIHRlbXBsYXRlJ3MgcmVzcG9uc2UsIHdlIG5lZWQgdG8gdHJlYXQgdGhlIGFkZGl0aW9uYWwgcmVxdWVzdCBjb2x1bW5zIGFzIGFjdHVhbCByZXF1ZXN0IGNvbHVtbnNcblx0XHR0aGlzLmNvbHVtbnMgPSBmYWN0b3J5LmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uc1xuXHRcdFx0LmV4cGFuZChcblx0XHRcdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQubWVyZ2VkO1xuXHR9XG5cblx0cHVibGljIGdldEZpZWxkcyAoKTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSB0aGlzLml0ZW1UeXBlO1xuXG5cdFx0cmV0dXJuIHRoaXMucmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHRoaXMucmVzcG9uc2UubGlua3NbaXRlbVR5cGVdWzBdLFxuXHRcdCkhO1xuXHR9XG59XG4iLCIvLyBzaG91bGQgYmUgb3JkZXJlZCBieSBkZXBlbmRlbmN5IVxuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlPcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUVudHJ5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbVJlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9UZW1wbGF0ZSc7XG4iLCJleHBvcnQgY29uc3QgQUxMX1BFUk1JU1NJT05TID0gJzcnO1xuXG5leHBvcnQgY29uc3QgQ09MVU1OX1NFUEVSQVRPUiA9ICc+JztcbmV4cG9ydCBjb25zdCBSRU5ERVJfQVNfU0VQRVJBVE9SID0gJzonO1xuXG5leHBvcnQgY29uc3QgTkVXX1BSRUZJWDogc3RyaW5nID0gJy0xJztcbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfUFJFRklYOiBzdHJpbmcgPSAnLTInO1xuXG5leHBvcnQgY29uc3QgTkVXX0tFWVdPUkQ6IHN0cmluZyA9ICduZXctJztcbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfS0VZV09SRDogc3RyaW5nID0gJ2R1cC0nO1xuIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181X187IiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuXG5leHBvcnQgY2xhc3MgQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIpIHtcblxuXHR9XG5cblx0Y29uc3RydWN0IChyZXNwb25zZTogYW55KTogQXBpUmVzcG9uc2VQcm9jZXNzb3Ige1xuXHRcdHJldHVybiBuZXcgQXBpUmVzcG9uc2VQcm9jZXNzb3IodGhpcy5hcGlGb3JtYXR0ZXIsIHJlc3BvbnNlKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ2hhbmdlc0NvbXBpbGF0aW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIENoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yICgpIHtcblx0fVxuXG5cdGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENoYW5nZXNDb21waWxhdGlvbiB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzQ29tcGlsYXRpb24oXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpOiBDb2xsZWN0aW9uQ2FjaGUge1xuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbkNhY2hlKFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXHRcbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucywgQ29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSB9IGZyb20gJy4uL21vZGVscy8nO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcy8nO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4vQ29sdW1uU2V0RmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnlGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdCkge1xuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdHRoaXMua2V5U2VydmljZSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0bmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIsIFNlcnZlckNhY2hlLCBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSB8IFNlcnZlckNhY2hlLFxuXHRcdGdldENvbGxlY3Rpb25FbnRyaWVzOiA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+KGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUpID0+IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0KTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbk1hdGNoZXIoXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGdldENvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwdWJsaWMgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0bmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtbkluZm9GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkV4cGFuc2lvbkZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3RvcnksXG5cdCkge1xuXG5cdH1cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IENvbHVtbkV4cGFuc2lvbjxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbHVtbkV4cGFuc2lvbihcblx0XHRcdHRoaXMuY29sdW1uSW5mb0ZhY3RvcnksXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbiwgUm9vdENvbHVtbk1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkluZm9GYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKCkge31cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRhcGlDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHRcdHBhcmVudDogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+IHwgbnVsbFxuXHQpOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sdW1uSW5mbyhhcGlDb2x1bW4sIHBhcmVudCk7XG5cdH1cblxuXHRjb25zdHJ1Y3RGcm9tUm9vdE1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdFx0cGFyZW50OiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4gfCBudWxsID0gbnVsbFxuXHQpIHtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcm9vdENvbHVtbk1hcCkge1xuXHRcdFx0Y29uc3QgY29sdW1uTWFwRW50cnkgPSByb290Q29sdW1uTWFwW2NvbHVtbklkXTtcblx0XHRcdGNvbnN0IGNvbHVtbkluZm8gPSB0aGlzLmNvbnN0cnVjdDxJdGVtVHlwZVR5cGU+KGNvbHVtbk1hcEVudHJ5LmFwaUNvbHVtbiwgcGFyZW50KTtcblx0XHRcdGNvbnN0IGNoaWxkQ29sdW1ucyA9IHRoaXMuY29uc3RydWN0RnJvbVJvb3RNYXA8SXRlbVR5cGVUeXBlPihjb2x1bW5NYXBFbnRyeS5jaGlsZHJlbiwgY29sdW1uSW5mbyk7XG5cblx0XHRcdGlmIChjaGlsZENvbHVtbnMubGVuZ3RoID4gMClcblx0XHRcdFx0Y29sdW1uSW5mby5zZXRDaGlsZHJlbihjb2x1bW5JbmZvLmFwaUNvbHVtbi5pdGVtVHlwZSwgY2hpbGRDb2x1bW5zKTtcblxuXHRcdFx0cmVzdWx0LnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSGFuZGxlciwgQ29sdW1uSW5mbywgQ29sdW1uU2V0LCBDb2x1bW5VdGlsLCBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0SXRlbVR5cGUsXG5cdEl0ZW1UeXBlTWFwLFxuXHRSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRSb290Q29sdW1uTWFwLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TZXRGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0Y29uc3RydWN0U3R1YjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgY29sdW1uU2V0ID0gbmV3IENvbHVtblNldChcblx0XHRcdHRoaXMuY29sdW1uVXRpbCxcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0Y29sdW1uU2V0LnJlcXVlc3QgPSByZXF1ZXN0Q29sdW1ucztcblx0XHRjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlID0gcmVxdWVzdENvbHVtbnMgPT09IHRydWU7XG5cblx0XHRyZXR1cm4gY29sdW1uU2V0O1xuXHR9XG5cblx0cHVibGljIHJlc29sdmVTdHViPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sdW1uU2V0OiBDb2x1bW5TZXQsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdGluY2x1ZGVJZENvbHVtbjogYm9vbGVhbiA9IHRydWUsXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gY29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZSA/XG5cdFx0XHR0aGlzLnByb2Nlc3NSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRcdGNvbHVtblNldCxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0KSA6XG5cdFx0XHR0aGlzLnByb2Nlc3NSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHRcdGluY2x1ZGVJZENvbHVtbixcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc/OiBib29sZWFuLFxuXHRcdGluY2x1ZGVJZENvbHVtbj86IGJvb2xlYW4sXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlU3R1Yihcblx0XHRcdHRoaXMuY29uc3RydWN0U3R1Yihcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KSxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHRpbmNsdWRlSWRDb2x1bW4sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3RGcm9tUmVzcG9uc2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4gPSB0cnVlLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgY29sdW1uU2V0ID0gbmV3IENvbHVtblNldChcblx0XHRcdHRoaXMuY29sdW1uVXRpbCxcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlQ29sdW1ucyhcblx0XHRcdGNvbHVtblNldCxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc1Jlc3BvbnNlQ29sdW1ucyAoXG5cdFx0Y29sdW1uU2V0OiBDb2x1bW5TZXQsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4sXG5cdCk6IENvbHVtblNldCB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2x1bW5TZXQuaXRlbVR5cGU7XG5cdFx0Y29uc3Qgcm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCA9IHt9O1xuXHRcdGNvbnN0IHByb2Nlc3NlZEl0ZW1UeXBlTWFwOiBJdGVtVHlwZU1hcDxib29sZWFuPiA9IHt9O1xuXG5cdFx0Y29sdW1uU2V0LnJlc3BvbnNlID0gcmVzcG9uc2VDb2x1bW5zO1xuXG5cdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwRnJvbVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0cm9vdENvbHVtbk1hcCxcblx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHRwcm9jZXNzZWRJdGVtVHlwZU1hcCxcblx0XHQpO1xuXG5cdFx0dGhpcy5wcm9jZXNzQ29sdW1uSW5mbyhcblx0XHRcdGNvbHVtblNldCxcblx0XHRcdHRoaXMuY29sdW1uSW5mb0ZhY3RvcnkuY29uc3RydWN0RnJvbVJvb3RNYXAocm9vdENvbHVtbk1hcCksXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0Y29sdW1uU2V0LnJlcXVlc3QgPSB0aGlzLmNvbnN0cnVjdFJlcXVlc3RDb2x1bW5zRnJvbVJvb3RDb2x1bW5NYXAocm9vdENvbHVtbk1hcCk7XG5cblx0XHRyZXR1cm4gY29sdW1uU2V0O1xuXHR9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RSZXF1ZXN0Q29sdW1uc0Zyb21Sb290Q29sdW1uTWFwIChcblx0XHRyb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1uW10ge1xuXHRcdGNvbnN0IHJlc3VsdDogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHJvb3RDb2x1bW5NYXApIHtcblx0XHRcdGNvbnN0IGVudHJ5ID0gcm9vdENvbHVtbk1hcFtjb2x1bW5JZF07XG5cblx0XHRcdGlmIChoYXNQcm9wZXJ0aWVzKGVudHJ5LmNoaWxkcmVuKSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdFx0W2NvbHVtbklkXTogdGhpcy5jb25zdHJ1Y3RSZXF1ZXN0Q29sdW1uc0Zyb21Sb290Q29sdW1uTWFwKGVudHJ5LmNoaWxkcmVuKSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2x1bW5JZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kUm9vdENvbHVtbk1hcEZyb21SZXNwb25zZUNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHRcdHByb2Nlc3NlZEl0ZW1UeXBlTWFwOiBJdGVtVHlwZU1hcDxib29sZWFuPixcblx0KSB7XG5cdFx0aWYgKHByb2Nlc3NlZEl0ZW1UeXBlTWFwW2l0ZW1UeXBlXSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHByb2Nlc3NlZEl0ZW1UeXBlTWFwW2l0ZW1UeXBlXSA9IHRydWU7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV0pIHtcblx0XHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1uID0gcmVzcG9uc2VDb2x1bW5zW2l0ZW1UeXBlXVtjb2x1bW5JZF07XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZW5hYmxlQ2FjaGluZykge1xuXHRcdFx0XHR0aGlzLmNvbHVtbkhhbmRsZXIuc2V0Q29sdW1uKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyb290Q29sdW1uTWFwW2NvbHVtbklkXSA9IHtcblx0XHRcdFx0XHRhcGlDb2x1bW46IHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHRcdGNoaWxkcmVuOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5jb2x1bW5VdGlsLmlzSXRlbUNvbHVtbihcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IHJlc3BvbnNlQ29sdW1uc1tyZXNwb25zZUNvbHVtbi5pdGVtVHlwZV07XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Y2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuXHRcdFx0XHR8fCAhaGFzUHJvcGVydGllcyhjaGlsZHJlbilcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwRnJvbVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0uY2hpbGRyZW4sXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHRcdHByb2Nlc3NlZEl0ZW1UeXBlTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvLyB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCByZXF1ZXN0Y29sdW1ucyBkb2VzICpub3QqIGVxdWFsICd0cnVlJywgYW5kIG1pZ2h0IGNvbnRhaW4gZGVyaXZlZCBjb2x1bW5zXG5cdHByaXZhdGUgcHJvY2Vzc1JlcXVlc3RDb2x1bW5zIChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0XHRpbmNsdWRlSWRDb2x1bW46IGJvb2xlYW4sXG5cdCk6IENvbHVtblNldCB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2x1bW5TZXQuaXRlbVR5cGU7XG5cdFx0Y29uc3Qgcm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCA9IHt9O1xuXG5cdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0Y29sdW1uU2V0LnJlcXVlc3QgYXMgQXBpUmVxdWVzdENvbHVtbltdLCAvLyB3ZSBjYW4gYXNzdW1lIHJlcXVlc3RDb2x1bW5zIGlzIGFuIGFycmF5IGhlcmVcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0cm9vdENvbHVtbk1hcCxcblx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0KTtcblxuXHRcdGlmIChpbmNsdWRlSWRDb2x1bW4pIHtcblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdFx0WydpZCddLFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb2x1bW5TZXQucmVzcG9uc2UgPSB7fTtcblxuXHRcdHRoaXMucHJvY2Vzc0NvbHVtbkluZm8oXG5cdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHR0aGlzLmNvbHVtbkluZm9GYWN0b3J5LmNvbnN0cnVjdEZyb21Sb290TWFwKHJvb3RDb2x1bW5NYXApLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdHJldHVybiBjb2x1bW5TZXQ7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NDb2x1bW5JbmZvIChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRjb2x1bW5JbmZvT2JqZWN0czogQ29sdW1uSW5mb1tdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBjb2x1bW5TZXQucmVzcG9uc2U7XG5cblx0XHRpZiAocmVzcG9uc2VbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc3BvbnNlW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uSW5mbyBvZiBjb2x1bW5JbmZvT2JqZWN0cykge1xuXHRcdFx0cmVzcG9uc2VbaXRlbVR5cGVdW2NvbHVtbkluZm8uaWRdID0gY29sdW1uSW5mby5hcGlDb2x1bW47XG5cdFx0XHRjb2x1bW5TZXQuZ3JvdXBDb2x1bW5JbmZvKGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAoIWNvbHVtbkluZm8uaXNMZWFmKSB7XG5cdFx0XHRcdHRoaXMucHJvY2Vzc0NvbHVtbkluZm8oXG5cdFx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRcdGNvbHVtbkluZm8uY2hpbGRyZW4sXG5cdFx0XHRcdFx0Y29sdW1uSW5mby5pdGVtVHlwZSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGV4cGFuZFJvb3RDb2x1bW5NYXAgKFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRyb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4sXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgcmVxdWVzdENvbHVtbiBvZiByZXF1ZXN0Q29sdW1ucykge1xuXHRcdFx0Y29uc3Qge2lkOiBjb2x1bW5JZCwgY2hpbGRyZW59ID0gdGhpcy5jb2x1bW5VdGlsLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblxuXHRcdFx0bGV0IHJlc3BvbnNlQ29sdW1uO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW5zW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uID0gcmVzcG9uc2VDb2x1bW5zW2l0ZW1UeXBlXVtjb2x1bW5JZF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHQnTm8gYXBpIGNvbHVtbiBmb3IgcmVxdWVzdCBjb2x1bW4nLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHRcdCdmb3IgaXRlbVR5cGUnLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZW5hYmxlQ2FjaGluZykge1xuXHRcdFx0XHRyZXNwb25zZUNvbHVtbiA9IHRoaXMuY29sdW1uSGFuZGxlci5zZXRDb2x1bW4oXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290Q29sdW1uTWFwW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID0ge1xuXHRcdFx0XHRcdGFwaUNvbHVtbjogcmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdFx0Y2hpbGRyZW46IHt9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdGNoaWxkcmVuLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRyb290Q29sdW1uTWFwW2NvbHVtbklkXS5jaGlsZHJlbixcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TdWJzZXRDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKCkge31cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4ocmVxdWVzdENvbHVtbnMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIENyZWF0ZUNvbXBpbGF0aW9uLCBDcmVhdGVSZXF1ZXN0LCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVxdWVzdEZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbXBpbGF0aW9uOiBDcmVhdGVDb21waWxhdGlvbixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRicmVha3VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHQpOiBDcmVhdGVSZXF1ZXN0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ3JlYXRlUmVxdWVzdChcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbXBpbGF0aW9uLFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRicmVha3VwQnlQYXJlbnQsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSXRlbUNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUNhY2hlRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSxcblx0KTogSXRlbUNhY2hlIHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1DYWNoZShcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblx0XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIENvbHVtblNldCwgSXRlbUVudHJ5U2VydmljZSwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHB1YmxpYyBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHB1YmxpYyBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHB1YmxpYyBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHB1YmxpYyBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtbkluZm86IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBJdGVtRW50cnkoXG5cdFx0XHR0aGlzLFxuXHRcdFx0Y29sdW1uSW5mby5pdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdGNvbHVtbkluZm8sXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSXRlbVJlc291cmNlRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwdWJsaWMgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRpc05ldzogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFNlcnZlckNhY2hlLCBUcmFuc2FjdGlvbkNhY2hlLCBUcmFuc2FjdGlvblZhbGlkYXRvckZhY3RvcnkgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFJtQ29yZSB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGVEZXBlbmRlbmN5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZGVwZW5kZW5jaWVzOiBTZXJ2ZXJDYWNoZURlcGVuZGVuY3lJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBjb3JlOiBSbUNvcmUsXG5cdCkge1xuXHRcdHRoaXMuc2VydmVyQ2FjaGUgPSBuZXcgU2VydmVyQ2FjaGUoXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcyxcblx0XHRcdHRoaXMuY29yZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvZG9bY2FjaGVdIFN0b3JlIGEgbWFwIG9mIGFsbCB0cmFuc2FjdGlvbnMgYnkgdHJhbnNhY3Rpb24gaWQgP1xuXHQgKi9cblx0cHVibGljIGdldEJ5SWQgKGlkOiBzdHJpbmcpOiBUcmFuc2FjdGlvbkNhY2hlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBmaW5kQ2hpbGQgPSAoY2hpbGRyZW46IFRyYW5zYWN0aW9uQ2FjaGVbXSkgPT4ge1xuXHRcdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiBjaGlsZHJlbikge1xuXHRcdFx0XHRpZiAodHJhbnNhY3Rpb24uaWQgPT09IGlkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgY2hpbGRSZXN1bHQgPSBmaW5kQ2hpbGQodHJhbnNhY3Rpb24uY2hpbGRyZW4pO1xuXG5cdFx0XHRcdGlmIChjaGlsZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNoaWxkUmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblxuXHRcdHJldHVybiBmaW5kQ2hpbGQodGhpcy5zZXJ2ZXJDYWNoZS5jaGlsZHJlbik7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHRpZD86IHN0cmluZyxcblx0XHR2YWxpZGF0b3JGYWN0b3J5PzogVHJhbnNhY3Rpb25WYWxpZGF0b3JGYWN0b3J5LFxuXHQpOiBUcmFuc2FjdGlvbkNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5jcmVhdGVDaGlsZChcblx0XHRcdGlkLFxuXHRcdFx0dmFsaWRhdG9yRmFjdG9yeSxcblx0XHQpO1xuXHR9XG5cblx0LypAaW50ZXJuYWwqL1xuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZTtcblx0fVxufVxuIiwiaW1wb3J0IHsgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbiB7XG5cdFx0cmV0dXJuIG5ldyBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24odHJhbnNhY3Rpb24pO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIFF1ZXJ5TWF0Y2hlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeU1hdGNoZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXJcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdCAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBmaWVsZHM6IEZpZWxkTWFwLCBwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCk6IFF1ZXJ5TWF0Y2hlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeU1hdGNoZXIoXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50XG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUXVlcnlQYXJzZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJzZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0Y29uc3RydWN0IChxdWVyeTogQXBpUXVlcnksIHBhcmFtZXRlcnM/OiBhbnkpOiBRdWVyeVBhcnNlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeVBhcnNlcihxdWVyeSwgcGFyYW1ldGVycyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblV0aWwsIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdCAoKTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uKFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXNwb25zZSwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgVGVtcGxhdGU8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0YWRkaXRpb25hbFJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0FwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbkZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uQ2FjaGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVudHJ5RmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uSW5mb0ZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5TZXRGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVxdWVzdEZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtQ2FjaGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUVudHJ5RmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1SZXNvdXJjZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL01vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeU1hdGNoZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vUXVlcnlQYXJzZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9UZW1wbGF0ZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnknO1xuIiwiZXhwb3J0ICogZnJvbSAnLi9JdGVtVHlwZXNDb2xsZWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvbWlzZUludGVyZmFjZSc7XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSwgVGVtcGxhdGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ29sdW1uSGFuZGxlciB9IGZyb20gJy4vQ29sdW1uSGFuZGxlcic7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVDYWNoZSB7XG5cblx0cHJpdmF0ZSBwZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXA6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFtsb2NhbEl0ZW1JZDogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj5cblx0XHR9XG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgdGVtcGxhdGVzOiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUZW1wbGF0ZTxhbnk+XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIHRlbXBsYXRlRmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB7QGxpbmsgVGVtcGxhdGUgdGVtcGxhdGV9LCB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5jcmVhdGVJdGVtcyBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmNyZWF0ZUl0ZW1zfSBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB0aGlzXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtVHlwZSBUaGUge0BsaW5rIEl0ZW1UeXBlIEl0ZW1UeXBlfSBvZiB0aGUgdGVtcGxhdGUgaXRlbVxuXHQgKiBAcGFyYW0gaXRlbUlkIFVzZWQgZm9yIGNhY2hpbmcsIG11bHRpcGxlIGNvbmN1cnJlbnQgdGVtcGxhdGUgY2FsbHMgZm9yIHRoZSBzYW1lIGl0ZW1JZCB3aWxsIHJldHVybiB0aGUgc2FtZSB0ZW1wbGF0ZVxuXHQgKiBAcGFyYW0gdGVtcGxhdGVPcHRpb25zXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUNvbHVtbnMgQWRkaXRpb25hbCBjb2x1bW5zIHRvIGJlIGZldGNoZWQsIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB0ZW1wbGF0ZSAtIHdhcm5pbmcgLSB0aGUgVGVtcGxhdGUgd29uJ3QgaGF2ZSB2YWx1ZXMgZm9yIHRob3NlIGNvbHVtbnNcblx0ICogQHBhcmFtIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSBBbiBvcHRpb25hbCB7QGxpbmsgRW50cnlQYXJlbnROdWxsIGVudHJ5IHBhcmVudH0gb3Ige0BsaW5rIEl0ZW1UeXBlIHBhcmVudCBpdGVtVHlwZX0sIGlmIHRoZSBwYXJlbnQgaXMgcGFzc2VkIHRoZSB0ZW1wbGF0ZUNvbHVtbnMgd2lsbCBiZSBleHBhbmRlZCB3aXRoIHRoZSBwcm9wZXIgbGluayBjb2x1bW5zIChUaHJvdWdoIHtAbGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGlua30pXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYFxuXHQgKiAgY29uc3QgcGFyZW50OiBFbnRyeVBhcmVudCA9IHtcblx0ICogICAgICBpdGVtVHlwZTogJ0Z1bmN0aWUnLFxuXHQgKiAgICAgIGl0ZW1JZDogMTAsXG5cdCAqICB9O1xuXHQgKlxuXHQgKiAgcmV0dXJuIGNvcmUudGVtcGxhdGVDYWNoZVxuXHQgKiAgICAgIC5mZXRjaFRlbXBsYXRlKFxuXHQgKiAgICAgICAgICAnUGxhbm5pbmdwZXJzb25lZWwnLFxuXHQgKiAgICAgICAgICB1bmRlZmluZWQsXG5cdCAqICAgICAgICAgIHt9LFxuXHQgKiAgICAgICAgICB7fSxcblx0ICogICAgICAgICAgcGFyZW50LFxuXHQgKiAgICAgIClcblx0ICogICAgICAudGhlbihcblx0ICogICAgICAgICAgKHRlbXBsYXRlOiBUZW1wbGF0ZTwnUGxhbm5pbmdwZXJzb25lZWwnPikgPT4ge1xuXHQgKiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc0RlbHRhID0gdHJhbnNhY3Rpb24uY3JlYXRlQ2hhbmdlc0RlbHRhKCk7XG5cdCAqXG5cdCAqICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBzZWxlY3RlZEl0ZW1zKSB7XG5cdCAqICAgICAgICAgICAgICAgICAgY2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjb3JlLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5maWVsZHMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmNvbHVtbnMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCxcblx0ICogICAgICAgICAgICAgICAgICApO1xuXHQgKiAgICAgICAgICAgICAgfVxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0ICogICAgICAgICAgKTtcblx0ICogIGBgYFxuXHQgKi9cblx0cHVibGljIGZldGNoVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZD86IEl0ZW1JZCxcblx0XHR0ZW1wbGF0ZU9wdGlvbnM6IGFueSA9IHt9LFxuXHRcdHRlbXBsYXRlQ29sdW1uczogYW55ID0ge30sXG5cdFx0ZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlOiBFbnRyeVBhcmVudE51bGwgfCBJdGVtVHlwZSA9IG51bGwsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8VGVtcGxhdGU8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGhhc1RlbXBsYXRlT3B0aW9ucyA9IGhhc1Byb3BlcnRpZXModGVtcGxhdGVPcHRpb25zKTtcblx0XHRjb25zdCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdGlmICh0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdFtcblx0XHRcdFx0e2NyZWF0b3I6IFsnZGlzcGxheW5hbWUnXX0sXG5cdFx0XHRcdCdjcmVhdGVkJyxcblx0XHRcdFx0J3Blcm1pc3Npb25zJyxcblx0XHRcdF0sXG5cdFx0KTtcblxuXHRcdGlmIChlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUgIT09IG51bGwpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5jb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayhcblx0XHRcdFx0XHQodHlwZW9mIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSA9PT0gJ3N0cmluZycpXG5cdFx0XHRcdFx0XHQ/IGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZVxuXHRcdFx0XHRcdFx0OiBlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUuaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0gPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblxuXHRcdGlmICghaGFzVGVtcGxhdGVPcHRpb25zKSB7XG5cdFx0XHRjb25zdCBjYWNoZWRUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjYWNoZWRUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIChcblx0XHRcdFx0XHRpdGVtVHlwZSA9PT0gbnVsbFxuXHRcdFx0XHRcdHx8IHRoaXMuY29sdW1uVXRpbC5yZXNwb25zZUNvbHVtbnNBdmFpbGFibGUoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRjYWNoZWRUZW1wbGF0ZS5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjYWNoZWRUZW1wbGF0ZSBhcyBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLmZldGNoVGVtcGxhdGVCeUlkKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsQ29sdW1uczogdGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHQ/IHt9XG5cdFx0XHRcdFx0XHQ6IHRoaXMuY29sdW1uSGFuZGxlci5mZXRjaChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc29sdmVkID0+IHtcblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZVJlc3BvbnNlID0gcmVzb2x2ZWQudGVtcGxhdGU7XG5cblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dGVtcGxhdGVSZXNwb25zZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1ucyxcblx0XHRcdFx0XHRcdHJlc29sdmVkLmFkZGl0aW9uYWxDb2x1bW5zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoIWhhc1RlbXBsYXRlT3B0aW9ucyAmJiB0ZW1wbGF0ZVJlc3BvbnNlLmNhY2hlYWJsZSkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZW1wbGF0ZXNbaXRlbVR5cGVdID0gdGVtcGxhdGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRlbXBsYXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBmZXRjaFRlbXBsYXRlQnlJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkIHwgc3RyaW5nID0gJ25vLWlkJyxcblx0XHR0ZW1wbGF0ZU9wdGlvbnM/OiBhbnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZFxuXHRcdFx0fHwgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF0gPT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0VGVtcGxhdGVCdWZmZXIoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdHRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHR9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RUZW1wbGF0ZUJ1ZmZlciAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdHRlbXBsYXRlT3B0aW9ucz86IGFueSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdGlmICh0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVPcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2U7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlLFxuXHRDb2x1bW5DYWNoZSxcblx0Q29sdW1uSGFuZGxlcixcblx0Q29sdW1uVXRpbCxcblx0Q29udmVyc2lvbk1hcFNlcnZpY2UsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdEtleVNlcnZpY2UsXG5cdExvY2tTZXJ2aWNlLFxuXHRRdWVyeVNlcnZpY2UsXG5cdFNvY2tldE1lc3NhZ2VIYW5kbGVyLFxufSBmcm9tICcuL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbUNyZWF0ZVNlcnZpY2UgfSBmcm9tICcuL2NsYXNzZXMvSXRlbUNyZWF0ZVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuL2NsYXNzZXMvUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuaW1wb3J0IHsgVGVtcGxhdGVDYWNoZSB9IGZyb20gJy4vY2xhc3Nlcy9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7XG5cdEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSxcblx0Q2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5JbmZvRmFjdG9yeSxcblx0Q29sdW1uU2V0RmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0SXRlbVJlc291cmNlRmFjdG9yeSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0UXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0UXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0VGVtcGxhdGVGYWN0b3J5LFxuXHRUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSxcbn0gZnJvbSAnLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkgfSBmcm9tICcuL2ZhY3Rvcmllcy9DaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSxcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgUm1Db3JlIHtcblx0dmVyc2lvbjogc3RyaW5nID0gJzQuMC4wJztcblx0bm9vcCA9IG5vb3A7XG5cblx0YXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXI7XG5cdGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZTtcblx0YXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5OiBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk7XG5cdGNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IENoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk7XG5cdGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3Rvcnk7XG5cdGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5OiBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeTtcblx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeTtcblx0Y29sbGVjdGlvbkVudHJ5RmFjdG9yeTogQ29sbGVjdGlvbkVudHJ5RmFjdG9yeTtcblx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZTtcblx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5OiBDb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2U6IENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2U7XG5cdGNvbHVtbkNhY2hlOiBDb2x1bW5DYWNoZTtcblx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0Y29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcjtcblx0Y29sdW1uSW5mb0ZhY3Rvcnk6IENvbHVtbkluZm9GYWN0b3J5O1xuXHRjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5O1xuXHRjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeTtcblx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbDtcblx0Y29udmVyc2lvbk1hcFNlcnZpY2U6IENvbnZlcnNpb25NYXBTZXJ2aWNlO1xuXHRjcmVhdGVSZXF1ZXN0RmFjdG9yeTogQ3JlYXRlUmVxdWVzdEZhY3Rvcnk7XG5cdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3Rvcnk7XG5cdGl0ZW1DcmVhdGVTZXJ2aWNlOiBJdGVtQ3JlYXRlU2VydmljZTtcblx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeTtcblx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZTtcblx0aXRlbVJlc291cmNlRmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeTtcblx0a2V5U2VydmljZTogS2V5U2VydmljZTtcblx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlO1xuXHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5O1xuXHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeTtcblx0cXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2U7XG5cdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0c29ja2V0TWVzc2FnZUhhbmRsZXI6IFNvY2tldE1lc3NhZ2VIYW5kbGVyO1xuXHR0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlO1xuXHR0ZW1wbGF0ZUZhY3Rvcnk6IFRlbXBsYXRlRmFjdG9yeTtcblx0dHJhbnNhY3Rpb25DYWNoZUZhY3Rvcnk6IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRfYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlLFxuXHRcdGF1dGhJbnRlcmZhY2U6IEF1dGhJbnRlcmZhY2UsXG5cdFx0ZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0ZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwcm9taXNlTGlicmFyeTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0bGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHRcdC8vIENyZWF0ZSB2YXJpYWJsZXMgZm9yIGVhY2ggc2VydmljZSBpbiBvcmRlciB0byBnZXQgYSBUeXBlU2NyaXB0IGVycm9yIHdoZW4gYSBkZXBlbmRlbmN5IGhhc24ndCBiZWVuXG5cdFx0Ly8gaW5pdGlhbGl6ZWQgeWV0LlxuXHRcdGNvbnN0IGtleVNlcnZpY2UgPSBuZXcgS2V5U2VydmljZSgpO1xuXHRcdGNvbnN0IGFwaUZvcm1hdHRlciA9IG5ldyBBcGlGb3JtYXR0ZXIoKTtcblx0XHRjb25zdCBxdWVyeU1hdGNoZXJGYWN0b3J5ID0gbmV3IFF1ZXJ5TWF0Y2hlckZhY3RvcnkoYXBpRm9ybWF0dGVyKTtcblx0XHRjb25zdCBxdWVyeVBhcnNlckZhY3RvcnkgPSBuZXcgUXVlcnlQYXJzZXJGYWN0b3J5KCk7XG5cdFx0Y29uc3QgcXVlcnlTZXJ2aWNlID0gbmV3IFF1ZXJ5U2VydmljZSgpO1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UgPSBuZXcgQ29sbGVjdGlvblJlc291cmNlU2VydmljZSgpO1xuXG5cdFx0Y29uc3QgY29sdW1uVXRpbCA9IG5ldyBDb2x1bW5VdGlsKFxuXHRcdFx0bGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5KHF1ZXJ5TWF0Y2hlckZhY3RvcnkpO1xuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gbmV3IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5KGNvbHVtblV0aWwpO1xuXG5cdFx0Y29uc3QgaXRlbUVudHJ5U2VydmljZSA9IG5ldyBJdGVtRW50cnlTZXJ2aWNlKFxuXHRcdFx0YXV0aEludGVyZmFjZSxcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5ID0gbmV3IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeShhcGlGb3JtYXR0ZXIpO1xuXHRcdGNvbnN0IGFwaVJlcXVlc3RTZXJ2aWNlID0gbmV3IEFwaVJlcXVlc3RTZXJ2aWNlKFxuXHRcdFx0X2FwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0YXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2x1bW5DYWNoZSA9IG5ldyBDb2x1bW5DYWNoZShjb2x1bW5VdGlsKTtcblx0XHRjb25zdCBjb2x1bW5IYW5kbGVyID0gbmV3IENvbHVtbkhhbmRsZXIoXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdCk7XG5cdFx0Y29uc3QgY29sdW1uSW5mb0ZhY3RvcnkgPSBuZXcgQ29sdW1uSW5mb0ZhY3RvcnkoKTtcblx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gbmV3IENvbHVtbkV4cGFuc2lvbkZhY3RvcnkoY29sdW1uSW5mb0ZhY3RvcnkpO1xuXG5cdFx0Y29uc3QgY29sdW1uU2V0RmFjdG9yeSA9IG5ldyBDb2x1bW5TZXRGYWN0b3J5KFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRjb2x1bW5JbmZvRmFjdG9yeSxcblx0XHQpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSA9IG5ldyBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkoKTtcblxuXHRcdGNvbnN0IGxvY2tTZXJ2aWNlID0gbmV3IExvY2tTZXJ2aWNlKFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0KTtcblx0XHRjb25zdCB0ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0KTtcblx0XHRjb25zdCBpdGVtQ2FjaGVGYWN0b3J5ID0gbmV3IEl0ZW1DYWNoZUZhY3RvcnkocXVlcnlNYXRjaGVyRmFjdG9yeSk7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlRmFjdG9yeSA9IG5ldyBJdGVtUmVzb3VyY2VGYWN0b3J5KFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdGVtcGxhdGVDYWNoZSA9IG5ldyBUZW1wbGF0ZUNhY2hlKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdHRlbXBsYXRlRmFjdG9yeSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbnZlcnNpb25NYXBTZXJ2aWNlID0gbmV3IENvbnZlcnNpb25NYXBTZXJ2aWNlKFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgaXRlbUNyZWF0ZVNlcnZpY2UgPSBuZXcgSXRlbUNyZWF0ZVNlcnZpY2UoXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0Y29udmVyc2lvbk1hcFNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGFGYWN0b3J5ID0gbmV3IENoYW5nZXNEZWx0YUZhY3RvcnkoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0aXRlbUNyZWF0ZVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHJlcXVlc3RCdWZmZXJNYW5hZ2VyID0gbmV3IFJlcXVlc3RCdWZmZXJNYW5hZ2VyKFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeShcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgaXRlbUVudHJ5RmFjdG9yeSA9IG5ldyBJdGVtRW50cnlGYWN0b3J5KFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlID0gbmV3IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UoXG5cdFx0XHRxdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0XHRxdWVyeVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvbkVudHJ5RmFjdG9yeShcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkNhY2hlRmFjdG9yeSA9IG5ldyBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY3JlYXRlUmVxdWVzdEZhY3RvcnkgPSBuZXcgQ3JlYXRlUmVxdWVzdEZhY3RvcnkoXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgPSBuZXcgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkgPSBuZXcgQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkoXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbmV3IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkoKTtcblxuXHRcdGNvbnN0IHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0e1xuXHRcdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0XHRjaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSxcblx0XHRcdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0XHRjb2x1bW5DYWNoZSxcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwU2VydmljZSxcblx0XHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0XHRpdGVtQ3JlYXRlU2VydmljZSxcblx0XHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdFx0a2V5U2VydmljZSxcblx0XHRcdFx0bGlua1RyZWVTZXJ2aWNlLFxuXHRcdFx0XHRsb2NrU2VydmljZSxcblx0XHRcdFx0bW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdFx0cHJvbWlzZVNlcnZpY2U6IHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRxdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0fSxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLnNldFNlcnZlckNhY2hlKFxuXHRcdFx0dHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKSxcblx0XHQpO1xuXG5cdFx0Y29uc3Qgc29ja2V0TWVzc2FnZUhhbmRsZXIgPSBuZXcgU29ja2V0TWVzc2FnZUhhbmRsZXIoXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5hcGlGb3JtYXR0ZXIgPSBhcGlGb3JtYXR0ZXI7XG5cdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSA9IGFwaVJlcXVlc3RTZXJ2aWNlO1xuXHRcdHRoaXMuYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5ID0gYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5O1xuXHRcdHRoaXMuY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSA9IGNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5ID0gY2hhbmdlc0RlbHRhRmFjdG9yeTtcblx0XHR0aGlzLmNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5ID0gY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uQ2FjaGVGYWN0b3J5ID0gY29sbGVjdGlvbkNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBjb2xsZWN0aW9uRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkgPSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gY29sbGVjdGlvblJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UgPSBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlO1xuXHRcdHRoaXMuY29sdW1uQ2FjaGUgPSBjb2x1bW5DYWNoZTtcblx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uSGFuZGxlciA9IGNvbHVtbkhhbmRsZXI7XG5cdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeSA9IGNvbHVtbkluZm9GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSA9IGNvbHVtblNldEZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkgPSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5VdGlsID0gY29sdW1uVXRpbDtcblx0XHR0aGlzLmNvbnZlcnNpb25NYXBTZXJ2aWNlID0gY29udmVyc2lvbk1hcFNlcnZpY2U7XG5cdFx0dGhpcy5jcmVhdGVSZXF1ZXN0RmFjdG9yeSA9IGNyZWF0ZVJlcXVlc3RGYWN0b3J5O1xuXHRcdHRoaXMuaXRlbUNhY2hlRmFjdG9yeSA9IGl0ZW1DYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5pdGVtQ3JlYXRlU2VydmljZSA9IGl0ZW1DcmVhdGVTZXJ2aWNlO1xuXHRcdHRoaXMuaXRlbUVudHJ5RmFjdG9yeSA9IGl0ZW1FbnRyeUZhY3Rvcnk7XG5cdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlID0gaXRlbUVudHJ5U2VydmljZTtcblx0XHR0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnkgPSBpdGVtUmVzb3VyY2VGYWN0b3J5O1xuXHRcdHRoaXMua2V5U2VydmljZSA9IGtleVNlcnZpY2U7XG5cdFx0dGhpcy5sb2NrU2VydmljZSA9IGxvY2tTZXJ2aWNlO1xuXHRcdHRoaXMubW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSA9IG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk7XG5cdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5ID0gcXVlcnlNYXRjaGVyRmFjdG9yeTtcblx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeSA9IHF1ZXJ5UGFyc2VyRmFjdG9yeTtcblx0XHR0aGlzLnF1ZXJ5U2VydmljZSA9IHF1ZXJ5U2VydmljZTtcblx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk7XG5cdFx0dGhpcy5zb2NrZXRNZXNzYWdlSGFuZGxlciA9IHNvY2tldE1lc3NhZ2VIYW5kbGVyO1xuXHRcdHRoaXMudGVtcGxhdGVDYWNoZSA9IHRlbXBsYXRlQ2FjaGU7XG5cdFx0dGhpcy50ZW1wbGF0ZUZhY3RvcnkgPSB0ZW1wbGF0ZUZhY3Rvcnk7XG5cdFx0dGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeSA9IHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5O1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub29wICgpIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5ICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWU7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vY2xhc3Nlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhY3Rvcmllcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2x1bW5FeHBhbnNpb25SZXN1bHQsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFSZXN1bHQgPSB7XG5cdHJvbGxiYWNrOiAoKSA9PiB2b2lkLFxuXHRjcmVhdGVkOiBJdGVtRW50cnlbXVxuXHQvLyB0b2RvW2NhY2hlXSBvdGhlciBzdGF0dXNlc1xufTtcblxuLyoqXG4gKiBAcmVtYXJrXG4gKiBXZSBleHBsaWNpdGx5IGtlZXAgdHJhY2sgb2YgdGhlIG5ldyBwYXJlbnQsIHNvIHdlIGNhbiBzZXQgYW4gaXRlbSB0byBtb3ZlZCBpZiBpdCBpc24ndCBudWxsIChOZWVkZWQgZm9yIGxpbmtUbyByZXF1ZXN0KVxuICovXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IHtcblx0XHRleHBhbmRlZENvbHVtbnM6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHwgbnVsbCxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIENoYW5nZXNEZWx0YUl0ZW1EZWxldGVEZWx0YSA9IEl0ZW1FbnRyeVtdO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlc0RlbHRhQmFzZSB7XG5cblx0cHVibGljIHVwZGF0ZWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHVibGljIGRlbGV0ZWQ6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IENoYW5nZXNEZWx0YUl0ZW1EZWxldGVEZWx0YVxuXHR9ID0ge307XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgX3F1ZXJ5UmVzdWx0czoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0W3F1ZXJ5U3RyaW5nOiBzdHJpbmddOiBJdGVtSWRbXVxuXHRcdH1cblx0fSA9IHt9O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFkZHMgYSBoaW50IGZvciB0aGUge0BsaW5rIENvbGxlY3Rpb25NYXRjaGVyQmFzZSBDb2xsZWN0aW9uTWF0Y2hlckJhc2VdIHRvIHRoZSBDaGFuZ2VzRGVsdGEsIHdoZW4gdGhlIENvbGxlY3Rpb25NYXRjaGVyIGVuY291bnRlcnMgYSBjb2xsZWN0aW9uXG5cdCAqIHdpdGggdGhlIGV4YWN0IHF1ZXJ5LCBpdCB3aWxsIHVzZSB0aGUgaGludCBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlIG1hdGNoZXJcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBfc2V0UXVlcnlSZXN1bHQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fcXVlcnlSZXN1bHRzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLl9xdWVyeVJlc3VsdHNbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0dGhpcy5fcXVlcnlSZXN1bHRzW2l0ZW1UeXBlXVtxdWVyeVN0cmluZ10gPSBpdGVtSWRzO1xuXHR9XG5cblx0cHVibGljIHNldEl0ZW1VcGRhdGVkPEl0ZW1FbnRyeVR5cGUgZXh0ZW5kcyBJdGVtRW50cnk+IChcblx0XHRlbnRyeTogSXRlbUVudHJ5VHlwZSxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdDogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHwgbnVsbCA9IG51bGwsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy51cGRhdGVkW2VudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZWRbZW50cnkuaWRdID0ge1xuXHRcdFx0XHRlbnRyeTogZW50cnksXG5cdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRmaWVsZHM6IHt9LFxuXHRcdFx0XHRcdGV4cGFuZGVkQ29sdW1uczogbnVsbCxcblx0XHRcdFx0XHRwYXJlbnQ6IHBhcmVudCxcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0VudHJ5ID0gdGhpcy51cGRhdGVkW2VudHJ5LmlkXTtcblxuXHRcdGlmIChwYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IHBhcmVudEZpZWxkcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnQoXG5cdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0ZW50cnkuaXRlbVR5cGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHBhcmVudEZpZWxkcykge1xuXHRcdFx0XHRmaWVsZHNbY29sdW1uSWRdID0gcGFyZW50RmllbGRzW2NvbHVtbklkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGZpZWxkIGluIGZpZWxkcykge1xuXHRcdFx0Y29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG5cdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0ZmllbGQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZGVzYyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdFx0ZGVzYyxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNoYW5nZXNFbnRyeS5jaGFuZ2VzLmZpZWxkc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5FeHBhbnNpb25SZXN1bHQgIT09IG51bGwpIHtcblx0XHRcdGNoYW5nZXNFbnRyeS5jaGFuZ2VzLmV4cGFuZGVkQ29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbURlbGV0ZWQgKFxuXHRcdGRlbGV0ZWQ6IEl0ZW1FbnRyeSxcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5zZXRJdGVtc0RlbGV0ZWQoXG5cdFx0XHRbZGVsZXRlZF0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtc0RlbGV0ZWQgKFxuXHRcdGRlbGV0ZWQ6IEl0ZW1FbnRyeVtdLFxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBkZWxldGVkKSB7XG5cdFx0XHRpZiAodGhpcy5kZWxldGVkW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLmRlbGV0ZWRbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXTogZG8gd2UgcmVhbGx5IGhhdmUgdG8gY2hlY2sgdGhpcyA/IGRlbGV0aW5nIG11bHRpcGxlIHRpbWVzIGRvZXNuJ3QgbWF0dGVyXG5cdFx0XHQvLyB0b2RvW2NhY2hlXTogdGhpcyBjb3VsZCBhbHNvIGJlIGEgbWFwIG9mIGVudHJ5SWQgLT4gaXRlbUVudHJ5XG5cdFx0XHRpZiAodGhpcy5kZWxldGVkW2l0ZW1FbnRyeS5pdGVtVHlwZV0uaW5kZXhPZihpdGVtRW50cnkpID4gLTEpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgaXNFbXB0eSAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICFoYXNQcm9wZXJ0aWVzKHRoaXMudXBkYXRlZClcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKHRoaXMuZGVsZXRlZCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudCwgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgQ29sdW1uU2V0IH0gZnJvbSAnLi9Db2x1bW5TZXQnO1xuaW1wb3J0IHsgQ3JlYXRlZENoYW5nZXNEZWx0YSB9IGZyb20gJy4vQ3JlYXRlZENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJdGVtQ3JlYXRlU2VydmljZSB9IGZyb20gJy4vSXRlbUNyZWF0ZVNlcnZpY2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCB0byBhcHBseSBjaGFuZ2VzIGZyb20gb3V0c2lkZSBvZiB0aGUgY29yZSB0byBhIHRyYW5zYWN0aW9uXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIENoYW5nZXNEZWx0YVxuICogYXNzdW1lcyAnY3JlYXRlZCcgdmFsdWVzIGhhdmUgbm8gaXRlbUVudHJpZXMgeWV0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX1cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZXNEZWx0YVxuXHRleHRlbmRzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyBjcmVhdGVkOiBDcmVhdGVkQ2hhbmdlc0RlbHRhID0gbmV3IENyZWF0ZWRDaGFuZ2VzRGVsdGEoKTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBpdGVtQ3JlYXRlU2VydmljZTogSXRlbUNyZWF0ZVNlcnZpY2UsXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB0ZW1wbGF0ZSBmb3IgdGhlIHBhc3NlZCBpdGVtVHlwZSBhbmQgcHJvY2Vzc2VzIHRoZSBwYXNzZWQgdmFsdWVzIGFuZCBzZXRzIHRoZSBpdGVtIHRvIGJlIGNyZWF0ZWQgd2hlbiB0aGUgZGVsdGEgaXMgYXBwbGllZFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIC0gSWYgdGhlIHZhbHVlcyBkb24ndCBjb250YWluIGFuIGBpZGAgYSBuZXcgb25lIHdpbGwgYmUgZ2VuZXJhdGVkXG5cdCAqIC0gSWYgeW91IHdhbnQgdG8gc2V0IGEgcGFyZW50IHNldCB0aGUgcHJvcGVyIGZpZWxkLCB5b3UgY2FuJ3QgcGFzcyBpdCBhcyBhIHNlcGFyYXRlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1DcmVhdGVkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHR2YWx1ZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLml0ZW1DcmVhdGVTZXJ2aWNlLmNyZWF0ZUl0ZW1zRnJvbVZhbHVlcyhcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdFtcblx0XHRcdFx0dmFsdWVzLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgdGVtcGxhdGUgZm9yIHRoZSBwYXNzZWQgaXRlbVR5cGUgYW5kIHByb2Nlc3NlcyB0aGUgcGFzc2VkIHZhbHVlcyBhbmQgc2V0cyB0aGUgaXRlbXMgdG8gYmUgY3JlYXRlZCB3aGVuIHRoZSBkZWx0YSBpcyBhcHBsaWVkXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogLSBJZiB0aGUgdmFsdWVzIGRvbid0IGNvbnRhaW4gYW4gYGlkYCBhIG5ldyBvbmUgd2lsbCBiZSBnZW5lcmF0ZWRcblx0ICogLSBJZiB5b3Ugd2FudCB0byBzZXQgYSBwYXJlbnQgc2V0IHRoZSBwcm9wZXIgZmllbGQsIHlvdSBjYW4ndCBwYXNzIGl0IGFzIGEgc2VwYXJhdGUgb2JqZWN0XG5cdCAqL1xuXHRwdWJsaWMgc2V0SXRlbXNDcmVhdGVkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLml0ZW1DcmVhdGVTZXJ2aWNlLmNyZWF0ZUl0ZW1zRnJvbVZhbHVlcyhcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHZhbHVlc0FycmF5LFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFdpbGwgY3JlYXRlIGFuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSB3aGVuIHRoZSBkZWx0YSBpcyBhcHBsaWVkXG5cdCAqIERvZXMgbm90IGFsd2F5cyBtZWFuIHRoZSBpdGVtIGlzIGxvY2FsLCBqdXN0IHRoYXQgaXQgaXNuJ3QgY2FjaGVkIHlldFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIElmIHlvdSdyZSBjYWxsaW5nIHRoaXMgZnJvbSB0aGUgZnJvbnRlbmQgeW91IHByb2JhYmx5IHdhbnQgdG8gY2FsbCBgc2V0SXRlbUNyZWF0ZWRgLCB3aGljaCB3aWxsIGZldGNoIGEgdGVtcGxhdGUgYW5kIHByb2Nlc3MgdGhlIHZhbHVlcyBmb3IgeW91XG5cdCAqIElmIHlvdSBkb24ndCwgeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZXMgYXJlIGFsbCBjb3JyZWN0IGFuZCBhbGwgdGVtcGxhdGUgaXRlbXMgYXJlIHByb2Nlc3NlZFxuXHQgKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBfc2V0SXRlbUNyZWF0ZWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpOiB2b2lkIHtcblx0XHRsZXQgcGFyZW50RmllbGRzOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRwYXJlbnRGaWVsZHMgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGNvbHVtbnMuaXRlbVR5cGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHBhcmVudEZpZWxkcykge1xuXHRcdFx0XHRmaWVsZHNbY29sdW1uSWRdID0gcGFyZW50RmllbGRzW2NvbHVtbklkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0b2RvOiB0aGVzZSBzaG91bGQgYmUgc2V0IHdoZW4gZXhwYW5kaW5nIGxvY2FsbHlcblx0XHRjb25zdCBkZWZhdWx0VmFsdWVzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExvY2FsRGVmYXVsdFZhbHVlcygpO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBkZWZhdWx0VmFsdWVzKSB7XG5cdFx0XHRmaWVsZHNbY29sdW1uSWRdID0gZGVmYXVsdFZhbHVlc1tjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0dGhpcy5jcmVhdGVkLmFkZChcblx0XHRcdGl0ZW1JZCxcblx0XHRcdGZpZWxkcyxcblx0XHRcdGNvbHVtbnMsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gYXNzaWduIHRoZSBwcm9wZXIgcGFyZW50IGZpZWxkcywgd2lsbCBjYWxsIHtAbGluayBDaGFuZ2VzRGVsdGFCYXNlLnNldEl0ZW1VcGRhdGVkIHNldEl0ZW1VcGRhdGVkfSBpbnRlcm5hbGx5XG5cdCAqL1xuXHRwdWJsaWMgc2V0SXRlbU1vdmVkIChcblx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdHRvOiBFbnRyeVBhcmVudCxcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5zZXRJdGVtVXBkYXRlZChcblx0XHRcdGVudHJ5LFxuXHRcdFx0e30sXG5cdFx0XHRudWxsLFxuXHRcdFx0dG8sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBpc0VtcHR5ICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc3VwZXIuaXNFbXB0eSgpXG5cdFx0XHQmJiB0aGlzLmNyZWF0ZWQuaXNFbXB0eSgpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4vQ29sdW1uU2V0JztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcbn07XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVkQ2hhbmdlc0RlbHRhIHtcblxuXHRwcml2YXRlIHR1cGxlczoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhW107XG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0cHVibGljIGFkZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2x1bW5zLml0ZW1UeXBlO1xuXG5cdFx0aWYgKHRoaXMudHVwbGVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnR1cGxlc1tpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHR0aGlzLnR1cGxlc1tpdGVtVHlwZV0ucHVzaChcblx0XHRcdHtcblx0XHRcdFx0aXRlbUlkOiBpdGVtSWQsXG5cdFx0XHRcdGZpZWxkczogZmllbGRzLFxuXHRcdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0fSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGlzRW1wdHkgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhaGFzUHJvcGVydGllcyh0aGlzLnR1cGxlcyk7XG5cdH1cblxuXHRwdWJsaWMgZm9yRWFjaCAoXG5cdFx0Y2FsbGJhY2s6IChcblx0XHRcdHR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdFx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0XHRpbmRleDogbnVtYmVyLFxuXHRcdCkgPT4gdm9pZCxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiB0aGlzLnR1cGxlcykge1xuXHRcdFx0Y29uc3QgdHVwbGVzRW50cnkgPSB0aGlzLnR1cGxlc1tpdGVtVHlwZV07XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHVwbGVzRW50cnkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y2FsbGJhY2soXG5cdFx0XHRcdFx0dHVwbGVzRW50cnlbaV0sXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudHVwbGVzW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEZpZWxkTWFwLCBJdGVtSWRDb252ZXJzaW9uTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxDcmVhdGVEZWx0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENoYW5nZXNEZWx0YSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvcmVcbiAqXG4gKiAtLS0tLS0tLS0tXG4gKlxuICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IGFuZCB7QGxpbmsgQ2hhbmdlc0RlbHRhIENoYW5nZXNEZWx0YX0gaXMgdGhhdCB0aGUgSW50ZXJuYWxDaGFuZ2VzRGVsdGFcbiAqIGFzc3VtZXMgJ2NyZWF0ZWQnIGVudHJpZXMgYXJlIGFscmVhZHkgZXhpc3RpbmcsIHNvIGl0IGhhcyBhIGRpZmZlcmVudCBmb3JtYXQuXG4gKlxuICogVXNlIHRoaXMgd2hlbiBjYWxsaW5nIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudH0gYW5kIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21DaGlsZCBhcHBseUNoYW5nZXNGcm9tQ2hpbGR9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbENoYW5nZXNEZWx0YVxuXHRleHRlbmRzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyBjcmVhdGVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBzdHJpbmddOiBJbnRlcm5hbENyZWF0ZURlbHRhXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgbW92ZWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IHtcblx0XHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0XHR0bzogRW50cnlQYXJlbnRcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtQ3JlYXRlZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmNyZWF0ZWRbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdGVudHJ5OiBpdGVtRW50cnksXG5cdFx0XHRmaWVsZHM6IGZpZWxkcyxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZW1hcmtcblx0ICogUGFyZW50IGZpZWxkcyBhcmUgbm9uLXdyaXRhYmxlIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBtb3ZlZCBlbnRyaWVzIGFub3RoZXIgd2F5ICh0byBkbyBhIGxpbmtUbyByZXF1ZXN0KVxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1Nb3ZlZCAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0XHR0bzogRW50cnlQYXJlbnQsXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMubW92ZWRbZW50cnkuaWRdID0ge1xuXHRcdFx0ZW50cnk6IGVudHJ5LFxuXHRcdFx0dG86IHRvLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgaXNFbXB0eSAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHN1cGVyLmlzRW1wdHkoKVxuXHRcdFx0JiYgIWhhc1Byb3BlcnRpZXModGhpcy5jcmVhdGVkKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4vS2V5U2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyLCBSZXF1ZXN0QnVmZmVyUmVzcG9uc2UgfSBmcm9tICcuL1JlcXVlc3RCdWZmZXInO1xuXG5jb25zdCBCVUZGRVJfRkxVU0hfVElNRU9VVF9NUzogbnVtYmVyID0gMTUwO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdEJ1ZmZlck1hbmFnZXIge1xuXG5cdHByaXZhdGUgcGVuZGluZ0J1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblx0cHJpdmF0ZSBwZW5kaW5nVHJ1ZUJ1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblxuXHRwcml2YXRlIHNlcnZlckNhY2hlOiBTZXJ2ZXJDYWNoZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBwcm9taXNlTGlicmFyeTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBzZXRTZXJ2ZXJDYWNoZSAoc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlKTogdm9pZCB7XG5cdFx0dGhpcy5zZXJ2ZXJDYWNoZSA9IHNlcnZlckNhY2hlO1xuXHR9XG5cblx0cHVibGljIGZldGNoQnlJZHMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0dGhpcy5mZXRjaEJ5SWQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXS5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBsb2NhbCBJdGVtSWQgaW4gUmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeUlkLCBmb3IgbG9jYWwgSXRlbUlkcyB5b3Ugc2hvdWxkIHVzZSBSZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5TG9jYWxJZCcpO1xuXHRcdH1cblxuXHRcdGxldCBidWZmZXI7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdGJ1ZmZlciA9IHRoaXMucGVuZGluZ1RydWVCdWZmZXJNYXBbaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0dGhpcy5wZW5kaW5nVHJ1ZUJ1ZmZlck1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyAnY29sdW1uczogdHJ1ZScgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfSBieSBpZGApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLnBlbmRpbmdCdWZmZXJNYXBbaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoaXRlbVR5cGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc29sZS5sb2coYEV4aXN0aW5nIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX0gYnkgaWRgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRidWZmZXIuYWRkU2luZ2xlSXRlbShcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gYnVmZmVyLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEJ5UXVlcnkgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeTogW29iamVjdCwgc3RyaW5nXSwgLy8gcXVlcnlQYXJzZXIgcmVzdWx0XG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGxldCBidWZmZXIgPSB0aGlzLnBlbmRpbmdCdWZmZXJNYXBbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLmNvbnN0cnVjdEJ1ZmZlcihpdGVtVHlwZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyBSZXF1ZXN0QnVmZmVyICR7aXRlbVR5cGV9IGF0ICR7cGVyZm9ybWFuY2Uubm93KCl9IHdpdGggcXVlcnlgKTtcblx0XHR9XG5cblx0XHRidWZmZXIuYWRkUXVlcnkoXG5cdFx0XHRxdWVyeSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gYnVmZmVyLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uc3RydWN0QnVmZmVyIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0bWFwID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwLFxuXHQpOiBSZXF1ZXN0QnVmZmVyIHtcblx0XHRjb25zdCBidWZmZXIgPSBtYXBbaXRlbVR5cGVdID0gbmV3IFJlcXVlc3RCdWZmZXIoXG5cdFx0XHR0aGlzLnByb21pc2VMaWJyYXJ5LFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHR0aGlzLnNlcnZlckNhY2hlLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdHdpbmRvdy5zZXRUaW1lb3V0KFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRidWZmZXIuZmx1c2goKTtcblxuXHRcdFx0XHRkZWxldGUgbWFwW2l0ZW1UeXBlXTtcblx0XHRcdH0sXG5cdFx0XHRCVUZGRVJfRkxVU0hfVElNRU9VVF9NUyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcjtcblx0fVxuXG59XG4iLCJpbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5LCBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlID0gQXBpUmVzcG9uc2VQcm9jZXNzb3I7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0QnVmZmVyIHtcblxuXHRwcml2YXRlIGRlZmVycmVkOiBEZWZlcnJlZDxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+ID0gdGhpcy5wcm9taXNlTGlicmFyeS5kZWZlcigpO1xuXHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb246IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRwcml2YXRlIHNpbmdsZUl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cdHByaXZhdGUgcXVlcmllczoge1txdWVyeVN0cmluZzogc3RyaW5nXTogQXBpUXVlcnl9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIHNlcnZlckNhY2hlOiBTZXJ2ZXJDYWNoZSxcblx0XHRwcml2YXRlIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjb250YWluc0lkIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuc2luZ2xlSXRlbUlkcy5pbmRleE9mKGl0ZW1JZCkgIT09IC0xO1xuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zUXVlcnkgKFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnF1ZXJpZXNbcXVlcnlTdHJpbmddICE9PSB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgYWRkU2luZ2xlSXRlbSAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmICh0aGlzLnNpbmdsZUl0ZW1JZHMuaW5kZXhPZihpdGVtSWQpID09PSAtMSkge1xuXHRcdFx0dGhpcy5zaW5nbGVJdGVtSWRzLnB1c2goaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkUXVlcnkgKFxuXHRcdHF1ZXJ5OiBbb2JqZWN0LCBzdHJpbmddLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRpZiAodGhpcy5xdWVyaWVzW3F1ZXJ5WzFdXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnF1ZXJpZXNbcXVlcnlbMV1dID0gcXVlcnlbMF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGZsdXNoICgpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGNvbnN0IGNvbmRpdGlvbnM6IGFueVtdID0gW107XG5cblx0XHRpZiAodGhpcy5zaW5nbGVJdGVtSWRzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbmRpdGlvbnMucHVzaChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogJ2lkJyxcblx0XHRcdFx0XHRjb21wYXJhdG9yOiAnSU4nLFxuXHRcdFx0XHRcdHZhbHVlOiB0aGlzLnNpbmdsZUl0ZW1JZHMsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcXVlcnlTdHJpbmcgaW4gdGhpcy5xdWVyaWVzKSB7XG5cdFx0XHRjb25kaXRpb25zLnB1c2godGhpcy5xdWVyaWVzW3F1ZXJ5U3RyaW5nXSk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGZsdXNoIGEgUmVxdWVzdEJ1ZmZlciB3aXRob3V0IHNpbmdsZUl0ZW1zIG9yIHF1ZXJpZXMnKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKTtcblxuXHRcdGxldCByZXNwb25zZTogQXBpUmVzcG9uc2VQcm9jZXNzb3I7XG5cblx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQucXVlcnkoXG5cdFx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25kaXRpb25zOiBjb25kaXRpb25zLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiAnT1InLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfcmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHJlc3BvbnNlID0gX3Jlc3BvbnNlO1xuXG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0dGhpcy5zaW5nbGVJdGVtSWRzLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdFx0JiYgIXRoaXMuaGFzTXVsdGlwbGVRdWVyaWVzKClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHF1ZXJ5U3RyaW5nID0gdGhpcy5nZXRGaXJzdFF1ZXJ5U3RyaW5nKCk7XG5cblx0XHRcdFx0XHRcdGlmIChxdWVyeVN0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5fc2V0UXVlcnlSZXN1bHQoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRxdWVyeVN0cmluZyxcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZS5saW5rc1t0aGlzLml0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvciA9PiB0aGlzLmRlZmVycmVkLnJlamVjdChlcnJvciksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKSxcblx0XHRcdFx0ZXJyb3IgPT4gdGhpcy5kZWZlcnJlZC5yZWplY3QoZXJyb3IpLFxuXHRcdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRQcm9taXNlICgpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHJldHVybiB0aGlzLmRlZmVycmVkLnByb21pc2U7XG5cdH1cblxuXHRwcml2YXRlIGhhc011bHRpcGxlUXVlcmllcyAoKTogYm9vbGVhbiB7XG5cdFx0bGV0IGZpcnN0ID0gdHJ1ZTtcblxuXHRcdGZvciAoY29uc3QgX3F1ZXJ5U3RyaW5nIGluIHRoaXMucXVlcmllcykge1xuXHRcdFx0aWYgKCFmaXJzdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0Zmlyc3QgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwcml2YXRlIGdldEZpcnN0UXVlcnlTdHJpbmcgKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Zm9yIChjb25zdCBxdWVyeVN0cmluZyBpbiB0aGlzLnF1ZXJpZXMpIHtcblx0XHRcdHJldHVybiBxdWVyeVN0cmluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEVudHJ5UGFyZW50TnVsbCxcblx0RmllbGRNYXAsXG5cdEZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRNb2RpZnlGaWVsZHNDYWxsYmFjayxcblx0UHJvbWlzZUludGVyZmFjZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ29sdW1uU2V0IH0gZnJvbSAnLi9Db2x1bW5TZXQnO1xuaW1wb3J0IHsgQ29udmVyc2lvbk1hcFNlcnZpY2UgfSBmcm9tICcuL0NvbnZlcnNpb25NYXBTZXJ2aWNlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVDYWNoZSB9IGZyb20gJy4vVGVtcGxhdGVDYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ3JlYXRlU2VydmljZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbnZlcnNpb25NYXBTZXJ2aWNlOiBDb252ZXJzaW9uTWFwU2VydmljZSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdCkge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlIHRlbXBsYXRlfSBhbmQgc2V0cyB0aGUgaXRlbXMgY3JlYXRlZCBvbiB0aGUgcGFzc2VkIHtAbGluayBDaGFuZ2VzRGVsdGF9XG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlSXRlbXNGcm9tVmFsdWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRpZiAodmFsdWVzQXJyYXkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJvbWlzZXM6IGFueVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHZhbHVlcyBvZiB2YWx1ZXNBcnJheSkge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gdmFsdWVzLmhhc093blByb3BlcnR5KCdpZCcpXG5cdFx0XHRcdD8gdmFsdWVzLmlkXG5cdFx0XHRcdDogdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblxuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy50ZW1wbGF0ZUNhY2hlXG5cdFx0XHRcdFx0LmZldGNoVGVtcGxhdGUoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdHt9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNvbHVtbnMgd2UncmUgdHJ5aW5nIHRvIHNldCBhcmUgdGhlcmVcblx0XHRcdFx0XHRcdFx0W2l0ZW1UeXBlXTogT2JqZWN0LmtleXModmFsdWVzQXJyYXlbMF0pLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHQodGVtcGxhdGU6IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wcm9jZXNzVGVtcGxhdGUoXG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdFx0XHRcdFx0dGVtcGxhdGUsXG5cdFx0XHRcdFx0XHRcdFx0KCkgPT4gdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRfaXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0XHRcdCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKF9pdGVtVHlwZSAhPT0gaXRlbVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHZhbHVlcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZHNbY29sdW1uSWRdID0gdmFsdWVzW2NvbHVtbklkXTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NUZW1wbGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdFx0dGVtcGxhdGU6IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmlsdGVySXRlbUVudHJ5Q2FsbGJhY2s6IEZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrID0gKCkgPT4gdHJ1ZSxcblx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjaz86IE1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBpdGVtSWRDb252ZXJzaW9uID0gdGhpcy5jb252ZXJzaW9uTWFwU2VydmljZS5jcmVhdGVMb2NhbENvbnZlcnNpb25NYXAoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHRydWUsXG5cdFx0XHR0ZW1wbGF0ZS5yZXNwb25zZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZmllbGRzID0gdGVtcGxhdGUuZ2V0RmllbGRzKCk7XG5cblx0XHR0aGlzLmNvbnZlcnNpb25NYXBTZXJ2aWNlLnVwZGF0ZUl0ZW1WYWx1ZXMoXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHR0ZW1wbGF0ZS5jb2x1bW5zLml0ZW0sXG5cdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdFx0cGFyZW50LFxuXHRcdCk7XG5cblx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5fc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHR0ZW1wbGF0ZS5jb2x1bW5zLFxuXHRcdFx0cGFyZW50LFxuXHRcdCk7XG5cblx0XHR0aGlzLnByb2Nlc3NUZW1wbGF0ZUxpbmtJdGVtcyhcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0dGVtcGxhdGUsXG5cdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdFx0ZmlsdGVySXRlbUVudHJ5Q2FsbGJhY2ssXG5cdFx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjayxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NUZW1wbGF0ZUxpbmtJdGVtczxQYXJlbnRJdGVtVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0cGFyZW50VHlwZTogUGFyZW50SXRlbVR5cGUsXG5cdFx0bG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxQYXJlbnRJdGVtVHlwZT4sXG5cdFx0aXRlbUlkQ29udmVyc2lvbjogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRmaWx0ZXJJdGVtRW50cnlDYWxsYmFjazogRmlsdGVySXRlbUVudHJ5Q2FsbGJhY2sgPSAoKSA9PiB0cnVlLFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGFwaVJlc3BvbnNlID0gdGVtcGxhdGUucmVzcG9uc2U7XG5cdFx0Y29uc3QgY29sdW1uU2V0TWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBDb2x1bW5TZXQ8SXRlbVR5cGU+fSA9IHt9O1xuXG5cdFx0Y29uc3QgY3JlYXRlRW50cmllcyA9IChcblx0XHRcdF9wYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRcdF9sb2NhbFBhcmVudElkOiBJdGVtSWQsXG5cdFx0XHRhcGlQYXJlbnRJZDogSXRlbUlkLFxuXHRcdCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyZW50ID0ge1xuXHRcdFx0XHRpdGVtVHlwZTogX3BhcmVudFR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogX2xvY2FsUGFyZW50SWQsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBsaW5rcyA9IGFwaVJlc3BvbnNlLml0ZW1zW19wYXJlbnRUeXBlXVthcGlQYXJlbnRJZF0ubGlua3M7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gbGlua3MpIHtcblx0XHRcdFx0aWYgKCFsaW5rcy5oYXNPd25Qcm9wZXJ0eShpdGVtVHlwZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjb2x1bW5TZXRNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb2x1bW5TZXRNYXBbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlLnJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgbGlua3NbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGRzID0gYXBpUmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGFwaUl0ZW1JZCxcblx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdCFmaWx0ZXJJdGVtRW50cnlDYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGxvY2FsSXRlbUlkID0gaXRlbUlkQ29udmVyc2lvbltpdGVtVHlwZV1bYXBpSXRlbUlkXTtcblxuXHRcdFx0XHRcdHRoaXMuY29udmVyc2lvbk1hcFNlcnZpY2UudXBkYXRlSXRlbVZhbHVlcyhcblx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdGNvbHVtblNldE1hcFtpdGVtVHlwZV0uaXRlbSxcblx0XHRcdFx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0XHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmIChtb2RpZnlGaWVsZHNDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLl9zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHRcdGxvY2FsSXRlbUlkLFxuXHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y3JlYXRlRW50cmllcyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0bG9jYWxJdGVtSWQsXG5cdFx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjcmVhdGVFbnRyaWVzKFxuXHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdGxvY2FsUGFyZW50SWQsXG5cdFx0XHRhcGlSZXNwb25zZS5saW5rc1twYXJlbnRUeXBlXVswXSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9jbGFzc2VzL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL2NsYXNzZXMvSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUNyZWF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzL0l0ZW1DcmVhdGVTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIENoYW5nZXNEZWx0YUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBpdGVtQ3JlYXRlU2VydmljZTogSXRlbUNyZWF0ZVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0ICgpOiBDaGFuZ2VzRGVsdGEge1xuXHRcdHJldHVybiBuZXcgQ2hhbmdlc0RlbHRhKFxuXHRcdFx0dGhpcy5pdGVtQ3JlYXRlU2VydmljZSxcblx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSxcblx0XHQpO1xuXHR9XG5cblx0LypAaW50ZXJuYWwqL1xuXHRwdWJsaWMgY29uc3RydWN0SW50ZXJuYWxEZWx0YSAoKTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEge1xuXHRcdHJldHVybiBuZXcgSW50ZXJuYWxDaGFuZ2VzRGVsdGEoXG5cdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG59XG4iLCJpbXBvcnQge1xuXHRBcGlSZXF1ZXN0U2VydmljZSxcblx0Q2hhbmdlc1Byb2Nlc3Nvcixcblx0Q29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0SXRlbUVudHJ5U2VydmljZSxcblx0T25BZnRlckNyZWF0ZUNhbGxiYWNrLFxufSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuL0NvbHVtbkV4cGFuc2lvbkZhY3RvcnknO1xuaW1wb3J0IHsgQ3JlYXRlUmVxdWVzdEZhY3RvcnkgfSBmcm9tICcuL0NyZWF0ZVJlcXVlc3RGYWN0b3J5JztcbmltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcml2YXRlIGNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY3JlYXRlUmVxdWVzdEZhY3Rvcnk6IENyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBDaGFuZ2VzUHJvY2Vzc29yIHtcblx0XHRyZXR1cm4gbmV3IENoYW5nZXNQcm9jZXNzb3IoXG5cdFx0XHR0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLFxuXHRcdFx0dGhpcy5wcm9taXNlU2VydmljZSxcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGJyZWFrVXBCeVBhcmVudCxcblx0XHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciwgQ29sbGVjdGlvbk1hdGNoZXIsIENvbHVtblNldCwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSxcblx0SXRlbVJlc291cmNlLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgdHlwZSBFbnRyeVBhcmVudCA9IHtpdGVtVHlwZTogc3RyaW5nLCBpdGVtSWQ6IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIEVudHJ5UGFyZW50TnVsbCA9IEVudHJ5UGFyZW50IHwgbnVsbDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzZWQgZm9yIGZpZWxkcyB0aGF0IGJlbG9uZyB0byBhIHNwZWNpZmljIGl0ZW1UeXBlXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkTWFwPF9JdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdFtrZXk6IHN0cmluZ106IGFueVxufTtcblxuZXhwb3J0IHR5cGUgSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSBJdGVtRW50cnlPcHRpb25zSW50ZXJmYWNlO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPVxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlXG5cdCYgQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGU7XG5cdG9wdGlvbnM6IHtlbnRyeTogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucywgcmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPn07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0NvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRsaW5rRmllbGQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gU3RhdGVLZXlUeXBlIHtcblx0TmV3ID0gJ25ldycsXG5cdER1cGxpY2F0ZSA9ICdkdXBsaWNhdGUnXG59XG5cbmV4cG9ydCB0eXBlIFN0YXRlS2V5ID0ge3R5cGU6IFN0YXRlS2V5VHlwZSwgdGVtcGxhdGU/OiBzdHJpbmcsIGl0ZW1JZD86IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIFNvY2tldE1lc3NhZ2VUeXBlID0gJ2V2ZW50JyB8ICdub3RpZmljYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2Uge1xuXHRoZWFkZXI6IHtcblx0XHRkb21haW46IHN0cmluZyxcblx0XHRhY2NvdW50OiBzdHJpbmcsXG5cdFx0c2VuZGVyOiB7XG5cdFx0XHRkaXNwbGF5bmFtZTogc3RyaW5nLFxuXHRcdFx0aXRlbVR5cGU6ICdNZWRld2Vya2VyJyxcblx0XHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdFx0YXV0aG9yaXplZDogYm9vbGVhbixcblx0XHRcdHNlc3Npb246IHN0cmluZ1xuXHRcdH0sXG5cdFx0bWVzc2FnZUlkOiB7XG5cdFx0XHRJZDogc3RyaW5nLFxuXHRcdFx0c2VxdWVuY2U6IG51bWJlcixcblx0XHRcdGJhdGNoOiBudW1iZXIsXG5cdFx0XHRyZXF1ZXN0OiBudW1iZXJcblx0XHR9LFxuXHRcdHNlbnQ6IHN0cmluZyxcblx0XHRmb3JjZUV2YWx1YXRlOiBib29sZWFuXG5cdH07XG5cdGJvZHk6IGFueTtcblx0bWVzc2FnZVR5cGU6IFNvY2tldE1lc3NhZ2VUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VDcmVhdGVcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAnY3JlYXRlJyxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiB7XG5cdFx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFx0W2l0ZW1JZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdHBhcmVudDogbnVsbCB8IEVudHJ5UGFyZW50LFxuXHRcdFx0XHRcdHZhbHVlczogRmllbGRNYXBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlVXBkYXRlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ3VwZGF0ZScsXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczoge1xuXHRcdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRcdFx0XHRwYXJlbnQ6IG51bGwgfCBFbnRyeVBhcmVudCxcblx0XHRcdFx0XHR2YWx1ZXM6IEZpZWxkTWFwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZUxpbmtUb1xuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICdsaW5rdG8nLFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXBcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IHtcblx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0XHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0XHRcdFx0cGFyZW50OiBudWxsIHwgRW50cnlQYXJlbnQsXG5cdFx0XHRcdFx0dmFsdWVzOiBGaWVsZE1hcFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VEZWxldGVcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAnZGVsZXRlJyxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IEl0ZW1JZFtdXG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2Vcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblx0Ym9keToge1xuXHRcdGl0ZW1UeXBlOiAnRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZScsXG5cdFx0W2tleTogc3RyaW5nXTogYW55XG5cdH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gcmVzb3VyY2VcblxuZXhwb3J0IHR5cGUgSXRlbVJlc291cmNlSXRlbUlkTWFwPFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IHtcblx0W2l0ZW1JZDogbnVtYmVyXTogVFxufTtcblxuZXhwb3J0IHR5cGUgSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwPFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUW11cbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gRW50cnlcblxuZXhwb3J0IHR5cGUgSXRlbUlkID0gbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBJdGVtVHlwZSA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgSXRlbU1hcDxUPiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2l0ZW1JZDogc3RyaW5nXTogVFxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBJdGVtRW50cnlNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gSXRlbU1hcDxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cbmV4cG9ydCB0eXBlIEl0ZW1FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtcblx0W3BhcmVudElkOiBudW1iZXJdOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG59O1xuXG5leHBvcnQgdHlwZSBDb252ZXJzaW9uTWFwID0ge1xuXHRbaXRlbUlkOiBudW1iZXJdOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBJdGVtSWRDb252ZXJzaW9uTWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IENvbnZlcnNpb25NYXBcbn07XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJNYXA8VCA9IGFueT4gPSBJdGVtTWFwPFQ+O1xuXG5leHBvcnQgdHlwZSBJdGVtRXJyb3IgPSB7bWVzc2FnZTogc3RyaW5nfTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29sbGVjdGlvbiBFbnRyeVxuXG5leHBvcnQgdHlwZSBRdWVyeVBhcmFtcyA9IGFueTsgLy8gVE9ET1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUXVlcnkgPSB7b2JqZWN0OiBvYmplY3QsIHN0cmluZzogc3RyaW5nfTtcblxuZXhwb3J0IHR5cGUgUXVlcnlDYWxsYmFjayA9IChxdWVyeVBhcmFtczogUXVlcnlQYXJhbXMpID0+IFF1ZXJ5UGFyYW1zO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdFtwYXJlbnRJZDogbnVtYmVyXTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT5cbn07XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0W3BhcmVudElkOiBudW1iZXJdOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPlxufTtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtcblx0Zml0dGluZzogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRub3RmaXR0aW5nOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdG1heWJlOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5kZWRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+XG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT4ge1xuXHRjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGVkRXh0ZW5kZWRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblx0W2NvbGxlY3Rpb25JZDogbnVtYmVyXTogRXh0ZW5kZWRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29sdW1uc1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUNvbHVtbiA9IGFueTsgLy8gVE9ET1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUNvbHVtbk1hcCA9IHtcblx0W2NvbHVtbklkOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtblxufTtcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtbk1hcFxufTtcblxuZXhwb3J0IHR5cGUgQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0bWVyZ2VkOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcblx0ZGlmZmVyZW5jZTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT5cbn07XG5cbmV4cG9ydCB0eXBlIFJvb3RDb2x1bW5NYXAgPSB7W2NvbHVtbklkOiBzdHJpbmddOiB7YXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbiwgY2hpbGRyZW46IFJvb3RDb2x1bW5NYXB9fTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXBpIHJlZmVyZW5jZVxuXG5leHBvcnQgdHlwZSBBcGlSZXNwb25zZSA9IEFwaVJlc3BvbnNlUHJvY2Vzc29yOyAvLyBUT0RPXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFwaSB0ZW1wbGF0ZSByZXNwb25zZVxuZXhwb3J0IHR5cGUgVGVtcGxhdGVJdGVtUmVzb3VyY2VNYXA8VCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+PiA9IHtcblx0bWFpbjogVDtcblx0bGlua2VkOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXBcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1UeXBlTWFwPFQgPSBhbnk+ID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IFQ7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcGkgcmVxdWVzdFxuXG5leHBvcnQgdHlwZSBBcGlRdWVyeSA9IGFueTsgLy8gVE9ET1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0SXRlbVZhbHVlcyA9IHtcblx0dmFsdWVzPzogYW55LFxuXHRsaW5rcz86IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RJdGVtTWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRbaXRlbUlkOiBudW1iZXJdOiBBcGlSZXF1ZXN0SXRlbVZhbHVlc1xuXHR9O1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdENvbHVtbiA9IHN0cmluZyB8IHtbY29sdW1uSWQ6IHN0cmluZ106IEFwaVJlcXVlc3RDb2x1bW5bXX07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW5zID0gQXBpUmVxdWVzdENvbHVtbltdIHwgdHJ1ZTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdENvbHVtbk1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBBcGlSZXF1ZXN0Q29sdW1uc1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdExpbWl0ID0ge1xuXHRmaWVsZDogc3RyaW5nLFxuXHRsaW1pdDogbnVtYmVyLFxuXHRvZmZzZXQ/OiBudW1iZXIsXG5cdG9yZGVyPzogJ2Rlc2MnIHwgJ2FzYydcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RNb3ZlSXRlbXMgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW11cbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENyZWF0ZSByZXF1ZXN0XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdHJlcXVlc3Q6IHtcblx0XHRyZXF1ZXN0VHlwZTogJ2NyZWF0ZScsXG5cdFx0aXRlbVR5cGU/OiBJdGVtVHlwZVR5cGUsXG5cdFx0cGFyZW50VHlwZT86IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkPzoge1tpdGVtSWQ6IHN0cmluZ106IEl0ZW1JZH0sXG5cdFx0aXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwLFxuXHRcdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5NYXBcblx0fSxcblx0Y29sdW1uczogUmVxdWVzdENvbHVtbkV4cGFuc2lvbixcblx0aXRlbXM6IEl0ZW1FbnRyeU1hcDxJdGVtVHlwZVR5cGU+LFxuXHRjb2xsZWN0aW9uczogQ29sbGVjdGlvbk1hdGNoZXJcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBlbnVtIEFwaUxpbmtUcmVlVHlwZSB7XG5cdElURU1UQUJMRSA9ICdpdGVtdGFibGUnLFxuXHRESVJFQ1QgPSAnZGlyZWN0J1xufVxuXG5leHBvcnQgdHlwZSBBcGlMaW5rVHJlZUVudHJ5ID0ge1xuXHR0eXBlOiBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFXG59IHwge1xuXHR0eXBlOiBBcGlMaW5rVHJlZVR5cGUuRElSRUNULFxuXHRmaWVsZDogc3RyaW5nXG59O1xuXG5leHBvcnQgdHlwZSBBcGlMaW5rVHJlZSA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2NoaWxkVHlwZTogc3RyaW5nXTogQXBpTGlua1RyZWVFbnRyeVxuXHR9XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQ2FsbGJhY2sgdG8gZGV0ZXJtaW5lIGlmIGFuIGl0ZW0gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjcmVhdGUgZGVsdGEsIHJldHVybiBgZmFsc2VgIHRvIGV4Y2x1ZGUgdGhlIGl0ZW1cbiAqL1xuZXhwb3J0IHR5cGUgRmlsdGVySXRlbUVudHJ5Q2FsbGJhY2sgPSA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNb2RpZnlGaWVsZHNDYWxsYmFjayA9IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGl0ZW1JZENvbnZlcnNpb25NYXA/OiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyAnZmFsc2UnIGlmIHRoZSBmaWVsZCBjaGFuZ2VkXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBhcmVGaWVsZENhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IChmaWVsZDoga2V5b2YgRmllbGRNYXA8SXRlbVR5cGVUeXBlPikgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgRmllbGRDaGFuZ2VDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSAoXG5cdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGNvbXBhcmVGaWVsZDogQ29tcGFyZUZpZWxkQ2FsbGJhY2ssXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbixcblx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIERlcmVnRnVuY3Rpb24gPSAoKSA9PiB2b2lkO1xuIiwiZXhwb3J0ICogZnJvbSAnLi9Qcm9taXNlTGlicmFyeUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL0Vycm9ySGFuZGxlckludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL0V4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BdXRoSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Tb2NrZXRNZXNzYWdlSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQWJzdHJhY3RDYWNoZURlcGVuZGVuY3lJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyRGVwZW5kZW5jeUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXJEZXBlbmRlbmN5SW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vU2VydmVyQ2FjaGVEZXBlbmRlbmN5SW50ZXJmYWNlJztcbiJdLCJzb3VyY2VSb290IjoiIn0=
|
|
10638
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SbUNvcmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1JtQ29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlGb3JtYXR0ZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQXBpUmVxdWVzdFNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQXBpUmVzcG9uc2VQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ2hhbmdlc0NvbXBpbGF0aW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvSXRlbUhhbmRsZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uTWF0Y2hlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sbGVjdGlvbk1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25DYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uSW5mby50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5TZXQudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uU3Vic2V0Q2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uVXRpbC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db252ZXJzaW9uTWFwU2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DcmVhdGVSZXF1ZXN0LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5UGFyc2VyQmFzZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9RdWVyeUNvbHVtbkV4dHJhY3Rvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9Db2xsZWN0aW9uSGFuZGxlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvc2VydmVyL1NlcnZlckNvbGxlY3Rpb25IYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0l0ZW1FbnRyeVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvS2V5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Mb2NrU2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlNYXRjaGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5UGFyc2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1NvY2tldE1lc3NhZ2VIYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25WYWxpZGF0b3IudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvVXRpbC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0l0ZW1FbnRyeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtRW50cnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtUmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uRW50cnlPcHRpb25zLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25FbnRyeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25SZXNvdXJjZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL1RlbXBsYXRlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL1JtQ29yZS9leHRlcm5hbCBcIm1vbWVudFwiIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbGxlY3Rpb25DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uRW50cnlGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtbkV4cGFuc2lvbkZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2x1bW5JbmZvRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtblNldEZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DcmVhdGVSZXF1ZXN0RmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0l0ZW1DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9JdGVtRW50cnlGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvSXRlbVJlc291cmNlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1RyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1F1ZXJ5TWF0Y2hlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9RdWVyeVBhcnNlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1RlbXBsYXRlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL2luZGV4LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy90eXBlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9UZW1wbGF0ZUNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jb3JlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DcmVhdGVkQ2hhbmdlc0RlbHRhLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0ludGVybmFsQ2hhbmdlc0RlbHRhLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUNyZWF0ZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL3R5cGVzL0l0ZW1UeXBlc0NvbGxlY3Rpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ludGVyZmFjZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEY0QjtBQUtVO0FBRXRDO0lBT0M7UUFMQSxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUNoQywyQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztRQUNsRCx1QkFBa0IsR0FBRyxVQUFVLENBQUM7UUFDaEMsdUJBQWtCLEdBQUcsWUFBWSxDQUFDO0lBSWxDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksd0NBQWlCLEdBQXhCLFVBQTBCLFVBQWtCO1FBQzNDLFFBQVEsVUFBVSxFQUFFO1lBQ25CLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRDs7O09BR0c7SUFDSSxzQ0FBZSxHQUF0QixVQUNDLE9BQStCLEVBQy9CLE9BQStCLEVBQy9CLFVBQWtDLEVBQ2xDLE9BQXdDO1FBRXhDLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixJQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBRS9CLElBQ0MsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVM7bUJBQ2pDLENBQ0YsVUFBVSxLQUFLLElBQUk7b0JBQ25CLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxTQUFTO29CQUNqQyxJQUFJLENBQUMsYUFBYSxDQUNqQixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFDckIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUNuQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQ25CLENBQ0QsRUFDQTtnQkFDRCxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDL0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQ3JCLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FDdEIsQ0FBQzthQUNGO1NBQ0Q7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNoQixDQUFDO0lBRU0sb0NBQWEsR0FBcEIsVUFDQyxPQUErQixFQUMvQixRQUFnQyxFQUNoQyxPQUErQjtRQUUvQixJQUFNLE1BQU0sR0FBOEIsRUFBRSxDQUFDO1FBRTdDLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDbkMsSUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUVsQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZCLFNBQVM7YUFDVDtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUN0QixVQUFVLEVBQ1YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUNqQixRQUFRLENBQUMsUUFBUSxDQUFDLENBQ2xCLEVBQUU7Z0JBQ0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDekMsVUFBVSxFQUNWLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FDbEIsQ0FBQzthQUNGO1NBQ0Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTSx5Q0FBa0IsR0FBekIsVUFDQyxNQUE4QixFQUM5QixPQUErQjtRQUUvQixJQUFNLE1BQU0sR0FBOEIsRUFBRSxDQUFDO1FBRTdDLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFFbkMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFO2dCQUN2QixTQUFTO2FBQ1Q7WUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUN6QyxTQUFTLENBQUMsSUFBSSxFQUNkLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDaEIsQ0FBQztTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU0saUNBQVUsR0FBakIsVUFDQyxPQUFpQixFQUNqQixRQUFrQixFQUNsQixPQUErQixFQUMvQixzQkFBdUM7UUFBdkMsdUVBQXVDO1FBRXZDLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFFbkMsMEVBQTBFO1lBQzFFLDJEQUEyRDtZQUMzRCxJQUNDLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTTttQkFDdEIsU0FBUyxDQUFDLElBQUksS0FBSyxZQUFZO21CQUMvQixTQUFTLENBQUMsSUFBSSxLQUFLLFVBQVU7bUJBQzdCLENBQUMsQ0FBQyxzQkFBc0IsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQ2pEO2dCQUNELFNBQVM7YUFDVDtZQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDM0MsUUFBUSxFQUNSLFFBQVEsQ0FDUixDQUFDO2dCQUVGLG9HQUFvRztnQkFDcEcsSUFDQyxJQUFJLEtBQUssU0FBUzt1QkFDZixJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVM7dUJBQ3hCLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUN4QjtvQkFDRCxTQUFTO2lCQUNUO2FBQ0Q7WUFFRCxJQUNDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FDbEIsU0FBUyxDQUFDLElBQUksRUFDZCxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQ2pCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FDbEIsRUFDQTtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNaO1NBQ0Q7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTSxpQ0FBVSxHQUFqQixVQUNDLE9BQStCLEVBQy9CLFFBQWdDLEVBQ2hDLE9BQStCO1FBRS9CLElBQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUU1QixLQUFxQixVQUFPLEVBQVAsbUJBQU8sRUFBUCxxQkFBTyxFQUFQLElBQU8sRUFBRTtZQUF6QixJQUFNLE1BQU07WUFDaEIsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBRW5DLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDdkIsU0FBUzthQUNUO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQ3RCLFNBQVMsQ0FBQyxJQUFJLEVBQ2QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUNqQixRQUFRLENBQUMsUUFBUSxDQUFDLENBQ2xCLEVBQUU7Z0JBQ0YsTUFBTSxDQUFDLElBQUksQ0FDVjtvQkFDQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQztvQkFDM0IsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUM7b0JBQzVCLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUztpQkFDeEIsQ0FDRCxDQUFDO2FBQ0Y7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVNLGlDQUFVLEdBQWpCLFVBQ0MsTUFBOEIsRUFDOUIsV0FBbUMsRUFDbkMsT0FBK0I7UUFFL0IsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBekIsSUFBTSxNQUFNO1lBQ2hCLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFFL0IsSUFDQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDO21CQUMvQjtnQkFDRixrREFBa0Q7Z0JBQ2xELENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO3VCQUMzQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssU0FBUyxDQUNuQyxFQUNBO2dCQUNELFNBQVM7YUFDVDtZQUVELFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNuQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUNsQixDQUFDO1NBQ0Y7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNwQixDQUFDO0lBRU0sd0NBQWlCLEdBQXhCLFVBQ0MsYUFBdUIsRUFDdkIsVUFBb0IsRUFDcEIsV0FBcUIsRUFDckIsT0FBK0I7UUFFL0IsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBekIsSUFBTSxNQUFNO1lBQ2hCLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFFL0IsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztnQkFDbEUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxLQUFLLENBQ1QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQ3JCLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FDdEIsQ0FBQztTQUNIO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQztJQUVNLHVDQUFnQixHQUF2QixVQUNDLFdBQXFCLEVBQ3JCLE9BQStCO1FBRS9CLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyRTtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxvQ0FBYSxHQUFwQixVQUNDLFVBQWtCLEVBQ2xCLEtBQVcsRUFDWCxNQUFZO1FBRVosSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQztTQUM1QjtRQUVELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN6QixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsUUFBUSxVQUFVLEVBQUU7WUFDbkIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVTtnQkFDZCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FDL0IsS0FBSyxFQUNMLE1BQU0sQ0FDTixDQUFDO1lBQ0gsS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUMzQixLQUFLLEVBQ0wsTUFBTSxDQUNOLENBQUM7WUFDSCxLQUFLLElBQUksQ0FBQyxDQUFDLFdBQVc7WUFDdEIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxTQUFTO2dCQUNiLHlDQUF5QztnQkFDekMsT0FBTyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsNEJBQTRCO1lBQ3JELEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxRQUFRLENBQUMsQ0FBQyx1QkFBdUI7WUFDdEMsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFlBQVksQ0FBQztZQUNsQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssWUFBWTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUN4QixLQUFLLEVBQ0wsTUFBTSxDQUNOLENBQUM7WUFDSCxLQUFLLEtBQUssQ0FBQyxDQUFDLGdCQUFnQjtZQUM1QixLQUFLLE1BQU0sQ0FBQyxDQUFDLGdCQUFnQjtZQUM3QixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTyxDQUFDLENBQUMsZUFBZTtZQUM3QixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssT0FBTztnQkFDWCxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUM7WUFDekI7Z0JBQ0MsT0FBTyw4QkFBTSxDQUNaLEtBQUssRUFDTCxNQUFNLENBQ04sQ0FBQztTQUNIO0lBQ0YsQ0FBQztJQUVNLG9DQUFhLEdBQXBCLFVBQ0MsQ0FBUyxFQUNULENBQVM7UUFFVCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFN0IsSUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBRXpCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQztTQUNaO2FBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDekQsbURBQW1EO1lBQ25ELHlDQUF5QztZQUN6QyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0M7YUFBTTtZQUNOLHFCQUFxQjtZQUNyQixPQUFPLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNyQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFDYixNQUFNLENBQUMsU0FBUyxDQUNoQixHQUFHLE9BQU8sQ0FBQztTQUNaO0lBQ0YsQ0FBQztJQUVNLDJDQUFvQixHQUEzQixVQUNDLEtBQW9CLEVBQ3BCLE1BQXFCO1FBRXJCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDckIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN6QjtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEIsT0FBTyxLQUFLLENBQUM7U0FDYixDQUFDLGlCQUFpQjtRQUVuQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVNLHVDQUFnQixHQUF2QixVQUNDLEtBQXNCLEVBQ3RCLE1BQXVCO1FBRXZCLE9BQU8sS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBRU0sMENBQW1CLEdBQTFCLFVBQ0MsVUFBa0IsRUFDbEIsS0FBVTtRQUVWLFFBQVEsVUFBVSxFQUFFO1lBQ25CLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssTUFBTTtnQkFDVixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLE9BQU87Z0JBQ1gsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLEtBQUssTUFBTTtnQkFDVixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDOUUsS0FBSyxRQUFRO2dCQUNaLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbkMsS0FBSyxVQUFVO2dCQUNkLE9BQU8sS0FBSyxHQUFHLE9BQU8sQ0FBQztZQUN4QjtnQkFDQyxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0YsQ0FBQztJQUVNLHlDQUFrQixHQUF6QixVQUNDLFVBQWtCLEVBQ2xCLEtBQVU7UUFFVixRQUFRLFVBQVUsRUFBRTtZQUNuQixLQUFLLFVBQVU7Z0JBQ2QsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsS0FBSyxNQUFNO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLEtBQUssT0FBTztnQkFDWCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLFVBQVU7Z0JBQ2QsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsS0FBSyxRQUFRO2dCQUNaLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbkM7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFTSx5Q0FBa0IsR0FBekIsVUFBMkIsS0FBaUI7UUFDM0MsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyx5QkFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyx5QkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSw2Q0FBc0IsR0FBN0IsVUFBK0IsS0FBb0I7UUFDbEQsT0FBTyx5QkFBTSxDQUFDLFFBQVEsQ0FDckIsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQzFCLFNBQVMsQ0FDVCxDQUFDO0lBQ0gsQ0FBQztJQUVNLDBDQUFtQixHQUExQixVQUE0QixLQUFhO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUN0RCxDQUFDO0lBRU0sNENBQXFCLEdBQTVCLFVBQThCLEtBQW9CO1FBQ2pELE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVNLHdDQUFpQixHQUF4QixVQUEwQixLQUFvQjtRQUM3QyxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3ZFLENBQUM7SUFFTSw0Q0FBcUIsR0FBNUIsVUFBOEIsS0FBc0I7UUFDbkQsT0FBTyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLHlDQUFrQixHQUF6QixVQUEyQixLQUFhO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RCxDQUFDO0lBRU0sc0NBQWUsR0FBdEIsVUFBd0IsVUFBa0I7UUFDekMsUUFBUSxVQUFVLEVBQUU7WUFDbkIsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxPQUFPO2dCQUNYLE9BQU8sQ0FBQyxDQUFDO1lBQ1YsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxTQUFTO2dCQUNiLE9BQU8sSUFBSSxDQUFDO1lBQ2IsS0FBSyxNQUFNO2dCQUNWLE9BQU8sS0FBSyxDQUFDO1lBQ2QsS0FBSyxNQUFNO2dCQUNWLE9BQU8sR0FBRyxDQUFDO1lBQ1osS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE1BQU07Z0JBQ1YsT0FBTyx5QkFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLEtBQUssVUFBVTtnQkFDZCxPQUFPLHlCQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFVBQVU7Z0JBQ2QsT0FBTyxFQUFFLENBQUM7WUFDWCxLQUFLLE9BQU87Z0JBQ1gsT0FBTyxTQUFTLENBQUM7WUFDbEI7Z0JBQ0MsT0FBTyxFQUFFLENBQUM7WUFDWCxhQUFhO1lBQ2IsV0FBVztZQUNYLFlBQVk7WUFDWixZQUFZO1lBQ1osWUFBWTtTQUNaO0lBQ0YsQ0FBQztJQUVNLHFDQUFjLEdBQXJCLFVBQ0MsVUFBa0IsRUFDbEIsS0FBVTtRQUVWLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FDeEIsVUFBVSxFQUNWLEtBQUssRUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLDRCQUFLLEdBQVosVUFDQyxVQUFrQixFQUNsQixLQUFVO1FBRVYsUUFBUSxVQUFVLEVBQUU7WUFDbkIsS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVTtnQkFDZCxPQUFPLHlCQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsS0FBSyxNQUFNO2dCQUNWLE9BQU8sNEJBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQjtnQkFDQyxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0YsQ0FBQztJQUVNLHVDQUFnQixHQUF2QixVQUF5QixVQUFrQjtRQUMxQyxRQUFRLFVBQVUsRUFBRTtZQUNuQixLQUFLLFVBQVU7Z0JBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzNCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN2QjtnQkFDQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDdEI7SUFDRixDQUFDO0lBRU0sb0NBQWEsR0FBcEIsVUFBc0IsUUFBeUI7UUFDOUMsT0FBTyx5QkFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sZ0NBQVMsR0FBaEIsVUFBa0IsSUFBbUI7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLCtCQUFRLEdBQWYsVUFBb0IsS0FBUTtRQUMzQixPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFDRixtQkFBQztBQUFELENBQUM7Ozs7QUNsaUJEO0lBQ0MsMkJBQ1MseUJBQXFELEVBQ3JELDJCQUF3RDtRQUR4RCw4QkFBeUIsR0FBekIseUJBQXlCLENBQTRCO1FBQ3JELGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7SUFHakUsQ0FBQztJQUVELG9DQUFRLEdBQVIsVUFBVSxRQUFrQixFQUFFLE1BQVc7UUFDeEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELGtDQUFNLEdBQU4sVUFBUSxRQUFrQixFQUFFLE1BQWMsRUFBRSxNQUFXLEVBQUUsVUFBcUIsRUFBRSxRQUFpQjtRQUNoRyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNwSCxDQUFDO0lBRUQsa0NBQU0sR0FBTixVQUFRLFFBQWtCLEVBQUUsT0FBaUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELHVDQUFXLEdBQVgsVUFBYSxRQUFrQixFQUFFLEtBQXdCLEVBQUUsT0FBWTtRQUN0RSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVELDJDQUFlLEdBQWYsVUFBaUIsTUFBVyxFQUFFLGVBQXVDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFRCxxQ0FBUyxHQUFULFVBQVcsVUFBb0IsRUFBRSxRQUFnQixFQUFFLEtBQXFDO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQsbUNBQU8sR0FBUCxVQUFTLFFBQWtCLEVBQUUsT0FBNEIsRUFBRSxNQUFZO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQsaUNBQUssR0FBTCxVQUFPLFFBQWtCLEVBQUUsS0FBVSxFQUFFLE9BQTRCLEVBQUUsS0FBdUI7UUFDM0YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQsMkNBQWUsR0FBZixVQUFpQixPQUFZO1FBQTdCLGlCQUVDO1FBREEsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUMsUUFBYSxJQUFLLFlBQUksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQXBELENBQW9ELENBQUMsQ0FBQztJQUM5RixDQUFDO0lBQ0Ysd0JBQUM7QUFBRCxDQUFDOzs7O0FDL0NELDZFQUE2RTtBQUM3RTtJQW1CQyw4QkFDUSxZQUEwQixFQUMxQixRQUFhO1FBRGIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQVZyQixtQkFBYyxHQUlWLEVBQUUsQ0FBQztRQUVQLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFNbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFFbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVNLGdEQUFpQixHQUF4QixVQUEwQixRQUFrQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLHlDQUFVLEdBQWpCLFVBQ0MsUUFBa0IsRUFDbEIsTUFBYyxFQUNkLFFBQWdCO1FBRWhCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDL0MsT0FBTyxTQUFTLENBQUM7U0FDakI7UUFFRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUMzQyxNQUFNLENBQUMsSUFBSSxFQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVNLCtDQUFnQixHQUF2QixVQUF5QixRQUFrQjtRQUMxQyxJQUFNLE1BQU0sR0FBcUIsRUFBRSxDQUFDO1FBRXBDLEtBQXdCLFVBQXNCLEVBQXRCLFNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQXRCLGNBQXNCLEVBQXRCLElBQXNCLEVBQUU7WUFBM0MsSUFBTSxTQUFTO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTSxpREFBa0IsR0FBekIsVUFDQyxRQUFrQixFQUNsQixNQUFjLEVBQ2QsV0FBNkI7UUFFN0IsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWxCLEtBQXFCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO1lBQTdCLElBQU0sTUFBTTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQ3RCLElBQUksQ0FBQyxVQUFVLENBQ2QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLENBQUMsRUFBRSxDQUNULEVBQ0QsTUFBTSxFQUNOLE1BQU0sQ0FDTixDQUFDO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTSxpREFBa0IsR0FBekIsVUFDQyxLQUFVLEVBQ1YsTUFBc0IsRUFDdEIsV0FBZ0I7UUFFaEIsS0FBMEIsVUFBZSxFQUFmLFdBQU0sQ0FBQyxRQUFRLEVBQWYsY0FBZSxFQUFmLElBQWUsRUFBRTtZQUF0QyxJQUFNLFdBQVc7WUFDckIsSUFBSSxVQUFVLFVBQUM7WUFFZixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ25CLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5RjtpQkFBTTtnQkFDTixVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDM0IsTUFBTSxDQUFDLFFBQVEsRUFDZixLQUFLLEVBQ0wsV0FBVyxDQUFDLEVBQUUsQ0FDZCxDQUFDO2dCQUNGLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO2FBQzNDO1lBRUQsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO2dCQUN2QixTQUFTO2FBQ1Q7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQ3RCLFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxDQUNYLENBQUM7U0FDRjtJQUNGLENBQUM7SUFFTSwwQ0FBVyxHQUFsQixVQUNDLFFBQXNCLEVBQ3RCLE1BQXVCLEVBQ3ZCLFlBQTZCO1FBQTdCLG1EQUE2QjtRQUU3QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3ZDLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO1FBRUQsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdkIsT0FBTyxTQUFTLENBQUM7U0FDakI7UUFFRCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMvQyxJQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1FBRTFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFekMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckQsSUFBSSxDQUFDLHlCQUF5QixDQUM3QixNQUFNLENBQUMsRUFBRSxFQUNULE1BQU0sQ0FBQyxJQUFJLEVBQ1gsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLE1BQU0sQ0FDTixDQUFDO2FBQ0Y7aUJBQU07Z0JBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUN4RCxNQUFNLENBQUMsSUFBSSxFQUNYLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDUCxDQUFDO2FBQ0Y7U0FDRDtRQUVELElBQUksWUFBWSxFQUFFO1lBQ2pCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBRXBCLEtBQUssSUFBTSxRQUFRLElBQUksS0FBSyxFQUFFO2dCQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUNwQixRQUFRLEVBQ1IsWUFBWSxFQUNaLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FDZixDQUFDO2FBQ0g7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVNLCtDQUFnQixHQUF2QixVQUNDLFFBQXNCLEVBQ3RCLFlBQXNCLEVBQ3RCLE9BQXlCO1FBRXpCLElBQU0sTUFBTSxHQUFVLEVBQUUsQ0FBQztRQUV6QixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDckIsS0FBSyxJQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQzNCLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxDQUNaLENBQUMsQ0FBQzthQUNIO1lBRUQsT0FBTyxNQUFNLENBQUM7U0FDZDtRQUVELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQjtRQUVELEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQzNCLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxDQUNaLENBQUMsQ0FBQztTQUNIO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU0saURBQWtCLEdBQXpCO1FBQ0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFTyx3REFBeUIsR0FBakMsVUFDQyxRQUFnQixFQUNoQixVQUFrQixFQUNsQixZQUFpQixFQUNqQixXQUFtQztRQUpwQyxpQkE0QkM7UUF0QkEsTUFBTSxDQUFDLGNBQWMsQ0FDcEIsV0FBVyxFQUNYLFFBQVEsRUFDUjtZQUNDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLEdBQUcsRUFDRixlQUFLO2dCQUNKLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUU3QixXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQy9CLENBQUM7WUFDRixHQUFHLEVBQUU7Z0JBQ0osT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRTdCLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQ25FLFVBQVUsRUFDVixZQUFZLENBQ1osQ0FBQztZQUNILENBQUM7U0FDRCxDQUNELENBQUM7SUFDSCxDQUFDO0lBRU8sK0NBQWdCLEdBQXhCO1FBQ0MsS0FBSyxJQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7YUFDN0M7U0FDRDtJQUNGLENBQUM7SUFDRiwyQkFBQztBQUFELENBQUM7Ozs7QUM1UG1DO0FBb0JwQztJQWNDLDRCQUNTLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQWJ0QyxnQkFBVyxHQUtQO1lBQ0gsTUFBTSxFQUFFLEVBQUU7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1lBQ1YsSUFBSSxFQUFFLEVBQUU7U0FDUixDQUFDO1FBS0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTyx5Q0FBWSxHQUFwQjtRQUNDLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakQsS0FBSyxJQUFNLFFBQVEsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFO1lBQzVDLElBQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUxRCxLQUF3QixVQUFrQixFQUFsQix5Q0FBa0IsRUFBbEIsZ0NBQWtCLEVBQWxCLElBQWtCLEVBQUU7Z0JBQXZDLElBQU0sU0FBUztnQkFDbkIsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3hCLFNBQVM7aUJBQ1Q7Z0JBRUQsSUFBSSxDQUFDLGNBQWMsQ0FDbEIsU0FBUyxDQUNULENBQUM7YUFDRjtTQUNEO1FBRUQsS0FBSyxJQUFNLFdBQVcsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFO1lBQy9DLElBQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQjtRQUVELEtBQUssSUFBTSxXQUFXLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUMvQyxJQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWhELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsS0FBSyxJQUFNLFdBQVcsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzdDLElBQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFOUMsSUFBSSxDQUFDLFlBQVksQ0FDaEIsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsRUFBRSxDQUNSLENBQUM7U0FDRjtJQUNGLENBQUM7SUFFTyw2Q0FBZ0IsR0FBeEI7UUFDQyxPQUFPO1lBQ04sUUFBUSxFQUFFLE1BQU07WUFDaEIsTUFBTSxFQUFFLENBQUM7U0FDVCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHlDQUFZLEdBQXBCLFVBQ0MsU0FBb0IsRUFDcEIsU0FBc0I7UUFFdEIsa0NBQVUsQ0FDVCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFDckI7WUFDQyxTQUFTLENBQUMsUUFBUTtZQUNsQixTQUFTLENBQUMsTUFBTTtTQUNoQixFQUNEO1lBQ0MsRUFBRTtZQUNGLEVBQUU7U0FDRixDQUNEO2FBQ0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTywyQ0FBYyxHQUF0QixVQUNDLFNBQThCO1FBRTlCLGtDQUFVLENBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQ3ZCO1lBQ0MsU0FBUyxDQUFDLFFBQVE7U0FDbEIsRUFDRDtZQUNDLEVBQUU7U0FDRixDQUNEO2FBQ0MsSUFBSSxDQUNKLFNBQVMsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVPLDJDQUFjLEdBQXRCLFVBQXdCLFNBQThCO1FBQ3JELGtDQUFVLENBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQ3ZCO1lBQ0MsU0FBUyxDQUFDLFFBQVE7WUFDbEIsU0FBUyxDQUFDLE1BQU07U0FDaEIsRUFDRDtZQUNDLEVBQUU7WUFDRixTQUFTO1NBQ1QsQ0FDRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLDJDQUFjLEdBQXRCLFVBQXdCLFdBQWdDO1FBQ3ZELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzRCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDcEIsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ2pDO1FBRUQsa0NBQVUsQ0FDVCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFDdkI7WUFDQyxNQUFNLENBQUMsUUFBUTtZQUNmLE1BQU0sQ0FBQyxNQUFNO1lBQ2IsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQzFCLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTTtTQUN4QixFQUNEO1lBQ0MsRUFBRTtZQUNGLEVBQUU7WUFDRixFQUFFO1lBQ0YsV0FBVztTQUNYLENBQ0QsQ0FBQztJQUNILENBQUM7SUFFRix5QkFBQztBQUFELENBQUM7Ozs7QUN6Sm1CO0FBc0JzQjtBQUkxQzs7O0dBR0c7QUFDSDtJQUtDLDBCQUNTLG1CQUF3QyxFQUN4QyxpQkFBb0MsRUFDcEMseUJBQW9ELEVBQ3BELHNCQUE4QyxFQUM5QyxvQkFBMEMsRUFDMUMsWUFBbUMsRUFDbkMsY0FBdUMsRUFDdkMsNkJBQTRELEVBQzVELHNCQUE4QyxFQUM5QyxnQkFBa0MsRUFDbEMsV0FBNkIsRUFDN0IsZUFBeUIsRUFDekIscUJBQTZDO1FBWjdDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBK0I7UUFDNUQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixvQkFBZSxHQUFmLGVBQWUsQ0FBVTtRQUN6QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXdCO1FBaEI5Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBQzlDLGdCQUFXLEdBQWdCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7SUFpQnJFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksa0NBQU8sR0FBZDtRQUFBLGlCQXlCQztRQXhCQSxJQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQ2xFLElBQUksQ0FBQyxXQUFXLENBQ2hCLENBQUM7UUFFRixJQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7UUFFbkQsT0FBTyxJQUFJO2FBQ1QscUJBQXFCLENBQUMsa0JBQWtCLENBQUM7YUFDekMsSUFBSSxDQUNKLGNBQU0sWUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBMUMsQ0FBMEMsRUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCO2FBQ0EsSUFBSSxDQUNKLGNBQU0sWUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBOUMsQ0FBOEMsRUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCO2FBQ0EsSUFBSSxDQUNKLGNBQU0sWUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBOUMsQ0FBOEMsRUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCO2FBQ0EsSUFBSSxDQUNKLGNBQU0sWUFBSSxDQUFDLG1CQUFtQixFQUF4QixDQUF3QixFQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTywyQ0FBZ0IsR0FBeEIsVUFBMEIsa0JBQStCO1FBQ3hELElBQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFFdkMsS0FBd0IsVUFBa0IsRUFBbEIseUNBQWtCLEVBQWxCLGdDQUFrQixFQUFsQixJQUFrQixFQUFFO1lBQXZDLElBQU0sU0FBUztZQUNuQixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBRXBDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUN0QjtZQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU8sc0NBQVcsR0FBbkIsVUFDQyxRQUFrQixFQUNsQixNQUFjLEVBQ2QsR0FBbUQ7UUFBbkQsNEJBQTJCLElBQUksQ0FBQyxtQkFBbUI7UUFFbkQsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQ3RCLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO1FBRUQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO1FBRUQsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGdEQUFxQixHQUE3QixVQUNDLGtCQUFzQztRQUR2QyxpQkErQkM7UUE1QkEsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQjthQUN4QyxTQUFTLENBQ1Qsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFDckMsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLGVBQWUsQ0FDcEI7YUFDQSxHQUFHLEVBQUUsQ0FBQztRQUVSLElBQU0sU0FBUyxHQUFpQyxFQUFFLENBQUM7UUFFbkQsS0FBc0IsVUFBUSxFQUFSLHFCQUFRLEVBQVIsc0JBQVEsRUFBUixJQUFRLEVBQUU7WUFBM0IsSUFBTSxPQUFPO1lBQ2pCLFNBQVMsQ0FBQyxJQUFJLENBQ2IsSUFBSTtpQkFDRixvQkFBb0IsQ0FBQyxPQUFPLENBQUM7aUJBQzdCLElBQUksQ0FDSixnQkFBTTtnQkFDTCxJQUFJLEtBQUksQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUU7b0JBQzdDLEtBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztpQkFDckQ7Z0JBRUQsT0FBTyxNQUFNLENBQUM7WUFDZixDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCLENBQ0YsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsbUNBQW1DO0lBQzNCLCtDQUFvQixHQUE1QixVQUNDLGVBQXdDO1FBRHpDLGlCQThJQztRQTNJQSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQzthQUNwRSxJQUFJLENBQ0osa0JBQVE7WUFDUCxJQUFNLFlBQVksR0FBRyxLQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFMUQsSUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNqQyxJQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN0RCxJQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBRTFDLEtBQUssSUFBTSxRQUFRLElBQUksV0FBVyxFQUFFO2dCQUNuQyxJQUFNLGVBQWUsR0FBRyxLQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUM1RCxRQUFRLEVBQ1IsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQ3pDLGVBQWUsQ0FDZixDQUFDO2dCQUVGLEtBQUssSUFBTSxNQUFNLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMzQyxJQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2hELElBQU0sU0FBUyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQ2pDLFFBQVEsRUFDUixRQUFRLENBQ1AsTUFBTSxFQUNOLEVBQUUsQ0FDRixFQUNELFdBQVcsQ0FDWCxDQUFDO29CQUVGLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTt3QkFDNUIsT0FBTyxDQUFDLElBQUksQ0FDWCxnQkFBZ0IsRUFDaEIsU0FBUyxDQUNULENBQUM7d0JBRUYsU0FBUztxQkFDVDtvQkFFRCx5RkFBeUY7b0JBQ3pGLElBQU0sY0FBYyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQzlELFFBQVEsRUFDUixNQUFNLENBQ0wsQ0FBQztvQkFFSCxjQUFjLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztvQkFFbEMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsQ0FDekgsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFDM0QsY0FBYyxDQUNkLENBQUM7b0JBRUYsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFFekQsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FDakQsUUFBUSxFQUNSLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FDZCxDQUFDO29CQUVGLElBQUksS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTt3QkFDeEYsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDakssT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ3JGO29CQUVELEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUM5QyxZQUFZLEVBQ1osUUFBUSxFQUNSLFNBQVMsQ0FBQyxRQUFRLEVBQ2xCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFDakIsU0FBUyxDQUFDLE9BQU8sRUFDakIsZUFBZSxDQUNmLENBQUM7aUJBQ0Y7YUFDRDtZQUVELHdCQUF3QjtZQUN4QixLQUFLLElBQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtnQkFDbkMsSUFBSSxLQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO29CQUNyRCxLQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUN4QztnQkFFRCxLQUFLLElBQU0sTUFBTSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDM0MsS0FBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0U7YUFDRDtZQUVELElBQU0saUJBQWlCLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFL0UsS0FBOEIsVUFBaUIsRUFBakIsdUNBQWlCLEVBQWpCLCtCQUFpQixFQUFqQixJQUFpQixFQUFFO2dCQUE1QyxJQUFNLGVBQWU7Z0JBQ3pCLElBQU0sUUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBRXRDLElBQUksUUFBTSxLQUFLLElBQUksRUFBRTtvQkFDcEIsSUFBTSxXQUFXLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FDbkMsUUFBTSxDQUFDLFFBQVEsRUFDZixRQUFNLENBQUMsTUFBTSxDQUNiLENBQUM7b0JBRUYsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO3dCQUM5QixRQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQzt3QkFFNUIsSUFBTSxpQkFBaUIsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUNoRixlQUFlLENBQUMsUUFBUSxFQUN4QixlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQzt3QkFFRixJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTs0QkFDakcsT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUNwSDt3QkFFRCxlQUFlLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQzlELGVBQWUsQ0FBQyxPQUFPLENBQ3ZCLENBQUM7d0JBRUYsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7NEJBQ3BDLEtBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQ3RELGVBQWUsQ0FBQyxRQUFRLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUM1QixpQkFBaUIsQ0FDakIsQ0FBQzt5QkFDRjtxQkFDRDtpQkFDRDtnQkFFRCxJQUFNLGNBQWMsR0FDbkIsZUFBZSxDQUFDLHFCQUFxQixDQUFDLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUVqRSxJQUFJLENBQUMscUNBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDbkMsU0FBUztpQkFDVDtnQkFFRCxJQUFJLGNBQWMsQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFO29CQUNwQyxLQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUN0RCxlQUFlLEVBQ2YsS0FBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FDbEQsQ0FBQztpQkFDRjthQUNEO1lBRUQsT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyxnREFBcUIsR0FBN0IsVUFDQyxXQUE4QjtRQUU5QixJQUFNLFFBQVEsR0FBeUMsRUFBRSxDQUFDO1FBRTFELEtBQUssSUFBTSxRQUFRLElBQUksV0FBVyxFQUFFO1lBQ25DLFFBQVEsQ0FBQyxJQUFJLENBQ1osSUFBSSxDQUFDLG9CQUFvQixDQUN4QixRQUFRLEVBQ1IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUNyQixDQUNELENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLCtDQUFvQixHQUE1QixVQUNDLFFBQXNCLEVBQ3RCLFdBQXdEO1FBRnpELGlCQThEQztRQTFEQSxJQUFNLE9BQU8sR0FBcUUsRUFBRSxDQUFDO1FBQ3JGLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0RSwrRkFBK0Y7UUFDL0YsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFcEYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV2Qiw2RUFBNkU7UUFDN0UsS0FBSyxJQUFNLE1BQU0sSUFBSSxXQUFXLEVBQUU7WUFDakMsSUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLElBQU0sV0FBVyxHQUFRLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEQsSUFBTSxVQUFVLEdBQUcsK0JBQU8sQ0FDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFDckM7Z0JBQ0MsUUFBUTtnQkFDUixNQUFNO2FBQ04sQ0FDRCxDQUFDO1lBRUYsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFM0UsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO2dCQUM3QixXQUFXLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQzthQUNwQztZQUVELGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXpDLG1CQUFtQjtZQUNuQixpQkFBaUIsQ0FBQyxNQUFNLENBQ3ZCLFNBQVMsRUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FDOUQsQ0FBQztTQUNGO1FBRUQsSUFBTSwyQkFBMkIsR0FBRyxpQkFBaUIsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBRXZGLEtBQXlCLFVBQTJCLEVBQTNCLDJEQUEyQixFQUEzQix5Q0FBMkIsRUFBM0IsSUFBMkIsRUFBRTtZQUFqRCxJQUFNLFVBQVU7WUFDcEIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUM7UUFFRCxJQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUUvQyxPQUFPLElBQUksQ0FBQyxpQkFBaUI7YUFDM0IsV0FBVyxDQUNYLFFBQVEsRUFDUixPQUFPLEVBQ1AsaUJBQWlCLENBQ2pCO2FBQ0EsSUFBSSxDQUNKLGtCQUFRLElBQUksWUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzNDLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsSUFBSSxFQUNKLEtBQUssQ0FDTCxFQUxXLENBS1gsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyxnREFBcUIsR0FBN0IsVUFDQyxXQUE4QjtRQUU5QixJQUFNLFFBQVEsR0FBa0MsRUFBRSxDQUFDO1FBRW5ELHlCQUF5QjtRQUN6QixLQUFLLElBQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtZQUNuQyxRQUFRLENBQUMsSUFBSSxDQUNaLElBQUksQ0FBQyxvQkFBb0IsQ0FDeEIsUUFBUSxFQUNSLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FDckIsQ0FDRCxDQUFDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTywrQ0FBb0IsR0FBNUIsVUFDQyxRQUFzQixFQUN0QixXQUEyQztRQUY1QyxpQkE2Q0M7UUF6Q0EsT0FBTyxJQUFJLENBQUMsaUJBQWlCO2FBQzNCLE1BQU0sQ0FDTixRQUFRLEVBQ1IsV0FBVyxDQUFDLEdBQUcsQ0FDZCxlQUFLLElBQUksWUFBSyxDQUFDLE1BQU0sRUFBWixDQUFZLENBQ3JCLENBQ0Q7YUFDQSxJQUFJLENBQ0osa0JBQVE7WUFDUCxJQUFNLFlBQVksR0FBRyxLQUFJLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUV2RSxJQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLElBQU0sc0JBQXNCLEdBQWdCLEVBQUUsQ0FBQztZQUUvQyxLQUF3QixVQUFXLEVBQVgsMkJBQVcsRUFBWCx5QkFBVyxFQUFYLElBQVcsRUFBRTtnQkFBaEMsSUFBTSxTQUFTO2dCQUNuQixJQUNDLENBQUMsK0JBQU8sQ0FDUCxTQUFTLENBQUMsTUFBTSxFQUNoQixlQUFlLENBQ2YsRUFDQTtvQkFDRCxPQUFPLENBQUMsSUFBSSxDQUNYLGdCQUFnQixFQUNoQixTQUFTLENBQ1QsQ0FBQztvQkFFRixTQUFTO2lCQUNUO2dCQUVELHNCQUFzQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN2QztZQUVELFlBQVksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUVyRCxPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQzdDLFlBQVksRUFDWixJQUFJLENBQ0osQ0FBQztRQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyw4Q0FBbUIsR0FBM0IsVUFDQyxXQUE0QjtRQUQ3QixpQkE2REM7UUExREEsSUFBTSxRQUFRLEdBQWtDLEVBQUUsQ0FBQztRQUVuRCxJQUFNLGtCQUFrQixHQUFHLFVBQzFCLFVBQW9CLEVBQ3BCLFFBQWdCO1lBRWhCLDZDQUE2QztZQUM3QyxJQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxJQUFNLFdBQVcsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUNuQyxVQUFVLEVBQ1YsUUFBUSxDQUNSLENBQUM7WUFFRixRQUFRLENBQUMsSUFBSSxDQUNaLEtBQUksQ0FBQyxpQkFBaUI7aUJBQ3BCLFNBQVMsQ0FDVCxVQUFVLEVBQ1YsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQ2xELEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUN6QztpQkFDQSxJQUFJLENBQ0o7Z0JBQ0MsSUFBTSxZQUFZLEdBQUcsS0FBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBRXZFLDhDQUE4QztnQkFDOUMsS0FBd0IsVUFBa0IsRUFBbEIseUNBQWtCLEVBQWxCLGdDQUFrQixFQUFsQixJQUFrQixFQUFFO29CQUF2QyxJQUFNLFNBQVM7b0JBQ25CLFlBQVksQ0FBQyxjQUFjLENBQzFCLFNBQVMsRUFDVCxLQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQzFDO3dCQUNDLFFBQVEsRUFBRSxVQUFVO3dCQUNwQixNQUFNLEVBQUUsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRO3FCQUMxRCxFQUNELFNBQVMsQ0FBQyxRQUFRLENBQ2xCLENBQ0QsQ0FBQztpQkFDRjtnQkFFRCxPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQzdDLFlBQVksRUFDWixJQUFJLENBQ0osQ0FBQztZQUNILENBQUMsRUFDRCxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FDRixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsS0FBSyxJQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUU7WUFDckMsS0FBSyxJQUFNLFFBQVEsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQy9DLGtCQUFrQixDQUNqQixVQUFVLEVBQ1YsQ0FBQyxRQUFRLENBQ1QsQ0FBQzthQUNGO1NBQ0Q7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRix1QkFBQztBQUFELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsZ0IwRDtBQVFuQjtBQUt4QztJQUtDLHlCQUNXLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxjQUF1QyxFQUN2QyxZQUFtQyxFQUNuQyw2QkFBNEQsRUFDdEUsZ0JBQWtDLEVBQ3hCLFdBQTBCO1FBUDFCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7UUFDdkMsaUJBQVksR0FBWixZQUFZLENBQXVCO1FBQ25DLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBK0I7UUFFNUQsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFFcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUF5REQ7Ozs7Ozs7O09BUUc7SUFDSSwwQ0FBZ0IsR0FBdkIsVUFDQyxTQUFvQixFQUNwQixVQUFvQjtRQUVwQixJQUFJLGdCQUFnQixHQUEwQixTQUFTLENBQUM7UUFDeEQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXhGLEtBQXVCLFVBQVUsRUFBVix5QkFBVSxFQUFWLHdCQUFVLEVBQVYsSUFBVSxFQUFFO1lBQTlCLElBQU0sUUFBUTtZQUNsQixJQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXRGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFXLFFBQVEseURBQXNELENBQUMsQ0FBQzthQUMzRjtZQUVELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBVyxRQUFRLDREQUF5RCxDQUFDLENBQUM7YUFDOUY7WUFFRCxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFaEMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUNwQixPQUFPLFNBQVMsQ0FBQzthQUNqQjtZQUVELGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQzVELE1BQU0sQ0FBQyxRQUFRLEVBQ2YsTUFBTSxDQUNOLENBQUM7WUFFRixJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBcUIsTUFBTSxDQUFDLFFBQVEsU0FBSSxNQUFNLHVCQUFvQixDQUFDLENBQUM7YUFDcEY7WUFFRCxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FDbEQsZ0JBQWdCLENBQUMsRUFBRSxFQUNuQixLQUFLLENBQ0wsQ0FBQztTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kseUNBQWUsR0FBdEIsVUFDQyxTQUFvQixFQUNwQixVQUE2QjtRQUU3QixJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUNuQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMzRDtRQUVELElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkMsU0FBUyxFQUNULFVBQVUsQ0FBQyxLQUFLLENBQ2YsQ0FBQyxFQUNELENBQUMsQ0FBQyxDQUNGLENBQ0QsQ0FBQztRQUVGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN6QixPQUFPLFNBQVMsQ0FBQztTQUNqQjtRQUVELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHdDQUFjLEdBQXJCLFVBQXVCLEtBQWdCO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxvREFBMEIsR0FBakMsVUFDQyxXQUEyQyxFQUMzQyxVQUFvQyxFQUNwQyxZQUErQjtRQUhoQyxpQkF1RUM7UUFsRUEsSUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUV6QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsQztRQUVELElBQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLG1HQUFtRyxDQUFDLENBQUM7U0FDckg7UUFFRCxJQUFNLFNBQVMsR0FBdUQsRUFBRSxDQUFDO1FBRXpFLEtBQXdCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO1lBQWhDLElBQU0sU0FBUztZQUNuQixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ3BDLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxDQUNaLENBQUM7WUFFRixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLFNBQVM7YUFDVDtZQUVELElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUN2QjtZQUVELFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEM7UUFFRCxJQUFJLENBQUMscUNBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbEM7UUFFRCxJQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFFN0IsS0FBSyxJQUFNLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsSUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO1FBRS9CLEtBQXFCLFVBQVksRUFBWiw2QkFBWSxFQUFaLDBCQUFZLEVBQVosSUFBWSxFQUFFO1lBQTlCLElBQU0sTUFBTTtZQUNoQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxQjtRQUVELDJEQUEyRDtRQUUzRCxPQUFPLElBQUk7YUFDVCxnQkFBZ0IsQ0FDaEIsVUFBVSxDQUFDLFFBQVMsRUFDcEIsT0FBTyxFQUNQLElBQUksa0NBQWdCLENBQUMsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FDMUM7YUFDQSxJQUFJLENBQ0o7WUFDQyxPQUFPLEtBQUksQ0FBQyxvQkFBb0IsQ0FDL0IsV0FBVyxFQUNYLFlBQVksRUFDWixZQUFZLENBQ1osQ0FBQztRQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTSw4Q0FBb0IsR0FBM0IsVUFDQyxXQUEyQyxFQUMzQyxPQUF3QyxFQUN4QyxZQUErQjtRQUUvQixJQUFNLFFBQVEsR0FBaUMsRUFBRSxDQUFDO1FBRWxELEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixRQUFRLENBQUMsSUFBSSxDQUNaLElBQUksQ0FBQywwQkFBMEIsQ0FDOUIsV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLENBQ1osQ0FDRCxDQUFDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUN0QyxJQUFJLENBQ0osY0FBTSxrQkFBVyxFQUFYLENBQVcsRUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ08seUNBQWUsR0FBekIsVUFDQyxXQUF3QztRQUV4QyxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUNoRCxXQUFXLENBQUMsTUFBTSxFQUNsQixXQUFXLENBQUMsT0FBTyxDQUNuQixDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFNUIsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLDJDQUFpQixHQUEzQixVQUNDLFNBQWtDLEVBQ2xDLE1BQWdDLEVBQ2hDLFlBQStCO1FBRS9CLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDbkYsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0RTtZQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdFO1FBRUQsNERBQTREO1FBQzVELDBIQUEwSDtRQUUxSCxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQzFDLFNBQVMsRUFDVCxNQUFNLENBQUMsTUFBTyxFQUNkLFlBQVksQ0FDWixDQUFDO1FBRUYsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FDakUsTUFBTSxDQUFDLE1BQU8sQ0FBQyxRQUFTLEVBQ3hCLFlBQVksQ0FDWCxDQUFDO1FBRUgsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN6RixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVTLDREQUFrQyxHQUE1QyxVQUNDLFFBQWtCLEVBQ2xCLGNBQWtDO1FBRWxDLElBQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRTlFLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUNqQyxzQkFBc0IsQ0FBQyx3QkFBd0IsQ0FDOUMsUUFBUSxFQUNSLGNBQWMsQ0FDZCxDQUFDO1NBQ0Y7UUFFRCxJQUFNLG9CQUFvQixHQUFHLFVBQUMsV0FBMEI7WUFDdkQsSUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV4RixLQUE4QixVQUFpQixFQUFqQix1Q0FBaUIsRUFBakIsK0JBQWlCLEVBQWpCLElBQWlCLEVBQUU7Z0JBQTVDLElBQU0sZUFBZTtnQkFDekIsc0JBQXNCLENBQUMsd0JBQXdCLENBQzlDLFFBQVEsRUFDUixlQUFlLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FDcEMsQ0FBQztnQkFFRixnSEFBZ0g7Z0JBQ2hILHNCQUFzQixDQUFDLHdCQUF3QixDQUM5QyxRQUFRLEVBQ1IsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQy9CLENBQUM7YUFDRjtRQUNGLENBQUMsQ0FBQztRQUVGLElBQU0sdUNBQXVDLEdBQUcsVUFBQyxRQUF5QjtZQUN6RSxLQUEwQixVQUFRLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVEsRUFBRTtnQkFBL0IsSUFBTSxXQUFXO2dCQUNyQixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbEMsdUNBQXVDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlEO1FBQ0YsQ0FBQyxDQUFDO1FBRUYsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEUsS0FBMEIsVUFBZ0IsRUFBaEIscUNBQWdCLEVBQWhCLDhCQUFnQixFQUFoQixJQUFnQixFQUFFO1lBQXZDLElBQU0sV0FBVztZQUNyQixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNsQztRQUVELHVDQUF1QyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkUsT0FBTyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0Ysc0JBQUM7QUFBRCxDQUFDOzs7OztBQzdYNkQ7QUF5QnpDO0FBQ2dDO0FBU3JEOzs7O0dBSUc7QUFDSDtJQUNTLHVFQUFlO0lBZXZCLGdDQUNTLFlBQXVELEVBQ3JELFdBQTZCLEVBQy9CLFNBQWdDO1FBSHpDLFlBS0Msa0JBQ0MsWUFBWSxDQUFDLFVBQVUsRUFDdkIsWUFBWSxDQUFDLFlBQVksRUFDekIsWUFBWSxDQUFDLGdCQUFnQixFQUM3QixZQUFZLENBQUMsY0FBYyxFQUMzQixZQUFZLENBQUMsWUFBWSxFQUN6QixZQUFZLENBQUMsNkJBQTZCLEVBQzFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsV0FBVyxDQUNYLFNBQ0Q7UUFkUSxrQkFBWSxHQUFaLFlBQVksQ0FBMkM7UUFDckQsaUJBQVcsR0FBWCxXQUFXLENBQWtCO1FBQy9CLGVBQVMsR0FBVCxTQUFTLENBQXVCO1FBaEJ6Qyx5R0FBeUc7UUFDbEcsa0JBQVksR0FBNkIsRUFBRSxDQUFDO1FBRTVDLGlCQUFXLEdBRWQsRUFBRSxDQUFDO1FBRUEsMEJBQW9CLEdBSXZCLEVBQUUsQ0FBQzs7SUFpQlAsQ0FBQztJQUVNLDREQUEyQixHQUFsQyxVQUNDLFFBQXNCLEVBQ3RCLE1BQWMsRUFDZCxRQUEyQztRQUg1QyxpQkF1Q0M7UUFsQ0Esa0NBQVUsQ0FDVCxJQUFJLENBQUMsb0JBQW9CLEVBQ3pCO1lBQ0MsUUFBUTtZQUNSLE1BQU07U0FDTixFQUNEO1lBQ0MsRUFBRTtZQUNGLEVBQUU7U0FDRixDQUNELENBQUM7UUFFRixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNELE9BQU87WUFDTixJQUFNLEtBQUssR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTVFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNqQixPQUFPO2FBQ1A7WUFFRCxLQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNqRCxLQUFLLEVBQ0wsQ0FBQyxDQUNELENBQUM7WUFFRixJQUFJLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM3RCxPQUFPLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuRDtZQUVELElBQUksQ0FBQyxxQ0FBYSxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO2dCQUN4RCxPQUFPLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMzQztRQUNGLENBQUMsQ0FBQztJQUNILENBQUM7SUFFTSxnRUFBK0IsR0FBdEMsVUFDQyxnQkFBNkMsRUFDN0MsS0FBZ0I7UUFFaEIsT0FBTztZQUNOLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDcEMsZ0JBQWdCLENBQUMsT0FBTyxFQUN4QixFQUFFLEVBQ0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2xCO1lBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUNwQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQ3hCLEVBQUUsRUFDRixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDbEI7U0FDRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdEQUFlLEdBQXRCLFVBQ0MsV0FBd0M7UUFFeEMsSUFBTSxTQUFTLEdBQUcsaUJBQU0sZUFBZSxZQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXZGLEtBQUssSUFBTSxRQUFRLElBQUksbUJBQW1CLEVBQUU7WUFDM0MsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM3RDtRQUVELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMzQyxXQUFXLENBQUMsTUFBTSxFQUNsQixFQUFFLEVBQ0YsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3hCLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRztZQUNoQyxPQUFPLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDM0IsT0FBTyxFQUFFLE9BQU87U0FDaEIsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFN0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FDMUIsU0FBUyxFQUNULFdBQVcsQ0FBQyxNQUFNLEVBQ2xCLFdBQVcsQ0FBQyxNQUFNLENBQ2xCLENBQUM7U0FDRjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSSw4Q0FBYSxHQUFwQixVQUNDLEtBQW9CO1FBRXBCLElBQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRXZDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUNsQyxXQUFXLENBQ1gsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQ2xDLFdBQVcsQ0FDWCxDQUFDO0lBQ0gsQ0FBQztJQUVNLDhDQUFhLEdBQXBCO1FBQ0Msd0ZBQXdGO1FBQ3hGLEtBQUssSUFBTSxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6RCxPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3pDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxPQUFPLElBQUksQ0FBQzthQUNaO1NBQ0Q7UUFFRCxLQUFLLElBQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0MsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBRWhFLElBQUksVUFBVSxFQUFFO2dCQUNmLE9BQU8sSUFBSSxDQUFDO2FBQ1o7U0FDRDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxtREFBa0IsR0FBekIsVUFBMkIsV0FBNEI7UUFDdEQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUUsQ0FBQztRQUNuRSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQ2xDLE9BQU8sQ0FBQyxPQUFPLEVBQ2YsT0FBTyxDQUFDLE9BQU8sRUFDZixTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdEIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSx3REFBdUIsR0FBOUIsVUFDQyxxQkFBZ0UsRUFDaEUsY0FBK0IsRUFDL0IsYUFBOEIsRUFDOUIseUJBQTBDLEVBQzFDLDRCQUE2QztRQUw5QyxpQkE0R0M7UUExR0EsdURBQStCO1FBQy9CLHFEQUE4QjtRQUM5Qiw2RUFBMEM7UUFDMUMsbUZBQTZDOztRQUU3QyxJQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFDOUMsSUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDO1FBRTlDLDRFQUE0RTtRQUM1RSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNqRCxJQUFJLENBQUMsNEJBQTRCLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDO2FBQ1o7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRztnQkFDaEMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzthQUNqRSxDQUFDO1NBQ0Y7UUFFRCxJQUFJLE9BQU8sQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQ3JDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7U0FDbkQ7UUFFRCxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVwRCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDNUMsWUFBWSxDQUFDLE9BQU8sRUFDcEIsRUFBRSxFQUNGLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixDQUFDO1FBRUYsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDcEQsT0FBTyxDQUFDLE1BQU0sRUFDZCxZQUFZLENBQUMsT0FBTyxFQUNwQixTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFDdEIsSUFBSSxDQUNKLENBQUM7UUFFRixJQUFJLGNBQWMsRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDM0IsT0FBTyxDQUFDLE1BQU0sRUFDZCxZQUFZLENBQUMsT0FBTyxFQUNwQixTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdEIsQ0FBQztTQUNGO2FBQU07WUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FDaEMsWUFBWSxDQUFDLE9BQU8sRUFDcEIsWUFBWSxDQUFDLE9BQU8sRUFDcEIsT0FBTyxDQUFDLE1BQU0sRUFDZCxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdEIsQ0FBQztTQUNGO1FBRUQsSUFBSSxhQUFhLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQzNCLE9BQU8sQ0FBQyxNQUFNLEVBQ2QsWUFBWSxDQUFDLE9BQU8sRUFDcEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3RCLENBQUM7U0FDRjtRQUVELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzdDLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUN2RSxTQUFTLEVBQ1QsWUFBWSxDQUFDLE9BQU8sQ0FDcEIsQ0FBQztZQUVGLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtnQkFDakMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO2FBQ2xEO1NBQ0Q7UUFFRCxJQUFJLGdCQUFnQixFQUFFO1lBQ3JCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUMxQixTQUFTLEVBQ1QsWUFBWSxDQUFDLE9BQU8sRUFDcEIsUUFBUSxDQUNSLENBQUM7YUFDRjtZQUVELElBQU0saUJBQWlCLFNBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsMENBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTVGLElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO2dCQUNwQyxLQUF1QixVQUFpQixFQUFqQix1Q0FBaUIsRUFBakIsK0JBQWlCLEVBQWpCLElBQWlCLEVBQUU7b0JBQXJDLElBQU0sUUFBUTtvQkFDbEIsSUFBSTt3QkFDSCxRQUFRLENBQ1AsU0FBUyxFQUNULGtCQUFRLElBQUksWUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQzFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQzdELFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQzlCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FDbEIsRUFKVyxDQUlYLEVBQ0QsWUFBWSxDQUFDLE9BQU8sRUFDcEIseUJBQXlCLEVBQ3pCLFFBQVEsQ0FDUixDQUFDO3FCQUNGO29CQUFDLE9BQU8sS0FBSyxFQUFFO3dCQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzFDO2lCQUNEO2FBQ0Q7U0FDRDtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxpREFBZ0IsR0FBdkIsVUFDQyxZQUEwQixFQUMxQixXQUEyQyxFQUMzQyxhQUF1QyxFQUN2QyxvQkFBMkM7UUFEM0Msa0RBQXVDO1FBR3ZDLCtFQUErRTtRQUMvRSxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLHdCQUF3QixDQUM5RCxXQUFXLEVBQ1gsYUFBYSxDQUNiLENBQUM7UUFFRixJQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsS0FBd0IsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7WUFBaEMsSUFBTSxTQUFTO1lBQ25CLElBQUksQ0FBQyxjQUFjLENBQ2xCLFlBQVksRUFDWixTQUFTLEVBQ1QsYUFBYSxFQUNiLG9CQUFvQixDQUNwQixDQUFDO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTSwrQ0FBYyxHQUFyQixVQUNDLFlBQTBCLEVBQzFCLFdBQW9DLEVBQ3BDLGFBQXVDLEVBQ3ZDLG9CQUEyQztRQUQzQyxrREFBdUM7UUFHdkMsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUNwRSxXQUFXLENBQUMsRUFBRSxDQUNkLENBQUM7UUFFRixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUMzRSxXQUFXLEVBQ1gsYUFBYSxDQUNiLENBQUM7UUFFRixJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDOUMsa0JBQWtCLEVBQ2xCLEVBQUUsRUFDRixXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDeEIsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQ3RELFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQ3hCLGFBQWEsQ0FDYixDQUFDO1FBRUYsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7WUFDdkMsb0JBQW9CLENBQ25CLFdBQVcsQ0FBQyxRQUFRLEVBQ3BCLFVBQVUsQ0FDVixDQUFDO1NBQ0Y7UUFFRCxZQUFZLENBQUMsZUFBZSxDQUMzQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsQ0FBQyxPQUFPLENBQ25CLENBQUM7UUFFRixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRU0sd0RBQXVCLEdBQTlCLFVBQ0MsUUFBc0IsRUFDdEIsS0FBZSxFQUNmLFlBQThCO1FBRTlCLE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDckIsY0FBYyxFQUFFO2FBQ2hCLFdBQVc7YUFDWCx1QkFBdUIsQ0FDdkIsUUFBUSxFQUNSLEtBQUssRUFDTCxZQUFZLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFTSwrQ0FBYyxHQUFyQixVQUNDLFFBQXNCLEVBQ3RCLE1BQWMsRUFDZCxPQUF5QjtRQUgxQixpQkFnRUM7UUEzREEsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNwRCxPQUFPLElBQUksQ0FBQyxXQUFXO2lCQUNyQixjQUFjLEVBQUU7aUJBQ2hCLFdBQVc7aUJBQ1gsY0FBYyxDQUNkLFFBQVEsRUFDUixNQUFNLEVBQ04sT0FBTyxDQUNQLENBQUM7U0FDSDtRQUVELElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNuQyxRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7UUFFRixJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sWUFBWSx1QkFBVyxFQUFFO2dCQUNuRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUN4RSxDQUFDO2FBQ0Y7WUFFRCxrSUFBa0k7WUFDbEksd0ZBQXdGO1lBQ3hGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FDeEQsUUFBUSxFQUNSLE1BQU0sRUFDTixPQUFPLENBQ1AsQ0FBQztTQUNGO1FBRUQsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQ3hELFFBQVEsRUFDUixPQUFPLENBQUMsT0FBTyxDQUNmLENBQUM7UUFFRixJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZFLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWhHLE9BQU8sSUFBSTthQUNULHVCQUF1QixDQUN2QixZQUFZLEVBQ1osUUFBUSxFQUNSLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsT0FBTyxDQUNQO2FBQ0EsSUFBSSxDQUNKLG1CQUFTO1lBQ1IsT0FBTyxLQUFJLENBQUMsV0FBVztpQkFDckIsaUJBQWlCLENBQUMsWUFBWSxDQUFDO2lCQUMvQixJQUFJLENBQ0osY0FBTSxnQkFBUyxFQUFULENBQVMsRUFDZixLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztRQUNKLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxrREFBaUIsR0FBeEIsVUFDQyxRQUFzQixFQUN0QixNQUFjLEVBQ2QsT0FBeUI7O1FBSDFCLGlCQStGQztRQTFGQSxJQUNDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNmLFFBQVEsRUFDUixNQUFNLENBQ04sS0FBSyxTQUFTLEVBQ2Q7WUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUN6RSxDQUFDO1NBQ0Y7UUFFRCxJQUFJLGtCQUFzQyxDQUFDO1FBRTNDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhO2FBQ3BDLGFBQWEsQ0FDYixRQUFRLEVBQ1IsTUFBTSxFQUNOLE9BQU8sQ0FBQyxlQUFlLFlBQ3RCLEdBQUMsUUFBUSxJQUFHLE9BQU8sQ0FBQyxPQUFPLE9BQzVCLE9BQU8sQ0FBQyxNQUFNLENBQ2Q7YUFDQSxJQUFJLENBQ0osa0JBQVE7WUFDUCw0RkFBNEY7WUFDNUYsSUFDQyxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDZixRQUFRLEVBQ1IsTUFBTSxDQUNOLEtBQUssU0FBUyxFQUNkO2dCQUNELE9BQU8sS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQzlCLEtBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQ3pFLENBQUM7YUFDRjtZQUVELElBQU0sWUFBWSxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFdkUsS0FBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQ2xELFlBQVksRUFDWixRQUFRLEVBQ1IsTUFBTSxFQUNOLE9BQU8sQ0FBQyxNQUFNLEVBQ2QsUUFBUSxDQUNSLENBQUM7WUFFRixPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekQsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN4QjthQUNBLElBQUksQ0FDSiw2QkFBbUI7WUFDbEIsa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7WUFFekMsSUFBTSx3QkFBd0IsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNqRSxVQUNDLEdBQTZCLEVBQzdCLFNBQW9CO2dCQUVwQixJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQzVDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUM3QjtnQkFFRCxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFeEMsT0FBTyxHQUFHLENBQUM7WUFDWixDQUFDLEVBQ0QsRUFBRSxDQUNGLENBQUM7WUFFRixJQUFNLFlBQVksR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDM0QsSUFBTSxRQUFRLEdBQWlDLEVBQUUsQ0FBQztZQUVsRCxLQUFLLElBQU0sV0FBVyxJQUFJLHdCQUF3QixFQUFFO2dCQUNuRCxRQUFRLENBQUMsSUFBSSxDQUNaLEtBQUksQ0FBQyxvQkFBb0IsQ0FDeEIsd0JBQXdCLENBQUMsV0FBVyxDQUFDLEVBQ3JDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQ3JELFlBQVksQ0FDWixDQUNELENBQUM7YUFDRjtZQUVELE9BQU8sS0FBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUNEO2FBQ0EsSUFBSSxDQUNKO1lBQ0MsT0FBTyxrQkFBa0IsQ0FBQztRQUMzQixDQUFDLENBQ0QsQ0FBQztJQUNKLENBQUM7SUFFTSxpREFBZ0IsR0FBdkIsVUFDQyxRQUFzQixFQUN0QixPQUFpQixFQUNqQixPQUF5QjtRQUV6QixJQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7UUFDbkMsSUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1FBRWxDLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbkQsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMxQjtpQkFBTTtnQkFDTixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCO1NBQ0Q7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3hCLEdBQUcsQ0FBQztZQUNKLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztpQkFDdEIsY0FBYyxFQUFFO2lCQUNoQixXQUFXO2lCQUNYLGdCQUFnQixDQUNoQixRQUFRLEVBQ1IsYUFBYSxFQUNiLE9BQU8sQ0FDUDtZQUNGLEtBQUssRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQ2hDLFFBQVEsRUFDUixZQUFZLEVBQ1osT0FBTyxDQUNQO1NBQ0QsQ0FBQzthQUNELElBQUksQ0FDSixnQkFBTTtZQUNMLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FDRCxDQUFDO0lBQ0osQ0FBQztJQUVELHlDQUF5QztJQUNsQywyQ0FBVSxHQUFqQixVQUNDLFFBQWtCLEVBQ2xCLE1BQWM7UUFGZixpQkF5QkM7UUFyQkEsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUUsT0FBTyxJQUFJO2FBQ1QsY0FBYyxDQUNkLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxrQ0FBZ0IsQ0FBQztZQUNwQixPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUM7U0FDckIsQ0FBQyxDQUNGO2FBQ0EsSUFBSSxDQUNKLG1CQUFTO1lBQ1IsSUFBTSxPQUFPLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FDekQsU0FBUyxDQUFDLEVBQUUsRUFDWixLQUFLLENBQ0wsQ0FBQztZQUVGLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTSxzREFBcUIsR0FBNUIsVUFDQyxZQUEwQixFQUMxQixTQUFrQyxFQUNsQyxpQkFBa0QsRUFDbEQsT0FBeUI7UUFKMUIsaUJBb0NDO1FBOUJBLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM3QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ2hELFNBQVMsRUFDVCxPQUFPLENBQUMsT0FBTyxDQUNmLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYTthQUNwQyxLQUFLLENBQ0wsU0FBUyxDQUFDLFFBQVEsRUFDbEIsZ0JBQWdCLENBQ2hCO2FBQ0EsSUFBSSxDQUNKLHlCQUFlO1lBQ2QsT0FBTyxLQUFJLENBQUMsc0JBQXNCLENBQ2pDLFlBQVksRUFDWixTQUFTLENBQUMsUUFBUSxFQUNsQixDQUFDLFNBQVMsQ0FBQyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLENBQ2YsQ0FBQztRQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEI7YUFDQSxJQUFJLENBQ0osY0FBTSxnQkFBUyxFQUFULENBQVMsRUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTSx1REFBc0IsR0FBN0IsVUFDQyxZQUE4QixFQUM5QixRQUFzQixFQUN0QixXQUEyQyxFQUMzQyxjQUFpQyxFQUNqQyxlQUEwQztRQUUxQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDN0M7UUFFRCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDekUsUUFBUSxFQUNSLGNBQWMsRUFDZCxlQUFlLENBQ2YsQ0FBQztRQUVGLEtBQXdCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO1lBQWhDLElBQU0sU0FBUztZQUNuQixJQUFNLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUvRCxJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUU7Z0JBQzdCLFNBQVM7YUFDVDtZQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FDeEIsWUFBWSxFQUNaLFNBQVMsRUFDVCxlQUFlLENBQ2YsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQy9CLFdBQVcsRUFDWCxlQUFlLENBQUMsb0JBQW9CLEVBQUUsRUFDdEMsWUFBWSxDQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0RBQXVCLEdBQTlCLFVBQ0MsWUFBMEIsRUFDMUIsUUFBc0IsRUFDdEIsTUFBYyxFQUNkLGlCQUFrRCxFQUNsRCxPQUF5QjtRQUV6QixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDbkMsUUFBUSxFQUNSLE1BQU0sQ0FDTixDQUFDO1FBRUYsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQ3hFLENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUNoQyxZQUFZLEVBQ1osV0FBVyxFQUNYLGlCQUFpQixFQUNqQixPQUFPLENBQ1AsQ0FBQztJQUNILENBQUM7SUFFTSxzREFBcUIsR0FBNUIsVUFDQyxRQUFzQixFQUN0QixPQUFpQixFQUNqQixPQUF5QjtRQUgxQixpQkErRUM7UUExRUEsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQ3hELFFBQVEsRUFDUixPQUFPLENBQUMsT0FBTyxDQUNmLENBQUM7UUFFRixJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZFLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hHLElBQU0sUUFBUSxHQUFpQyxFQUFFLENBQUM7UUFFbEQsSUFBTSwwQkFBMEIsR0FBYSxFQUFFLENBQUM7UUFFaEQsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBekIsSUFBTSxNQUFNO1lBQ2hCLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNuQyxRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7WUFFRixJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLFlBQVksdUJBQVcsRUFBRTtvQkFDbkQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FDeEUsQ0FBQztpQkFDRjtnQkFFRCxrSUFBa0k7Z0JBQ2xJLHdGQUF3RjtnQkFDeEYsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUV4QyxTQUFTO2FBQ1Q7WUFFRCxRQUFRLENBQUMsSUFBSSxDQUNaLElBQUksQ0FBQyx1QkFBdUIsQ0FDM0IsWUFBWSxFQUNaLFFBQVEsRUFDUixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLE9BQU8sQ0FDUCxDQUNELENBQUM7U0FDRjtRQUVELElBQUksMEJBQTBCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxZQUFZLHVCQUFXLEVBQUU7Z0JBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQzthQUN0RTtZQUVELFFBQVEsQ0FBQyxJQUFJLENBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUEyQixDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FDOUUsUUFBUSxFQUNSLDBCQUEwQixFQUMxQixPQUFPLENBQ1AsQ0FDRCxDQUFDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjO2FBQ3hCLEdBQUcsQ0FBQyxRQUFRLENBQUM7YUFDYixJQUFJLENBQ0o7WUFDQyxPQUFPLEtBQUksQ0FBQyxXQUFXO2lCQUNyQixpQkFBaUIsQ0FBQyxZQUFZLENBQUM7aUJBQy9CLElBQUksQ0FDSixjQUFNLGNBQU8sQ0FBQyxHQUFHLENBQ2hCLGdCQUFNLElBQUksWUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FDbkQsUUFBUSxFQUNSLE1BQU0sQ0FDTCxFQUhRLENBR1IsQ0FDRixFQUxLLENBS0wsRUFDRCxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztRQUNKLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyxvREFBbUIsR0FBM0IsVUFDQyxTQUF5QixFQUN6QixjQUFpQztRQUVqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQ3pDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUN6QixjQUFjLENBQ2QsQ0FBQyxVQUFVLENBQUM7SUFDZCxDQUFDO0lBRU8scURBQW9CLEdBQTVCLFVBQ0MsWUFBOEIsRUFDOUIsS0FBb0IsRUFDcEIscUJBQXVFO1FBRXZFLElBQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFFMUQsS0FBSyxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUM7UUFFN0MsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1A7UUFFRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUNqQyxLQUFLLEVBQ0wsV0FBVyxDQUNYLENBQUM7UUFFRixJQUFJLENBQUMscUNBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixPQUFPO1NBQ1A7UUFFRCxZQUFZLENBQUMsY0FBYyxDQUMxQixLQUFLLEVBQ0wsTUFBTSxFQUNOLHFCQUFxQixDQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVPLCtDQUFjLEdBQXRCLFVBQ0MsS0FBb0IsRUFDcEIsT0FBcUQ7UUFFckQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLElBQU0sTUFBTSxHQUF3QyxFQUFFLENBQUM7UUFFdkQsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBekIsSUFBTSxNQUFNO1lBQ2hCLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFFM0IsMERBQTBEO1lBQzFELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsU0FBUzthQUNUO1lBRUQsSUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFFekMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFVBQVUsS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDL0M7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFDRiw2QkFBQztBQUFELENBQUMsQ0F2M0JRLCtCQUFlLEdBdTNCdkI7Ozs7QUNuNUJpRTtBQUV5QztBQUczRztJQVNDLHVCQUNXLFlBQThDLEVBQ2pELElBQVk7UUFEVCxpQkFBWSxHQUFaLFlBQVksQ0FBa0M7UUFDakQsU0FBSSxHQUFKLElBQUksQ0FBUTtRQVRiLGFBQVEsR0FBdUIsRUFBRSxDQUFDO0lBV3pDLENBQUM7SUFFTSxtQ0FBVyxHQUFsQixVQUNDLEVBQVcsRUFDWCxnQkFBOEM7UUFFOUMsSUFBTSxXQUFXLEdBQUcsSUFBSSxpQ0FBZ0IsQ0FDdkMsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLEVBQ0osRUFBRSxFQUNGLGdCQUFnQixDQUNoQixDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFaEMsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQztJQUVNLHNDQUFjLEdBQXJCLFVBQXVCLEtBQXVCO1FBQzdDLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNuQixLQUFLLEVBQ0wsQ0FBQyxDQUNELENBQUM7U0FDRjtJQUNGLENBQUM7SUFhRDs7O09BR0c7SUFDSSwyQ0FBbUIsR0FBMUI7UUFDQyxJQUFNLFlBQVksR0FBb0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksV0FBVyxHQUFrQixJQUFJLENBQUM7UUFFdEMsR0FBRztZQUNGLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFL0IsbUNBQW1DO1lBQ25DLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1NBQ2pDLFFBQVEsV0FBVyxLQUFLLElBQUksRUFBRTtRQUUvQixPQUFPLFlBQVksQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksc0RBQThCLEdBQXJDO1FBQ0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxnREFBd0IsR0FBL0I7UUFDQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFzRVMsMkNBQW1CLEdBQTdCLFVBQ0MsU0FBa0MsRUFDbEMsTUFBOEI7UUFFOUIsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFFRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUNwQyxPQUFPO2dCQUNOLFFBQVEsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUTtnQkFDbkQsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDekMsQ0FBQztTQUNGO1FBRUQsSUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZFLElBQ0MsZUFBZSxDQUFDLFFBQVEsS0FBSyxTQUFTO2VBQ25DLGVBQWUsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUNwQztZQUNELE9BQU87Z0JBQ04sUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7YUFDbkIsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTywwQ0FBa0IsR0FBNUIsVUFDQyxZQUEwQjtRQUQzQixpQkE2R0M7UUF0R0EscUlBQXFJO1FBQ3JJLElBQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTVGLEtBQUssSUFBTSxRQUFRLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRTtZQUNsRCxLQUFLLElBQU0sV0FBVyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQy9ELG9CQUFvQixDQUFDLGVBQWUsQ0FDbkMsUUFBUSxFQUNSLFdBQVcsRUFDWCxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUNqRCxDQUFDO2FBQ0Y7U0FDRDtRQUVELElBQU0sY0FBYyxHQUFrQyxFQUFFLENBQUM7UUFDekQsSUFBTSxpQkFBaUIsR0FBZ0QsRUFBRSxDQUFDO1FBRTFFLDRFQUE0RTtRQUM1RSxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDM0IsZUFBSztZQUNKLElBQU0sU0FBUyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTFELGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0Isb0JBQW9CLENBQUMsY0FBYyxDQUNsQyxTQUFTLEVBQ1QsS0FBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUMxRSxDQUFDO1lBRUYsaUJBQWlCLENBQUMsSUFBSSxDQUNyQix1QkFBYSxJQUFJLG9CQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUF2QyxDQUF1QyxDQUN4RCxDQUFDO1FBQ0gsQ0FBQyxDQUNELENBQUM7Z0NBRVMsV0FBVztZQUNyQixJQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWhELElBQU0sUUFBUSxHQUFHLE9BQUssV0FBVyxDQUFDLHVCQUF1QixDQUN4RCxLQUFLLEVBQ0wsSUFBSSxFQUNKLEtBQUssRUFDTCxLQUFLLEVBQ0wsSUFBSSxDQUNKLENBQUM7WUFFRixvQkFBb0IsQ0FBQyxjQUFjLENBQ2xDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUM3QixDQUFDO1lBRUYsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO2dCQUN0QixpQkFBaUIsQ0FBQyxJQUFJLENBQ3JCLHVCQUFhLElBQUksb0JBQWEsQ0FBQyxjQUFjLENBQzVDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsUUFBUSxDQUNSLEVBSGdCLENBR2hCLENBQ0QsQ0FBQzthQUNGO1lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ2xDLG9CQUFvQixDQUFDLFlBQVksQ0FDaEMsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDcEIsQ0FBQzthQUNGO1lBRUQsMEVBQTBFO1lBQzFFLElBQUksT0FBSyxXQUFXLFlBQVksNkNBQXNCLEVBQUU7Z0JBQ3ZELElBQU0sY0FBYyxHQUFHLE9BQUssV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUUzRSxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7O2lCQUVqQztnQkFFRCxJQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFbEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ2YsY0FBYyxDQUFDLE1BQU0sQ0FDcEIsS0FBSyxFQUNMLENBQUMsQ0FDRCxDQUFDO2lCQUNGO2FBQ0Q7OztRQWpERixLQUFLLElBQU0sV0FBVyxJQUFJLFlBQVksQ0FBQyxPQUFPO29CQUFuQyxXQUFXO1NBa0RyQjtRQUVELE9BQU87WUFDTixNQUFNLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFFBQVEsRUFBRTtvQkFDVCxJQUFNLGFBQWEsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUV4RSxLQUFpQixVQUFpQixFQUFqQix1Q0FBaUIsRUFBakIsK0JBQWlCLEVBQWpCLElBQWlCLEVBQUU7d0JBQS9CLElBQU0sRUFBRTt3QkFDWixFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7cUJBQ2xCO29CQUVELE9BQU8sS0FBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO2FBQ0Q7WUFDRCxvQkFBb0I7WUFDcEIsaUJBQWlCO1NBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sMERBQWtDLEdBQTVDLFVBQ0MsWUFBMEI7UUFFMUIsSUFBTSxlQUFlLEdBQXlDLEVBQUUsQ0FBQztRQUVqRSxLQUFLLElBQU0sV0FBVyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUU7WUFDL0MsSUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRCxJQUFNLGtCQUFrQixHQUFpQixFQUFFLENBQUM7WUFFNUMsS0FBcUIsVUFBd0IsRUFBeEIsVUFBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUF4QixjQUF3QixFQUF4QixJQUF3QixFQUFFO2dCQUExQyxJQUFNLE1BQU07Z0JBQ2hCLElBQ0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7dUJBQzNDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFDN0g7b0JBQ0Qsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNoQzthQUNEO1lBRUQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxTQUFTO2FBQ1Q7WUFFRCxlQUFlLENBQUMsSUFBSSxDQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUNwQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDYixrQkFBa0I7WUFDbEIsNERBQTREO1lBQzVELFlBQVksQ0FDWixDQUNELENBQUM7U0FDRjtRQUVELCtIQUErSDtRQUMvSCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0Ysb0JBQUM7QUFBRCxDQUFDOzs7O0FDN1ZEO0lBU0MsK0JBQ1csbUJBQXdDLEVBQ3hDLFdBQTBCLEVBQzVCLG9CQUErRDtRQUY3RCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBQzVCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBMkM7UUFWOUQsUUFBRyxHQUtULEVBQUUsQ0FBQztJQU9QLENBQUM7SUFFTSxzQ0FBTSxHQUFiLFVBQ0MsU0FBd0IsRUFDeEIsTUFBMkM7UUFFM0MsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FDdEQsU0FBUyxDQUFDLFFBQVEsRUFDbEIsTUFBTSxFQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUNyQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUNsQixTQUFTLEVBQ1QseUJBQWUsSUFBSSxtQkFBWSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFyRCxDQUFxRCxDQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVNLDRDQUFZLEdBQW5CLFVBQXFCLG9CQUEwQztRQUM5RCxrRUFBa0U7UUFDbEUsS0FBSyxJQUFNLFFBQVEsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDcEQsSUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbEUsS0FBd0IsVUFBa0IsRUFBbEIseUNBQWtCLEVBQWxCLGdDQUFrQixFQUFsQixJQUFrQixFQUFFO2dCQUF2QyxJQUFNLFNBQVM7Z0JBQ25CLElBQUksQ0FBQyxPQUFPLENBQ1gsU0FBUztnQkFDVCw0RUFBNEU7Z0JBQzVFLGNBQU0sWUFBSyxFQUFMLENBQUssQ0FDWCxDQUFDO2FBQ0Y7U0FDRDtnQ0FFVSxXQUFXO1lBQ3JCLElBQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUV4RCxJQUFNLFlBQVksR0FBRyxPQUFLLG1CQUFtQixDQUFDLFNBQVMsQ0FDdEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQ3BCLEtBQUssQ0FBQyxNQUFNLEVBQ1osT0FBSyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDdkMsQ0FBQztZQUVGLE9BQUssT0FBTyxDQUNYLEtBQUssQ0FBQyxLQUFLLEVBQ1gseUJBQWU7Z0JBQ2QsSUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFbEYsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO29CQUMvQixJQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFL0QsSUFDQyxXQUFXLEtBQUssU0FBUzt3QkFDekIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUNyQjt3QkFDRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDdEQ7aUJBQ0Q7Z0JBRUQsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUQsQ0FBQyxDQUNELENBQUM7OztRQTNCSCxLQUFLLElBQU0sV0FBVyxJQUFJLG9CQUFvQixDQUFDLE9BQU87b0JBQTNDLFdBQVc7U0E0QnJCO2dDQUVVLFdBQVc7WUFDckIsSUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXRELE9BQUssT0FBTyxDQUNYLEtBQUssQ0FBQyxLQUFLLEVBQ1gseUJBQWUsSUFBSSxzQkFBZSxDQUFDLFdBQVcsQ0FDN0MsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQ2pCLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUNmLEVBSGtCLENBR2xCLENBQ0QsQ0FBQzs7O1FBVEgsS0FBSyxJQUFNLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQyxLQUFLO29CQUF6QyxXQUFXO1NBVXJCO2dDQUVVLFdBQVc7WUFDckIsSUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXhELElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFNLGFBQWEsR0FBRyxPQUFLLFdBQVcsQ0FBQyx5QkFBeUIsQ0FDL0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUNuQixLQUFLLENBQ0wsQ0FBQztZQUVGLElBQU0sVUFBVSxHQUFHLFVBQ2xCLE1BQWdCLEVBQ2hCLFFBQWdCO2dCQUVoQixJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQzNDLE1BQU0sRUFDTixRQUFRLENBQ1IsQ0FBQztnQkFFRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7b0JBQ3ZCLE1BQU0sQ0FBQyxjQUFjLENBQ3BCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsSUFBSSxDQUNKLENBQUM7aUJBQ0Y7cUJBQU07b0JBQ04sT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDckM7WUFDRixDQUFDLENBQUM7WUFFRixLQUFLLElBQU0sUUFBUSxJQUFJLGFBQWEsRUFBRTtnQkFDckMsVUFBVSxDQUNULGFBQWEsRUFDYixRQUFRLENBQ1IsQ0FBQzthQUNGO1lBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDNUMsVUFBVSxDQUNULEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUNwQixRQUFRLENBQ1IsQ0FBQzthQUNGO1lBRUQsSUFBTSxZQUFZLEdBQUcsT0FBSyxtQkFBbUIsQ0FBQyxTQUFTLENBQ3RELEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUNwQixPQUFPLEVBQ1AsT0FBSyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDdkMsQ0FBQztZQUVGLE9BQUssT0FBTyxDQUNYLEtBQUssQ0FBQyxLQUFLLEVBQ1gseUJBQWU7Z0JBQ2QsSUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFbEYsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO29CQUMvQixJQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFL0QsSUFDQyxXQUFXLEtBQUssU0FBUzt3QkFDekIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUNyQjt3QkFDRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDdEQ7aUJBQ0Q7Z0JBRUQsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUQsQ0FBQyxDQUNELENBQUM7OztRQW5FSCxLQUFLLElBQU0sV0FBVyxJQUFJLG9CQUFvQixDQUFDLE9BQU87b0JBQTNDLFdBQVc7U0FvRXJCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRVMsK0NBQWUsR0FBekIsVUFBMkIsT0FBaUM7UUFDM0QsS0FBSyxJQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7WUFDN0IsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDckMsT0FBTyxJQUFJLENBQUM7YUFDWjtTQUNEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRVMsdUNBQU8sR0FBakIsVUFDQyxTQUFvQixFQUNwQixhQUFzRTtRQUV0RSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLElBQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFaEMsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhFLEtBQThCLFVBQWlCLEVBQWpCLHVDQUFpQixFQUFqQiwrQkFBaUIsRUFBakIsSUFBaUIsRUFBRTtZQUE1QyxJQUFNLGVBQWU7WUFDekIsSUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzdDLElBQUksT0FBTyxVQUFDO1lBRVosSUFBSSxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHO29CQUN4QixVQUFVLEVBQUUsZUFBZTtvQkFDM0IsT0FBTyxFQUFFLEVBQUU7aUJBQ1gsQ0FBQzthQUNGO1lBRUQsT0FBTyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUV6QywyS0FBMks7WUFDM0ssMkhBQTJIO1lBQzNILElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDbEMsU0FBUzthQUNUO1lBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHO2dCQUNqQixJQUFJLEVBQUUsU0FBUztnQkFDZixPQUFPLEVBQUUsYUFBYSxDQUFDLGVBQWUsQ0FBQzthQUN2QyxDQUFDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFDRiw0QkFBQztBQUFELENBQUM7Ozs7O0FDdk4rRDtBQUVoRTtJQUNTLGtFQUFxQjtJQUU3QiwyQkFDQyxtQkFBd0MsRUFDeEMsV0FBMEIsRUFDMUIsb0JBQStEO2VBRS9ELGtCQUNDLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsb0JBQW9CLENBQ3BCO0lBQ0YsQ0FBQztJQUVNLDBEQUE4QixHQUFyQztRQUNDLElBQU0sTUFBTSxHQUFzQixFQUFFLENBQUM7UUFFckMsS0FBSyxJQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3BDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDakM7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUNGLHdCQUFDO0FBQUQsQ0FBQyxDQTNCUSxxQkFBcUIsR0EyQjdCOzs7OztBQzlCd0Q7QUFVekQ7Ozs7Ozs7O0dBUUc7QUFDSDtJQUNTLGdGQUFpQjtJQUV6Qix5Q0FDUyxpQkFBb0MsRUFDNUMsbUJBQXdDLEVBQ3hDLFdBQTBCLEVBQzFCLG9CQUErRDtRQUpoRSxZQU1DLGtCQUNDLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsb0JBQW9CLENBQ3BCLFNBQ0Q7UUFWUSx1QkFBaUIsR0FBakIsaUJBQWlCLENBQW1COztJQVU3QyxDQUFDO0lBRU0sdUVBQTZCLEdBQXBDLFVBQ0MseUJBQTBDO1FBRDNDLGlCQTBDQztRQXpDQSw2RUFBMEM7Z0NBRS9CLFlBQVk7O1lBQ3RCLElBQU0sUUFBUSxHQUFHLE9BQUssR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hDLElBQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDNUMsSUFBTSxrQkFBa0IsR0FBRyxPQUFLLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVuRSxPQUFLLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxzQ0FBc0MsQ0FDeEUsZUFBZSxFQUNmLGtCQUFrQixDQUFDLFVBQVUsRUFDN0IseUJBQXlCLENBQ3pCLENBQUM7WUFFRixPQUFLLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxpQ0FBaUMsQ0FDbkUsZUFBZSxFQUNmLGtCQUFrQixDQUFDLE9BQU8sRUFDMUIseUJBQXlCLENBQ3pCLENBQUM7WUFFRixJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QyxPQUFLLGlCQUFpQjtxQkFDcEIsS0FBSyxDQUNMLGVBQWUsQ0FBQyxRQUFRLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxZQUMzQixHQUFDLGVBQWUsQ0FBQyxRQUFRLElBQUcsQ0FBQyxJQUFJLENBQUMsTUFDbkM7cUJBQ0EsSUFBSSxDQUNKLGtCQUFRO29CQUNQLG1EQUFtRDtvQkFFbkQsS0FBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxpQ0FBaUMsQ0FDbkUsZUFBZSxFQUNmLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQzlCLG1CQUFTLElBQUksZUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBdkUsQ0FBdUUsQ0FDcEYsRUFDRCx5QkFBeUIsQ0FDekIsQ0FBQztnQkFDSCxDQUFDLENBQ0QsQ0FBQzthQUNIOzs7UUFyQ0YsS0FBSyxJQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsR0FBRztvQkFBeEIsWUFBWTtTQXNDdEI7SUFDRixDQUFDO0lBRU8sMERBQWdCLEdBQXhCLFVBQ0MsT0FBK0M7UUFFL0MsSUFBTSxPQUFPLEdBQW1DLEVBQUUsQ0FBQztRQUNuRCxJQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFDaEMsSUFBTSxLQUFLLEdBQW1DLEVBQUUsQ0FBQztRQUVqRCxLQUFLLElBQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM3QixJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUM3QixJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBRTlCLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN4QjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7Z0JBQzdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdEI7U0FDRDtRQUVELE9BQU87WUFDTixPQUFPLEVBQUUsT0FBTztZQUNoQixVQUFVLEVBQUUsVUFBVTtZQUN0QixLQUFLLEVBQUUsS0FBSztTQUNaLENBQUM7SUFDSCxDQUFDO0lBRUYsc0NBQUM7QUFBRCxDQUFDLENBdkZRLG1DQUFpQixHQXVGekI7Ozs7QUN4RUQsSUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0I7SUFnQkMsaUNBQ1MsWUFBbUMsRUFDbkMsZ0JBQTJDLEVBQzNDLGNBQXVDO1FBRnZDLGlCQUFZLEdBQVosWUFBWSxDQUF1QjtRQUNuQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTJCO1FBQzNDLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtRQWpCeEMsY0FBUyxHQUtiO1lBQ0gsWUFBWSxFQUFFLEVBQUU7WUFDaEIsYUFBYSxFQUFFLEVBQUU7WUFDakIsY0FBYyxFQUFFLEVBQUU7WUFDbEIsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixnQkFBZ0IsRUFBRSxFQUFFO1lBQ3BCLGtCQUFrQixFQUFFLEVBQUU7U0FDdEIsQ0FBQztJQU9GLENBQUM7SUFFTSxrREFBZ0IsR0FBdkIsVUFDQyxJQUFPLEVBQ1AsR0FBVyxFQUNYLFFBQXlDLEVBQ3pDLFNBQXVELEVBQ3ZELFFBQW1DO1FBTHBDLGlCQXFCQztRQWpCQSxnREFBdUQ7UUFDdkQsc0RBQW1DO1FBRW5DLElBQUksQ0FBQyxnQkFBZ0IsQ0FDcEIsSUFBSSxFQUNKLFFBQVEsQ0FDUixDQUFDLEdBQUcsQ0FBQyxHQUFHO1lBQ1IsUUFBUTtZQUNSLFNBQVM7U0FDVCxDQUFDO1FBRUYsT0FBTztZQUNOLE9BQU8sS0FBSSxDQUFDLGdCQUFnQixDQUMzQixJQUFJLEVBQ0osUUFBUSxDQUNSLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDUixDQUFDLENBQUM7SUFDSCxDQUFDO0lBRU0sa0RBQWdCLEdBQXZCLFVBQ0MsSUFBTyxFQUNQLE9BQTJELEVBQzNELFFBQWlCO1FBRWpCLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBTSxTQUFTLEdBQXNDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFMUYsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV2QyxLQUE0QixVQUFjLEVBQWQsaUNBQWMsRUFBZCw0QkFBYyxFQUFkLElBQWMsRUFBRTtZQUF2QyxJQUFNLGFBQWE7WUFDdkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQ2pCLElBQUksQ0FBQyw2QkFBNkIsQ0FDakMsYUFBYSxDQUFDLENBQUMsQ0FBbUIsRUFDbEMsU0FBUyxFQUNULE9BQU8sQ0FDUCxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN4QixDQUFDO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTyxrREFBZ0IsR0FBeEIsVUFDQyxJQUFPLEVBQ1AsbUJBQTJCO1FBRTNCLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxnQkFBZ0IsQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLEVBQUU7Z0JBQzNDLFNBQVM7YUFDVDtZQUVELElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLG1CQUFtQixFQUFFO2dCQUM3QyxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQW1CLENBQUM7YUFDMUM7WUFFRCxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7WUFFdEIsY0FBYyxDQUFDLE1BQU0sQ0FDcEIsQ0FBQyxFQUNELENBQUMsRUFDRDtnQkFDQyxtQkFBbUI7Z0JBQ25CLGdCQUFnQjthQUNoQixDQUNELENBQUM7WUFFRixPQUFPLGdCQUFnQixDQUFDO1NBQ3hCO1FBRUQsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRXRCLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsbUJBQW1CO1lBQ25CLGdCQUFnQjtTQUNoQixDQUFDLENBQUM7UUFFSCxPQUFPLGdCQUFnQixDQUFDO0lBQ3pCLENBQUM7SUFFTywrREFBNkIsR0FBckMsVUFDQyxTQUF5QixFQUN6QixTQUE0QyxFQUM1QyxPQUEyRDtRQUg1RCxpQkF3QkM7UUFuQkEsT0FBTztZQUNOLElBQU0sTUFBTSxHQUF5QixFQUFFLENBQUM7WUFFeEMsS0FBSyxJQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUU7Z0JBQzVCLElBQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFckMsSUFBSSxhQUFhLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxhQUFhLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtvQkFDbEYsU0FBUztpQkFDVDtnQkFFRCxJQUFJO29CQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QztnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDZixLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzdCO2FBQ0Q7WUFFRCxPQUFPLEtBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQztJQUNILENBQUM7SUFDRiw4QkFBQztBQUFELENBQUM7Ozs7O0FDbEw0QztBQVdwQjtBQXdCRDtBQWVIO0FBRTRCO0FBQ29DO0FBRWpCO0FBSXBFLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUNoQyw0Q0FBbUI7SUFDbkIsd0NBQWU7QUFDaEIsQ0FBQyxFQUhXLHFCQUFxQixLQUFyQixxQkFBcUIsUUFHaEM7QUFFRDs7Ozs7O0dBTUc7QUFDSDtJQUNTLGlFQUFhO0lBeUVyQiwwQkFDQyxZQUE4QyxFQUM5QyxJQUFZLEVBQ1osTUFBcUI7SUFDckI7OztPQUdHO0lBQ0ksRUFBVyxFQUNsQixnQkFBOEM7UUFUL0MsWUFXQyxrQkFDQyxZQUFZLEVBQ1osSUFBSSxDQUNKLFNBeUJEO1FBL0JPLFFBQUUsR0FBRixFQUFFLENBQVM7UUEvRW5COzs7O1dBSUc7UUFDSSxZQUFNLEdBa0JUO1lBQ0gsSUFBSSxFQUFFLEVBQUU7WUFDUixNQUFNLEVBQUUsRUFBRTtTQUNWLENBQUM7UUFFSyxhQUFPLEdBQVksSUFBSSxDQUFDO1FBUS9COzs7V0FHRztRQUNJLDBCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUVqQzs7O1dBR0c7UUFDSSxjQUFRLEdBQVksS0FBSyxDQUFDO1FBRWpDOzs7Ozs7V0FNRztRQUNJLGdCQUFVLEdBQUcsS0FBSyxDQUFDO1FBY2xCLHFCQUFlLEdBQWtCLElBQUksQ0FBQztRQWtCN0MsS0FBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsS0FBSyxTQUFTO1lBQzlDLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsQ0FBQztRQUVwQyxLQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksNkNBQXNCLENBQzVDLFlBQVksRUFDWixLQUFJLEVBQ0osS0FBSSxDQUFDLFNBQVMsQ0FDZCxDQUFDO1FBRUYsS0FBSSxDQUFDLGlCQUFpQixHQUFHLElBQUkseURBQTRCLENBQ3hELFlBQVksRUFDWixLQUFJLENBQUMsV0FBVyxFQUNoQixLQUFJLENBQ0osQ0FBQztRQUVGLEtBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx1QkFBdUIsQ0FDOUMsWUFBWSxDQUFDLFlBQVksRUFDekIsWUFBWSxDQUFDLGdCQUFnQixFQUM3QixZQUFZLENBQUMsY0FBYyxDQUMzQixDQUFDOztJQUNILENBQUM7SUFFTSxrQ0FBTyxHQUFkO1FBQ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLHNEQUEyQixHQUFsQyxVQUNDLFFBQXNCLEVBQ3RCLE1BQWMsRUFDZCxRQUEyQztRQUUzQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsMkJBQTJCLENBQ2xELFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxDQUNSLENBQUM7SUFDSCxDQUFDO0lBRU0sNkNBQWtCLEdBQXpCO1FBQ0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFFTSw4Q0FBbUIsR0FBMUI7UUFDQyxLQUFLLElBQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzFDLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTNDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQzthQUNwQjtTQUNEO1FBRUQsS0FBSyxJQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtZQUMzQyxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVqRCxLQUFLLElBQU0sUUFBUSxJQUFJLFVBQVUsRUFBRTtnQkFDbEMsSUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUUxQyxLQUFLLElBQU0sUUFBUSxJQUFJLFlBQVksRUFBRTtvQkFDcEMsSUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUVyQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUsscUJBQXFCLENBQUMsS0FBSyxFQUFFO3dCQUNoRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7cUJBQ3BCO2lCQUNEO2FBQ0Q7U0FDRDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksMENBQWUsR0FBdEIsVUFDQyxHQUFXLEVBQ1gsU0FBa0IsRUFDbEIsNEJBQTBDLEVBQzFDLEtBQTRCO1FBRTVCLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFM0IsT0FBTztTQUNQO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUc7WUFDekIsTUFBTSxFQUFFLDRCQUE0QixFQUFFO1lBQ3RDLEtBQUssRUFBRSxLQUFLO1NBQ1osQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQ2pDLGtCQUFrQixFQUNsQixrQkFBUSxJQUFJLGVBQVEsQ0FDbkIsR0FBRyxFQUNILEtBQUssQ0FDTCxFQUhXLENBR1gsRUFDRCxLQUFLLENBQ0wsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHdDQUFhLEdBQXBCLFVBQ0MsV0FBNEIsRUFDNUIsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsU0FBa0IsRUFDbEIsdUJBQXFDLEVBQ3JDLDRCQUEwQyxFQUMxQyxLQUE0QjtRQUU1QixJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FDbEIsV0FBVyxFQUNYLFFBQVEsRUFDUixRQUFRLENBQ1IsQ0FBQztZQUVGLE9BQU87U0FDUDtRQUVELGtDQUFVLENBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQ2hCO1lBQ0MsV0FBVztZQUNYLFFBQVE7WUFDUixRQUFRO1NBQ1IsRUFDRDtZQUNDLEVBQUU7WUFDRixFQUFFO1lBQ0Y7Z0JBQ0MsV0FBVyxFQUFFLHVCQUF1QixFQUFFO2dCQUN0QyxNQUFNLEVBQUUsNEJBQTRCLEVBQUU7Z0JBQ3RDLEtBQUssRUFBRSxLQUFLO2FBQ1o7U0FDRCxDQUNELENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUNqQyxnQkFBZ0IsRUFDaEIsa0JBQVEsSUFBSSxlQUFRLENBQ25CLFdBQVcsRUFDWCxRQUFRLEVBQ1IsUUFBUSxDQUNSLEVBSlcsQ0FJWCxFQUNELEtBQUssQ0FDTCxDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNJLHNDQUFXLEdBQWxCO1FBQ0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsS0FBSyxJQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUMxQyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUzQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUsscUJBQXFCLENBQUMsS0FBSyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFFckIsT0FBTzthQUNQO1NBQ0Q7UUFFRCxLQUFLLElBQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQzNDLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWpELEtBQUssSUFBTSxRQUFRLElBQUksVUFBVSxFQUFFO2dCQUNsQyxJQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRTFDLEtBQUssSUFBTSxRQUFRLElBQUksWUFBWSxFQUFFO29CQUNwQyxJQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRXJDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUU7d0JBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO3dCQUVyQixPQUFPO3FCQUNQO2lCQUNEO2FBQ0Q7U0FDRDtJQUNGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNJLGlEQUFzQixHQUE3QixVQUNDLG9CQUEwQyxFQUMxQyxvQkFBcUMsRUFDckMseUJBQTBDO1FBRTFDLHNGQUFzRjtRQUN0RixrRkFBa0Y7UUFObkYsaUJBbUVDO1FBakVBLG1FQUFxQztRQUNyQyw2RUFBMEM7UUFLMUMsS0FBSyxJQUFNLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDdkQsSUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQ3ZDLEtBQUssRUFDTCxvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLHlCQUF5QixDQUN6QixDQUFDO1NBQ0Y7UUFFRCxLQUFLLElBQU0sUUFBUSxJQUFJLG9CQUFvQixDQUFDLE9BQU8sRUFBRTtZQUNwRCxLQUF3QixVQUFzQyxFQUF0Qyx5QkFBb0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQXRDLGNBQXNDLEVBQXRDLElBQXNDLEVBQUU7Z0JBQTNELElBQU0sU0FBUztnQkFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUUxQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFbEQsSUFBSSxDQUFDLGNBQWMsQ0FDbEIsU0FBUyxDQUFDLEVBQUUsQ0FDWixDQUFDO2dCQUVGLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtvQkFDcEUsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFFbkYsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ2pCLDRIQUE0SDt3QkFDNUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FDdkQsS0FBSyxFQUNMLENBQUMsQ0FDRCxDQUFDO3FCQUNGO2lCQUNEO2FBQ0Q7U0FDRDtRQUVELElBQU0saUJBQWlCLEdBQUcsSUFBSSwrREFBK0IsQ0FDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFDckMsSUFBSSxFQUNKLGtCQUFRLElBQUksWUFBSSxDQUFDLGlCQUFpQixDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxFQUE1RCxDQUE0RCxDQUN4RSxDQUFDO1FBRUYsaUJBQWlCO2FBQ2YsWUFBWSxDQUFDLG9CQUFvQixDQUFDO2FBQ2xDLDZCQUE2QixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFM0Qsa0ZBQWtGO1FBQ2xGLEtBQW9CLFVBQWEsRUFBYixTQUFJLENBQUMsUUFBUSxFQUFiLGNBQWEsRUFBYixJQUFhLEVBQUU7WUFBOUIsSUFBTSxLQUFLO1lBQ2YsS0FBSyxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDbkQ7UUFFRCxpR0FBaUc7UUFDakcsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQ3JDO0lBQ0YsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLDRDQUFpQixHQUF4QixVQUNDLFlBQTBCO1FBRDNCLGlCQThFQztRQTNFQSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDM0M7Z0JBQ0MsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsUUFBUSxFQUFFLHdCQUFJO2FBQ2QsQ0FDRCxDQUFDO1NBQ0Y7UUFFRCxPQUFPLElBQUk7YUFDVCxrQ0FBa0MsQ0FBQyxZQUFZLENBQUM7YUFDaEQsSUFBSSxDQUNKO1lBQ08sc0VBQTBGLEVBQXpGLGtCQUFNLEVBQUUsOENBQW9CLEVBQUUsd0NBQTJELENBQUM7WUFFakcsS0FBSyxJQUFNLFFBQVEsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFO3dDQUVqQyxTQUFTO29CQUNuQixLQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBRTFDLElBQU0sVUFBVSxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFOUQsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDMUMsT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRWxELElBQUksS0FBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTt3QkFDcEUsS0FBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDdkQ7b0JBRUQsbURBQW1EO29CQUNuRCxLQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUVsRSxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBRS9DLEtBQUksQ0FBQyxjQUFjLENBQ2xCLFNBQVMsQ0FBQyxFQUFFLENBQ1osQ0FBQztvQkFFRixpQkFBaUIsQ0FBQyxJQUFJLENBQ3JCLHVCQUFhO3dCQUNaLGFBQWEsQ0FBQyxjQUFjLENBQzNCLFNBQVMsRUFDVCxVQUFVLENBQUMsT0FBTyxDQUNsQixDQUFDO29CQUNILENBQUMsQ0FDRCxDQUFDOztnQkE1QkgsS0FBd0IsVUFBOEIsRUFBOUIsaUJBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQTlCLGNBQThCLEVBQTlCLElBQThCO29CQUFqRCxJQUFNLFNBQVM7NEJBQVQsU0FBUztpQkE2Qm5CO2FBQ0Q7WUFFRCxJQUFNLGlCQUFpQixHQUFHLElBQUksK0RBQStCLENBQzVELEtBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQ25DLEtBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQ3JDLEtBQUksRUFDSixrQkFBUSxJQUFJLFlBQUksQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsRUFBNUQsQ0FBNEQsQ0FDeEUsQ0FBQztZQUVGLGlCQUFpQjtpQkFDZixZQUFZLENBQUMsb0JBQW9CLENBQUM7aUJBQ2xDLDZCQUE2QixFQUFFLENBQUM7WUFFbEMsS0FBb0IsVUFBYSxFQUFiLFVBQUksQ0FBQyxRQUFRLEVBQWIsY0FBYSxFQUFiLElBQWEsRUFBRTtnQkFBOUIsSUFBTSxLQUFLO2dCQUNmLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ25EO1lBRUQsZ0lBQWdJO1lBQ2hJLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUVyQixJQUFJLEtBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxLQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDckM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNmLENBQUMsQ0FDRCxDQUFDO0lBQ0osQ0FBQztJQUVNLHlDQUFjLEdBQXJCO1FBQ0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsMERBQTBEO0lBQ25ELG9DQUFTLEdBQWhCLFVBQ0MsU0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsY0FBdUM7UUFEdkMsaURBQTRCO1FBRzVCLElBQUksTUFBMEMsQ0FBQztRQUUvQyxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDakMsTUFBTSxHQUFHLGNBQWMsQ0FBQztTQUN4QjthQUFNO1lBQ04sSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWhFLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDM0Q7U0FDRDtRQUVELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN6QixJQUFNLFFBQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ3RDLFNBQVMsRUFDVCxNQUFNLENBQ04sQ0FBQztZQUVGLElBQUksUUFBTSxLQUFLLElBQUksRUFBRTtnQkFDcEIsT0FBTyxRQUFNLENBQUM7YUFDZDtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDM0IsU0FBUyxFQUNULFdBQVcsQ0FDWCxDQUFDO0lBQ0gsQ0FBQztJQUVNLDBEQUErQixHQUF0QyxVQUF3QyxpQkFBd0M7UUFDL0UsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFeEUsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUZBQW1GLENBQUMsQ0FBQztTQUNyRztRQUVELElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUNsRSxlQUFlLENBQUMsUUFBUSxFQUN4QixlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQztRQUVGLElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1lBQ3BDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNO2lCQUM3QiwrQkFBK0IsQ0FBQyxpQkFBaUIsQ0FBQztpQkFDbEQsS0FBSyxFQUFFLENBQUM7WUFFVixJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQzFDLGVBQWUsQ0FBQyxRQUFRLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUM1QixpQkFBaUIsQ0FDakIsQ0FBQztTQUNGO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxvREFBeUIsR0FBaEMsVUFDQyxXQUE0QixFQUM1QixVQUEwQjtRQUExQiw4Q0FBMEI7UUFFMUIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXRELElBQ0MsT0FBTyxLQUFLLFNBQVM7ZUFDbEIsU0FBUyxLQUFLLFNBQVMsRUFDekI7WUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNoQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDdkI7WUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDL0MsT0FBTyxDQUFDLE9BQU8sRUFDZixFQUFFLEVBQ0YsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3RCLENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FDM0MsV0FBVyxFQUNYLFVBQVUsQ0FDVixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxrREFBdUIsR0FBOUIsVUFBZ0MsUUFBNEI7UUFDM0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7O09BR0c7SUFDSSxxQ0FBVSxHQUFqQjtRQUNDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDaEMsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZ0RBQXFCLEdBQTVCO1FBQ0MsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtZQUNsQyxPQUFPO1NBQ1A7UUFFRCxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSSwrQ0FBb0IsR0FBM0I7UUFBQSxpQkF1QkM7UUF0QkEsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtZQUNsQyxPQUFPLENBQUMsSUFBSSxDQUNYLGtDQUFrQyxFQUNsQyxJQUFJLENBQ0osQ0FBQztZQUNGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUN4QztZQUNDLElBQUksQ0FBQyxLQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQzFCLE9BQU87YUFDUDtZQUVELEtBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBRTdCLElBQUksS0FBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUN0QixLQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFFBQVMsQ0FBQyxDQUFDO2FBQ3hEO1FBQ0YsQ0FBQyxFQUNELElBQUksQ0FDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLCtCQUFJLEdBQVgsVUFDQyxRQUFnQixFQUNoQixVQUEwQyxFQUMxQyxlQUF5QixFQUN6QixxQkFBNkM7UUFKOUMsaUJBd0ZDO1FBdkZBLDJDQUFnQjtRQUNoQiw0Q0FBMEM7UUFJMUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDL0M7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFN0IsSUFBSSxtQkFBd0MsQ0FBQztRQUU3QyxPQUFPLENBQ04sSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUM7WUFDekQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUMxQzthQUNDLElBQUksQ0FDSjtZQUNDLE9BQU8sS0FBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDeEMsY0FBYyxFQUNkLGtCQUFRLElBQUksZUFBUSxDQUFDLEtBQUksQ0FBQyxFQUFkLENBQWMsRUFDMUIsUUFBUSxDQUNSLENBQUM7UUFDSCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQzthQUNBLElBQUksQ0FDSjtZQUNDLEtBQUksQ0FBQyxvQkFBb0IsR0FBRyxnRkFDeEIsS0FBSSxDQUFDLG9CQUFvQixHQUN6QixVQUFVLENBQ2IsQ0FBQztZQUVGLE9BQU8sS0FBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDdkMsS0FBSSxFQUNKLGVBQWUsRUFDZixxQkFBcUIsQ0FDckIsQ0FBQztRQUNILENBQUMsQ0FDRDthQUNBLElBQUksQ0FDSiw4QkFBb0I7WUFDbkIsbUJBQW1CLEdBQUcsb0JBQW9CLENBQUM7WUFFM0MsS0FBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztZQUUvQixJQUFJLEtBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDdEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxRQUFTLENBQUMsQ0FBQzthQUN4RDtZQUVELEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBRXhCLE9BQU8sS0FBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDeEMsZUFBZSxFQUNmLGtCQUFRLElBQUksZUFBUSxDQUNuQixLQUFJLEVBQ0osbUJBQW1CLENBQ25CLEVBSFcsQ0FHWCxFQUNELFFBQVEsQ0FDUixDQUFDO1FBQ0gsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckM7YUFDQSxJQUFJLENBQ0o7WUFDQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNkLEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQzVCO1lBRUQsS0FBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFFdEIsT0FBTyxtQkFBbUIsQ0FBQztRQUM1QixDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQzthQUNBLEtBQUssQ0FDTCxlQUFLO1lBQ0osS0FBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFFdEIsT0FBTyxLQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUNELENBQUM7SUFDSixDQUFDO0lBRU0sd0NBQWEsR0FBcEI7UUFDQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzlCO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0NBQVMsR0FBaEIsVUFBa0IsWUFBK0I7UUFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHlDQUFjLEdBQXJCLFVBQXVCLFNBQXlCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDBDQUFlLEdBQXRCLFVBQXdCLGtCQUEyQztRQUNsRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHVDQUFZLEdBQW5CLFVBQ0MsR0FBVyxFQUNYLFFBQXNELEVBQ3RELFNBQTZDLEVBQzdDLFFBQWlCO1FBRWpCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDeEMsY0FBYyxFQUNkLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFFBQVEsQ0FDUixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHdDQUFhLEdBQXBCLFVBQ0MsR0FBVyxFQUNYLFFBQXVELEVBQ3ZELFNBQTZDLEVBQzdDLFFBQWlCO1FBRWpCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDeEMsZUFBZSxFQUNmLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFFBQVEsQ0FDUixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDJDQUFnQixHQUF2QjtRQUNDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUM5RDtRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQywrQkFBK0I7YUFDdEQsU0FBUyxDQUFDLElBQUksQ0FBQzthQUNmLE9BQU8sRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDBDQUFlLEdBQXRCLFVBQ0MsYUFBc0MsRUFDdEMsYUFBNEI7UUFFNUIsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE9BQU87U0FDUDtRQUVELEtBQUssSUFBTSxLQUFLLElBQUksYUFBYSxFQUFFO1lBQ2xDLElBQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVuQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3ZDLFNBQVM7YUFDVDtZQUVELGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUI7SUFDRixDQUFDO0lBRU0sZ0RBQXFCLEdBQTVCLFVBQ0MsUUFBa0IsRUFDbEIsUUFBc0IsRUFDdEIsT0FBaUQ7O1FBSGxELGlCQXNCQztRQWpCQSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCO2FBQ3hDLEtBQUssQ0FDTCxRQUFRLEVBQ1IsRUFBRSxZQUNELEdBQUMsUUFBUSxJQUFHLENBQUMsSUFBSSxDQUFDLE1BQ25CO2FBQ0EsSUFBSSxDQUNKLGtCQUFRO1lBQ1AsT0FBTyxLQUFJLENBQUMsa0JBQWtCLENBQzdCLFFBQVEsRUFDUixRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUN4QixRQUFRLEVBQ1IsT0FBTyxDQUNQLENBQUM7UUFDSCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVNLG9EQUF5QixHQUFoQyxVQUNDLFFBQWtCLEVBQ2xCLFdBQXFCLEVBQ3JCLFVBQWtEO1FBSG5ELGlCQXFCQztRQWhCQSxPQUFPLElBQUksQ0FBQyxpQkFBaUI7YUFDM0IsNEJBQTRCLENBQzVCLFFBQVEsRUFDUixXQUFXLEVBQ1gsVUFBVSxDQUFDLFFBQVEsRUFDbkIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ3hCO2FBQ0EsSUFBSSxDQUNKLFVBQUMsaUJBQTJEO1lBQzNELE9BQU8sS0FBSSxDQUFDLHlCQUF5QixDQUNwQyxpQkFBaUIsRUFDakIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQzNCLENBQUM7UUFDSCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVNLDZDQUFrQixHQUF6QixVQUNDLFFBQWtCLEVBQ2xCLFdBQXFCLEVBQ3JCLFFBQXNCLEVBQ3RCLE9BQWlEO1FBSmxELGlCQXNCQztRQWhCQSxPQUFPLElBQUksQ0FBQyxpQkFBaUI7YUFDM0IsNEJBQTRCLENBQzVCLFFBQVEsRUFDUixXQUFXLEVBQ1gsUUFBUSxFQUNSLElBQUksd0NBQXNCLENBQUMsT0FBTyxDQUFDLENBQ25DO2FBQ0EsSUFBSSxDQUNKLFVBQUMsaUJBQTJEO1lBQzNELE9BQU8sS0FBSSxDQUFDLHlCQUF5QixDQUNwQyxpQkFBaUIsRUFDakIsT0FBTyxDQUNQLENBQUM7UUFDSCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVNLCtDQUFvQixHQUEzQixVQUNDLFVBQThDO1FBRC9DLGlCQWlCQztRQWRBLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjthQUMzQixvQkFBb0IsQ0FDcEIsVUFBVSxDQUFDLFFBQVEsRUFDbkIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ3hCO2FBQ0EsSUFBSSxDQUNKLGVBQUs7WUFDSixPQUFPLEtBQUksQ0FBQyx3QkFBd0IsQ0FDbkMsS0FBSyxFQUNMLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUMzQixDQUFDO1FBQ0gsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTSx3Q0FBYSxHQUFwQixVQUNDLFFBQXNCLEVBQ3RCLE9BQWlEO1FBRmxELGlCQWtCQztRQWRBLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjthQUMzQixvQkFBb0IsQ0FDcEIsUUFBUSxFQUNSLElBQUksd0NBQXNCLENBQUMsT0FBTyxDQUFDLENBQ25DO2FBQ0EsSUFBSSxDQUNKLGVBQUs7WUFDSixPQUFPLEtBQUksQ0FBQyx3QkFBd0IsQ0FDbkMsS0FBSyxFQUNMLElBQUksMkNBQXlCLENBQUMsT0FBTyxDQUFDLENBQ3RDLENBQUM7UUFDSCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVNLDJDQUFnQixHQUF2QixVQUNDLFFBQXNCLEVBQ3RCLE9BQWlEO1FBRWpELE9BQU87WUFDTixRQUFRLEVBQUUsUUFBUTtZQUNsQixPQUFPLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLElBQUksd0NBQXNCLENBQUMsT0FBTyxDQUFDO2dCQUMxQyxRQUFRLEVBQUUsSUFBSSwyQ0FBeUIsQ0FBQyxPQUFPLENBQUM7YUFDaEQ7U0FDRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdEQUFxQixHQUE1QixVQUNDLFFBQXNCLEVBQ3RCLFNBQWlCLEVBQ2pCLE9BQWlEO1FBRWpELE9BQU87WUFDTixRQUFRLEVBQUUsUUFBUTtZQUNsQixTQUFTLEVBQUUsU0FBUztZQUNwQixPQUFPLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLElBQUksd0NBQXNCLENBQUMsT0FBTyxDQUFDO2dCQUMxQyxRQUFRLEVBQUUsSUFBSSwyQ0FBeUIsQ0FBQyxPQUFPLENBQUM7YUFDaEQ7U0FDRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHlDQUFjLEdBQXJCLFVBQ0MsUUFBc0IsRUFDdEIsUUFBeUIsRUFDekIsT0FBa0MsRUFDbEMsTUFBZ0I7UUFEaEIsc0NBQWtDO1FBR2xDLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFFdEYsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzVCLElBQU0sTUFBTSxHQUFHLFFBQWtCLENBQUM7WUFFbEMsSUFDQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7bUJBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztxQkFDekIsUUFBUSxDQUNSLFFBQVEsRUFDUixNQUFNLENBQ04sRUFDRDtnQkFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQ3RCLFFBQVEsRUFDUixNQUFNLEVBQ04sT0FBTyxFQUNQLE1BQU0sQ0FDTixDQUFDO2FBQ0Y7U0FDRDthQUFNLElBQUksY0FBYyxDQUFDLElBQUksS0FBSyxxQkFBWSxDQUFDLFNBQVMsRUFBRTtZQUMxRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDM0IsUUFBUSxFQUNSLGNBQWMsQ0FBQyxNQUFnQixFQUMvQixPQUFPLEVBQ1AsS0FBSyxFQUNMLE1BQU0sQ0FDTixDQUFDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQ3pCLFFBQVEsRUFDUixPQUFPLEVBQ1AsS0FBSyxFQUNMLE1BQU0sQ0FDTixDQUFDO0lBQ0gsQ0FBQztJQWtCTSwyQ0FBZ0IsR0FBdkIsVUFDQyxRQUFzQixFQUN0QixXQUFtQixFQUNuQixPQUFrQyxFQUNsQyxXQUFxQixFQUNyQixNQUFnQjtRQUZoQixzQ0FBa0M7UUFJbEMsSUFBSSxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUMxQyxPQUFPLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztTQUM3QjtRQUVELElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztTQUMzQztRQUVELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUMvQixRQUFRLEVBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsRUFDbEQsT0FBOEMsRUFDOUMsV0FBVyxFQUNYLE1BQU0sQ0FDTixDQUFDO0lBQ0gsQ0FBQztJQWtCTSwrQ0FBb0IsR0FBM0IsVUFDQyxRQUFzQixFQUN0QixNQUFjLEVBQ2QsT0FBa0MsRUFDbEMsV0FBNEIsRUFDNUIsTUFBZ0I7UUFMakIsaUJBMkRDO1FBdkRBLGlEQUE0QjtRQUk1QixPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ3JCLGlCQUFpQixDQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksa0NBQWdCLENBQUMsT0FBTyxDQUFDLENBQzdCO2FBQ0EsSUFBSSxDQUNKLHFCQUFXO1lBQ1YsSUFBSSxTQUE4QyxDQUFDO1lBQ25ELElBQU0sZ0JBQWdCLEdBQTZCLEVBQUUsQ0FBQztZQUV0RCxLQUF3QixVQUFtQixFQUFuQixnQkFBVyxDQUFDLE9BQU8sRUFBbkIsY0FBbUIsRUFBbkIsSUFBbUIsRUFBRTtnQkFBeEMsSUFBTSxTQUFTO2dCQUNuQixJQUNDLFNBQVMsQ0FBQyxRQUFRLEtBQUssUUFBUTt1QkFDNUIsU0FBUyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQzdCO29CQUNELFNBQVMsR0FBRyxTQUFTLENBQUM7b0JBRXRCLFNBQVM7aUJBQ1Q7Z0JBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO29CQUN2RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUMxQztnQkFFRCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3JEO1lBRUQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDBFQUEwRSxDQUFDLENBQUM7YUFDNUY7WUFFRCxJQUFNLElBQUksR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQ25DLFNBQVMsRUFDVCxNQUFNLEVBQ04sSUFBSSxDQUNKLENBQUM7WUFFRixJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQzthQUNaO1lBRUQsT0FBTztnQkFDTixJQUFJLEVBQUUsSUFBSTtnQkFDVixNQUFNLEVBQUUsS0FBSSxDQUFDLGtCQUFrQixDQUM5QixnQkFBZ0IsQ0FDaEI7YUFDRCxDQUFDO1FBQ0gsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFnQkQ7OztPQUdHO0lBQ0kseUNBQWMsR0FBckIsVUFDQyxRQUFzQixFQUN0QixPQUF1QyxFQUN2QyxXQUFxQixFQUNyQixNQUFnQjtRQUZoQixzQ0FBdUM7UUFJdkMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQy9CLFFBQVEsRUFDUixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFDekMsT0FBTyxFQUNQLFdBQVcsRUFDWCxNQUFNLENBQ04sQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSwwQ0FBZSxHQUF0QixVQUNDLFFBQXNCLEVBQ3RCLEtBQWUsRUFDZixPQUF1QztRQUh4QyxpQkFtQkM7UUFoQkEsc0NBQXVDO1FBRXZDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjthQUMzQix1QkFBdUIsQ0FDdkIsUUFBUSxFQUNSLEtBQUssRUFDTCxJQUFJLGtDQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUM3QjthQUNBLElBQUksQ0FDSixVQUFDLFdBQTJDO1lBQzNDLE9BQU8sS0FBSSxDQUFDLG1CQUFtQixDQUM5QixXQUFXLENBQ1gsQ0FBQztRQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksdUNBQVksR0FBbkIsVUFDQyxRQUFzQixFQUN0QixPQUFpQixFQUNqQixPQUF1QztRQUh4QyxpQkFvQkM7UUFqQkEsc0NBQXVDO1FBR3ZDLE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDckIsZ0JBQWdCLENBQ2hCLFFBQVEsRUFDUixPQUFPLEVBQ1AsSUFBSSxrQ0FBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FDN0I7YUFDQSxJQUFJLENBQ0osVUFBQyxXQUEyQztZQUMzQyxPQUFPLEtBQUksQ0FBQyxtQkFBbUIsQ0FDOUIsV0FBVyxDQUNYLENBQUM7UUFDSCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0NBQVcsR0FBbEIsVUFDQyxRQUFzQixFQUN0QixNQUFjLEVBQ2QsT0FBdUMsRUFDdkMsTUFBZ0I7UUFKakIsaUJBcUJDO1FBbEJBLHNDQUF1QztRQUd2QyxPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ3JCLGNBQWMsQ0FDZCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksa0NBQWdCLENBQUMsT0FBTyxDQUFDLENBQzdCO2FBQ0EsSUFBSSxDQUNKLFVBQUMsU0FBa0M7WUFDbEMsT0FBTyxLQUFJLENBQUMsa0JBQWtCLENBQzdCLFNBQVMsRUFDVCxNQUFNLENBQ04sQ0FBQztRQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0kscUNBQVUsR0FBakIsVUFDQyxRQUFrQixFQUNsQixNQUFjO1FBRWQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FDakMsUUFBUSxFQUNSLE1BQU0sQ0FDTixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGdEQUFxQixHQUE1QixVQUNDLGdCQUFrQyxFQUNsQyxnQkFBMEIsRUFDMUIsc0JBQThDO1FBSC9DLGlCQTRIQztRQXZIQSxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6RCxJQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXpELEtBQUssSUFBTSxXQUFXLElBQUksb0JBQW9CLENBQUMsS0FBSyxFQUFFO1lBQ3JELElBQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUV0RCxrRkFBa0Y7WUFDbEYsZ0dBQWdHO1lBQ2hHLG9CQUFvQixDQUFDLGNBQWMsQ0FDbEMsS0FBSyxDQUFDLEtBQUssRUFDWCxFQUFFLEVBQ0YsSUFBSSxFQUNKLEtBQUssQ0FBQyxFQUFFLENBQ1IsQ0FBQztZQUVGLE9BQU8sb0JBQW9CLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsS0FBSyxJQUFNLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDdkQsSUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXhELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUMzRixnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUNyRCxLQUFLLENBQUMsS0FBSyxDQUNYLENBQUM7YUFDRjtpQkFBTTtnQkFDTixJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUN2QyxLQUFLLEVBQ0wsSUFBSSxDQUNKLENBQUM7YUFDRjtTQUNEO1FBRUQsS0FBSyxJQUFNLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDdkQsSUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXhELElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsQ0FDbkgsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFDckQsS0FBSyxDQUFDLEtBQUssQ0FDWCxDQUFDO1lBRUYsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQ1gsWUFBWSxDQUFDLE9BQU8sQ0FDcEIsQ0FBQztZQUVGLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtnQkFDakMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO2FBQ2xEO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDaEMsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFeEUsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO29CQUMzQixJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssd0JBQWUsQ0FBQyxTQUFTLEVBQUU7d0JBQ2hELFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO3dCQUN2RCxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztxQkFDakQ7eUJBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLHdCQUFlLENBQUMsTUFBTSxFQUFFO3dCQUNwRCxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztxQkFDNUQ7aUJBQ0Q7YUFDRDtTQUNEO1FBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDcEQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUM3QztZQUVELEtBQXdCLFVBQXNDLEVBQXRDLHlCQUFvQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBdEMsY0FBc0MsRUFBdEMsSUFBc0MsRUFBRTtnQkFBM0QsSUFBTSxTQUFTO2dCQUNuQiwyR0FBMkc7Z0JBQzNHLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN4QixTQUFTO2lCQUNUO2dCQUVELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUV4RCxJQUFJLENBQUMsY0FBYyxDQUNsQixTQUFTLENBQUMsRUFBRSxDQUNaLENBQUM7YUFDRjtTQUNEO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdkIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7YUFDcEQsSUFBSSxDQUNKO1lBQ0MsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLCtEQUErQixDQUM1RCxLQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUNuQyxLQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUNyQyxLQUFJLEVBQ0osa0JBQVEsSUFBSSxZQUFJLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLEVBQTVELENBQTRELENBQ3hFLENBQUM7WUFFRixpQkFBaUI7aUJBQ2YsWUFBWSxDQUFDLG9CQUFvQixDQUFDO2lCQUNsQyw2QkFBNkIsRUFBRSxDQUFDO1lBRWxDLEtBQW9CLFVBQWEsRUFBYixVQUFJLENBQUMsUUFBUSxFQUFiLGNBQWEsRUFBYixJQUFhLEVBQUU7Z0JBQTlCLElBQU0sS0FBSztnQkFDZixJQUFJLEtBQUssS0FBSyxnQkFBZ0IsRUFBRTtvQkFDL0IsU0FBUztpQkFDVDtnQkFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUNuRDtZQUVELElBQUksS0FBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLEtBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUNyQztZQUVELE9BQU8sb0JBQW9CLENBQUMsbUJBQW1CLENBQUM7UUFDakQsQ0FBQyxDQUNELENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksd0RBQTZCLEdBQXBDLFVBQ0MsV0FBNEI7UUFLNUIsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXRELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFnRCxXQUFXLDJCQUF3QixDQUFDLENBQUM7U0FDckc7UUFFRCxPQUFPO1lBQ04sS0FBSyxFQUFFLFNBQVM7WUFDaEIsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztTQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDRDQUFpQixHQUF4QixVQUNDLFdBQTRCO1FBRTVCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyRSxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDNUIsT0FBTyxTQUFTLENBQUM7U0FDakI7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG9EQUF5QixHQUFoQyxVQUNDLFFBQWtCLEVBQ2xCLE1BQTJCO1FBRTNCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDN0MsUUFBUSxFQUNSLE1BQU0sQ0FDTixDQUFDO1FBRUYsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUMzQyxRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksK0RBQW9DLEdBQTNDLFVBQ0MsUUFBa0IsRUFDbEIsV0FBbUI7UUFFbkIsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FDdEUsUUFBUSxFQUNSLFdBQVcsQ0FDWCxDQUFDO1FBRUYsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQzdCLE9BQU8sZUFBZSxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxDQUN0RCxRQUFRLEVBQ1IsV0FBVyxDQUNYLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksa0RBQXVCLEdBQTlCLFVBQWdDLGlCQUF3QztRQUN2RSxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXZGLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxPQUFPLGVBQWUsQ0FBQztTQUN2QjtRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUNBQVEsR0FBZjtRQUNDLElBQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTVGLEtBQUssSUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7WUFDdkQsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBRXRFLHlIQUF5SDtZQUN6SCxxREFBcUQ7WUFDckQsSUFDQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQ2hDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDbEI7bUJBQ0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFDdkI7Z0JBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUU5QyxvQkFBb0IsQ0FBQyxjQUFjLENBQ2xDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3JCLENBQUM7Z0JBRUYsU0FBUzthQUNUO1lBRUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDL0IsS0FBSyxDQUFDLEtBQUssQ0FDWCxDQUFDO1lBRUYsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFO2dCQUN2QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUMvQixLQUFLLENBQUMsS0FBSyxFQUNYLElBQUksQ0FDSixDQUFDO2dCQUVGLElBQ0MsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FDOUMsU0FBUyxFQUNULFNBQVMsQ0FDVCxFQUNBO29CQUNELG9CQUFvQixDQUFDLFlBQVksQ0FDaEMsS0FBSyxDQUFDLEtBQUssRUFDWCxTQUFTLENBQ1QsQ0FBQztpQkFDRjthQUNEO1lBRUQ7WUFDQyxzSEFBc0g7WUFDdEgsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQ3pDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUNyQixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFDckIsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN4QixFQUNBO2dCQUNELFNBQVM7YUFDVDtZQUVELG9CQUFvQixDQUFDLGNBQWMsQ0FDbEMsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDckIsQ0FBQztTQUNGO1FBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRTtZQUNyRCxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUM5RTtRQUVELE9BQU8sb0JBQW9CLENBQUM7SUFDN0IsQ0FBQztJQUVELDZDQUE2QztJQUN0Qyw2Q0FBa0IsR0FBekIsVUFDQyxTQUFrQyxFQUNsQyxNQUF1QixFQUN2QixLQUFlO1FBRGYsdUNBQXVCO1FBR3ZCLElBQUksTUFBTSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7U0FDMUI7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHO2dCQUM1QyxPQUFPLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELE9BQU8sRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzthQUNyRCxDQUFDO1NBQ0Y7UUFFRCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FDL0QsU0FBUyxFQUNULElBQUksRUFDSixLQUFLLENBQ0wsQ0FBQztRQUVGLE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFFTSw4Q0FBbUIsR0FBMUIsVUFDQyxXQUEyQztRQUUzQyxJQUFNLE1BQU0sR0FBc0MsRUFBRSxDQUFDO1FBRXJELEtBQXdCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO1lBQWhDLElBQU0sU0FBUztZQUNuQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQzdELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRztvQkFDNUMsT0FBTyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FDdEMsU0FBUyxDQUFDLEVBQUUsRUFDWixJQUFJLENBQ0o7b0JBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FDdEMsU0FBUyxDQUFDLEVBQUUsRUFDWixJQUFJLENBQ0o7aUJBQ0QsQ0FBQzthQUNGO1lBRUQsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQy9ELFNBQVMsRUFDVCxJQUFJLENBQ0osQ0FBQztZQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTSw2Q0FBa0IsR0FBekIsVUFDQyxhQUF1QztRQUV2QyxJQUFNLE1BQU0sR0FBNkIsRUFBRSxDQUFDO1FBRTVDLEtBQUssSUFBTSxRQUFRLElBQUksYUFBYSxFQUFFO1lBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQzFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FDdkIsQ0FBQztTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU0sbURBQXdCLEdBQS9CLFVBQ0MsZUFBOEMsRUFDOUMsZUFBaUU7UUFFakUsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQ3JFLGVBQWUsRUFDZixlQUFlLEVBQ2YsSUFBSSxDQUNKLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxvREFBeUIsR0FBaEMsVUFDQyxhQUF3RDtRQUV4RCxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUVPLG9EQUF5QixHQUFqQyxVQUNDLGlCQUEyRCxFQUMzRCxlQUFpRTtRQUVqRSxJQUFNLE1BQU0sR0FBMkQsRUFBRSxDQUFDO1FBRTFFLEtBQUssSUFBTSxRQUFRLElBQUksaUJBQWlCLEVBQUU7WUFDekMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FDL0MsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEVBQzNCLGVBQWUsQ0FDZixDQUFDO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSywrQ0FBb0IsR0FBNUIsVUFBOEIsS0FBMkI7UUFDeEQsSUFBTSx5QkFBeUIsR0FBc0MsRUFBRSxDQUFDO1FBQ3hFLElBQU0scUJBQXFCLEdBQTRDLEVBQUUsQ0FBQztRQUUxRSxJQUFNLFFBQVEsR0FDYixtQkFBUztZQUNSLElBQUkseUJBQXlCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDaEUseUJBQXlCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNuRDtZQUVELHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDO1FBRUgsS0FBSyxJQUFNLFdBQVcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ3hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNDO1FBRUQsS0FBSyxJQUFNLFdBQVcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ3hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNDO1FBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSx5QkFBeUIsRUFBRTtZQUNqRCxJQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV2RixJQUFJLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ25DLFNBQVM7YUFDVDtZQUVELElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFcEYsS0FBOEIsVUFBaUIsRUFBakIsdUNBQWlCLEVBQWpCLCtCQUFpQixFQUFqQixJQUFpQixFQUFFO2dCQUE1QyxJQUFNLGVBQWU7Z0JBQ3pCLGVBQWUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2hEO1lBRUQscUJBQXFCLENBQUMsUUFBUSxDQUFDLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBTSxRQUFRLEdBQXlDLEVBQUUsQ0FBQztRQUUxRCxLQUFLLElBQU0sUUFBUSxJQUFJLHFCQUFxQixFQUFFO1lBQzdDLFFBQVEsQ0FBQyxJQUFJLENBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FDdEMsS0FBSyxFQUNMLFFBQVEsRUFDUix5QkFBeUIsQ0FBQyxRQUFRLENBQUMsRUFDbkMscUJBQXFCLENBQUMsUUFBUSxDQUFDLEVBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVztpQkFDM0IsUUFBUSxDQUNSLFFBQVEsRUFDUixxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FDL0I7aUJBQ0EsTUFBTSxDQUNSLENBQ0QsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLDJDQUFnQixHQUF4QixVQUNDLEdBQVk7UUFEYixpQkEyQkM7UUF4QkEsSUFBTSxVQUFVLEdBQ2Ysa0JBQVE7WUFDUCxLQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUNqQyxvQkFBb0IsRUFDcEIsa0JBQVEsSUFBSSxlQUFRLENBQ25CLFFBQVEsQ0FDUixFQUZXLENBRVgsRUFDRCxLQUFLLENBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUN0QixLQUFLLElBQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUMxQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckI7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDeEI7YUFBTTtZQUNOLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTyx5Q0FBYyxHQUF0QixVQUNDLFdBQTZCLEVBQzdCLFFBQWlCLEVBQ2pCLFFBQWlCO1FBSGxCLGlCQTRHQztRQXZHQSxJQUFNLGNBQWMsR0FBRyxVQUN0QixnQkFBaUMsRUFDakMsYUFBcUIsRUFDckIsYUFBcUI7WUFFckIsS0FBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDakMsa0JBQWtCLEVBQ2xCLGtCQUFRLElBQUksZUFBUSxDQUNuQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGFBQWEsQ0FDYixFQUpXLENBSVgsRUFDRCxLQUFLLENBQ0wsQ0FBQztZQUVGLE9BQU8sS0FBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUM7UUFFRixJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDOUIsS0FBSyxJQUFNLGVBQWUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDL0MsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRXJELEtBQUssSUFBTSxZQUFZLElBQUksVUFBVSxFQUFFO29CQUN0QyxJQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBRTlDLEtBQUssSUFBTSxZQUFZLElBQUksWUFBWSxFQUFFO3dCQUN4QyxjQUFjLENBQ2IsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUN2QixZQUFZLEVBQ1osWUFBWSxDQUNaLENBQUM7cUJBQ0Y7aUJBQ0Q7YUFDRDtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkIsT0FBTztTQUNQO1FBRUQsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzNCLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWpELEtBQUssSUFBTSxZQUFZLElBQUksVUFBVSxFQUFFO2dCQUN0QyxJQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRTlDLEtBQUssSUFBTSxZQUFZLElBQUksWUFBWSxFQUFFO29CQUN4QyxjQUFjLENBQ2IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUNuQixZQUFZLEVBQ1osWUFBWSxDQUNaLENBQUM7aUJBQ0Y7YUFDRDtZQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFckMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRW5CLE9BQU87U0FDUDtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ2hELE9BQU87U0FDUDtRQUVELElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMzQixJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU3RCxLQUFLLElBQU0sWUFBWSxJQUFJLFlBQVksRUFBRTtnQkFDeEMsY0FBYyxDQUNiLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFDbkIsUUFBUSxFQUNSLFlBQVksQ0FDWixDQUFDO2FBQ0Y7WUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUVuQixJQUFJLENBQUMscUNBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2pDO1lBRUQsT0FBTztTQUNQO1FBRUQsY0FBYyxDQUNiLFdBQVcsRUFDWCxRQUFRLEVBQ1IsUUFBUSxDQUNSLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMscUNBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxjQUFjLENBQ2xCLFdBQVcsRUFDWCxRQUFRLENBQ1IsQ0FBQztTQUNGO0lBQ0YsQ0FBQztJQUNGLHVCQUFDO0FBQUQsQ0FBQyxDQXoyRFEsMkJBQWEsR0F5MkRyQjs7OztBQzc2RHVFO0FBRXhFLElBQUssU0FFSjtBQUZELFdBQUssU0FBUztJQUNiLDRCQUFlO0FBQ2hCLENBQUMsRUFGSSxTQUFTLEtBQVQsU0FBUyxRQUViO0FBUUQ7SUFHQyx5QkFDUyxtQkFBd0MsRUFDeEMsV0FBMEI7UUFEMUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUozQixZQUFPLEdBQXVCLEVBQUUsQ0FBQztJQU16QyxDQUFDO0lBRU0sc0NBQVksR0FBbkIsVUFBcUIsaUJBQXdDO1FBQzVELEtBQUssSUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQyxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFbEUsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO2dCQUNsQyxPQUFPLGVBQWUsQ0FBQzthQUN2QjtTQUNEO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVELGtDQUFRLEdBQVIsVUFBVSxlQUFxQztRQUM5QyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV2RCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVELDhCQUFJLEdBQUosVUFBTSxRQUFrRDtRQUN2RCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTdCLEtBQUssSUFBTSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQy9CLEtBQUssSUFBTSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtvQkFDekMsT0FBTyxJQUFJLENBQUM7aUJBQ1o7YUFDRDtTQUNEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRUQsaUNBQU8sR0FBUCxVQUFTLFFBQStDO1FBQ3ZELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFN0IsS0FBSyxJQUFNLFFBQVEsSUFBSSxPQUFPLEVBQUU7WUFDL0IsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3hDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNyQztTQUNEO0lBQ0YsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILGlDQUFPLEdBQVA7UUFDQyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQU0sTUFBTSxHQUFnQyxFQUFFLENBQUM7UUFFL0MsS0FBSyxJQUFNLFFBQVEsSUFBSSxPQUFPLEVBQUU7WUFDL0IsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDeEM7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELDZCQUFHLEdBQUgsVUFBcUMsZUFBa0I7UUFDdEQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDO1FBRTFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNwQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQztJQUNoRSxDQUFDO0lBRUQsK0JBQUssR0FBTCxVQUFPLGVBQXNDO1FBQzVDLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUVsQixPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELHVDQUFhLEdBQWIsVUFBOEMsUUFBc0I7UUFDbkUsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFNLE1BQU0sR0FBeUMsRUFBRSxDQUFDO1FBRXhELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLE1BQU0sQ0FBQztTQUNkO1FBRUQsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELHFDQUFXLEdBQVgsVUFDQyxlQUFxQyxFQUNyQyxRQUFnQixFQUNoQixNQUFjO1FBRWQsSUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUV0QyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELHdCQUF3QjtRQUN4Qix5Q0FBeUM7UUFDekMsT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQztJQUNoRSxDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLHFDQUFXLEdBQVgsVUFDQyxVQUFvQixFQUNwQixRQUFnQixFQUNoQixRQUFzQjtRQUV0QixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7WUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUNuQixPQUFPLENBQUMsT0FBTyxDQUFDLEVBQ2hCLFVBQVUsRUFDVixRQUFRLENBQ1IsRUFBRTtnQkFDRixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QjtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQsZ0RBQXNCLEdBQXRCLFVBQ0MsVUFBb0IsRUFDcEIsUUFBZ0I7UUFFaEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFNLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO1FBRS9DLEtBQUssSUFBTSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQy9CLEtBQUssSUFBTSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN4QyxJQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRW5ELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDbkIsZUFBZSxFQUNmLFVBQVUsRUFDVixRQUFRLENBQ1IsRUFBRTtvQkFDRixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUM3QjthQUNEO1NBQ0Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCw2Q0FBbUIsR0FBbkIsVUFDQyxRQUFzQixFQUN0QixNQUFjO1FBRWQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFNLE1BQU0sR0FBeUMsRUFBRSxDQUFDO1FBRXhELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLE1BQU0sQ0FBQztTQUNkO1FBRUQsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7WUFDOUIsSUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQ3BFLGVBQWUsQ0FBQyxRQUFRLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUM1QixDQUFDO1lBRUYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUN4QixTQUFTO2FBQ1Q7WUFFRCxJQUNDLEtBQUssQ0FBQyxJQUFJO1lBQ1QseUNBQXlDO1lBQ3pDLG1CQUFTLElBQUksZ0JBQVMsQ0FBQyxNQUFNLElBQUksTUFBTSxFQUExQixDQUEwQixDQUN2QyxFQUNBO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDN0I7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILDBDQUFnQixHQUFoQixVQUNDLFFBQXNCLEVBQ3RCLE1BQWdCLEVBQ2hCLE1BQXVCO1FBRXZCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBTSxNQUFNLEdBQXdDO1lBQ25ELE9BQU8sRUFBRSxFQUFFO1lBQ1gsVUFBVSxFQUFFLEVBQUU7WUFDZCxLQUFLLEVBQUUsRUFBRTtTQUNULENBQUM7UUFFRixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxNQUFNLENBQUM7U0FDZDtRQUVELG9DQUFvQztRQUVwQyxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUN0RCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sQ0FDTixDQUFDO1FBRUYsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7WUFDOUIsSUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLElBQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUxRSxzQkFBc0I7WUFDdEIsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO2dCQUN6QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNyQztpQkFBTSxJQUFJLFdBQVcsS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFFO2dCQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNuQztpQkFBTTtnQkFDTixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN4QztTQUNEO1FBRUQsdUNBQXVDO1FBRXZDLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELG9DQUFVLEdBQVYsVUFDQyxRQUFzQixFQUN0QixLQUFzQjtRQUV0QixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7WUFDOUIsSUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXpDLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDbEQsT0FBTyxlQUFlLENBQUM7YUFDdkI7U0FDRDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVELDBDQUFnQixHQUFoQixVQUNDLFFBQXNCLEVBQ3RCLFdBQW1CO1FBRW5CLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdkMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFFRCxLQUFLLElBQU0sT0FBTyxJQUFJLE9BQU8sRUFBRTtZQUM5QixJQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFekMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0JBQ2pELE9BQU8sZUFBZSxDQUFDO2FBQ3ZCO1NBQ0Q7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRCxrQ0FBUSxHQUFSLFVBQ0MsUUFBc0IsRUFDdEIsUUFBZ0I7UUFFaEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFNLE1BQU0sR0FBeUMsRUFBRSxDQUFDO1FBRXhELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLE1BQU0sQ0FBQztTQUNkO1FBRUQsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7WUFDOUIsSUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXpDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO2dCQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQzdCO1NBQ0Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQ7O09BRUc7SUFDSSwwQ0FBZ0IsR0FBdkIsVUFDQyxRQUFzQixFQUN0QixXQUFtQjtRQUVuQixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQU0sTUFBTSxHQUE0QyxFQUFFLENBQUM7UUFFM0QsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxZQUFZLGlDQUFnQixDQUFDLEVBQUU7WUFDN0UsT0FBTyxNQUFNLENBQUM7U0FDZDtRQUVELEtBQUssSUFBTSxPQUFPLElBQUksT0FBTyxFQUFFO1lBQzlCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbEYsS0FBdUIsVUFBUyxFQUFULHVCQUFTLEVBQVQsdUJBQVMsRUFBVCxJQUFTLEVBQUU7Z0JBQTdCLElBQU0sUUFBUTtnQkFDbEIsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsS0FBSyxXQUFXLEVBQUU7b0JBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3RCO2FBQ0Q7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUNGLHNCQUFDO0FBQUQsQ0FBQzs7OztBQ2hZMkI7QUFJa0M7QUFHOUQ7SUFDQyxnQ0FDUyxrQkFBc0MsRUFDdEMsWUFBMEI7UUFEMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUduQyxDQUFDO0lBRU0sa0VBQWlDLEdBQXhDLFVBQTBDLFFBQWtCO1FBQzNELE9BQU8sRUFBQyxPQUFPLEVBQUUsZ0NBQThCLFFBQVEsd0JBQXFCLEVBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLDZDQUFZLEdBQVosVUFDQyxPQUErQixFQUMvQixNQUF1QjtRQUV2QixJQUFNLE1BQU0sR0FBRyxJQUFJLHdDQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1FBRTFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUV2QixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRCwrQ0FBYyxHQUFkLFVBQStDLE9BQWlEO1FBQy9GLE9BQU8sSUFBSSx3Q0FBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsaURBQWdCLEdBQWhCLFVBQW9DLFVBQWE7UUFDaEQsSUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBRXZCLEtBQUssSUFBTSxHQUFHLElBQUksVUFBVSxFQUFFO1lBQzdCLElBQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLEtBQUssVUFBQztZQUVWLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDekIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUN0QixxQ0FBb0M7aUJBQ2hDLElBQUkseUJBQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDdEI7aUJBQU07Z0JBQ04sS0FBSyxHQUFHLEtBQUssQ0FBQzthQUNkO1lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUNwQjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELDRDQUFXLEdBQVgsVUFBYSxPQUErQjtRQUMzQyxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRTlCLElBQUksS0FBSyxDQUFDO1FBRVYsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3BCLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3RCO2FBQU07WUFDTixJQUFNLGFBQWEsR0FBRztnQkFDckIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixLQUFLLEVBQUUsRUFBQyxFQUFFLEVBQUUsV0FBVyxFQUFDO2FBQ3hCLENBQUM7WUFDRixPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBRTdDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUMvQixhQUFhLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FDaEMsT0FBTyxDQUFDLEtBQUssRUFDYixhQUFhLENBQ2IsQ0FBQztTQUNIO1FBRUQsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjthQUN6QyxTQUFTLENBQ1QsS0FBSyxFQUNMLE9BQU8sQ0FBQyxXQUFXLENBQ25CO2FBQ0EsS0FBSyxFQUFFLENBQUM7UUFFVixPQUFPO1lBQ04sTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDdEIsQ0FBQztJQUNILENBQUM7SUFFRCwyQ0FBVSxHQUFWLFVBQ0MsV0FBa0MsRUFDbEMsV0FBMEI7UUFBMUIsOENBQTBCO1FBRTFCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUM5QixXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsS0FBd0IsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7WUFBaEMsSUFBTSxTQUFTO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILDRDQUFXLEdBQVgsVUFDQyxXQUFnQixFQUNoQixRQUFtQztRQUVuQyxJQUFNLGVBQWUsR0FBUSxFQUFFLENBQUM7UUFDaEMsSUFBTSxjQUFjLEdBQVEsRUFBRSxDQUFDO1FBRS9CLEtBQXdCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO1lBQWhDLElBQU0sU0FBUztZQUNuQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDekU7UUFFRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sY0FBYyxDQUFDO1NBQ3RCO1FBRUQsV0FBVyxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBRTVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN2QixDQUFDO0lBQ0YsNkJBQUM7QUFBRCxDQUFDOzs7O0FDMUl1RztBQUd4RztJQUFBO0lBaUJBLENBQUM7SUFmQSxrREFBYyxHQUFkLFVBQ0MsT0FBeUQ7UUFFekQsT0FBTyxJQUFJLDJDQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCw4Q0FBVSxHQUFWLFVBQVksYUFBdUM7UUFDbEQsSUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBRTVCLEtBQTJCLFVBQWEsRUFBYiwrQkFBYSxFQUFiLDJCQUFhLEVBQWIsSUFBYTtZQUFuQyxJQUFNLFlBQVk7WUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQUE7UUFFeEMsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUYsZ0NBQUM7QUFBRCxDQUFDOzs7O0FDakJEO0lBSUMscUJBQ1MsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUovQixVQUFLLEdBQThCLEVBQUUsQ0FBQztRQUN0QyxlQUFVLEdBQWtDLEVBQUUsQ0FBQztJQUsvQyxDQUFDO0lBRUQsK0JBQVMsR0FBVCxVQUNDLFFBQWtCLEVBQ2xCLGNBQThCO1FBRTlCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFekIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ2xDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDckI7UUFFRCxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsSUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUVuQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDbEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLGNBQWMsQ0FBQztTQUNqQztRQUVELE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQ0FBVSxHQUFWLFVBQ0MsUUFBa0IsRUFDbEIsY0FBaUMsRUFDakMsZUFBMEM7UUFFMUMsSUFBTSxNQUFNLEdBQThCLEVBQUUsQ0FBQztRQUU3QyxLQUFLLElBQU0sWUFBWSxJQUFJLGVBQWUsRUFBRTtZQUMzQyxJQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFOUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUUxQixLQUFLLElBQU0sUUFBUSxJQUFJLE9BQU8sRUFBRTtnQkFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQzlDLFlBQVksRUFDWixPQUFPLENBQUMsUUFBUSxDQUFDLENBQ2pCLENBQUM7YUFDRjtTQUNEO1FBRUQsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUQsOEJBQVEsR0FBUixVQUNDLFFBQWtCLEVBQ2xCLGNBQWlDO1FBRWpDLElBQUksY0FBYyxLQUFLLElBQUksRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQy9CLE9BQU87b0JBQ04sTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUNqQyxPQUFPLEVBQUUsRUFBRTtpQkFDWCxDQUFDO2FBQ0Y7WUFFRCxPQUFPO2dCQUNOLE1BQU0sRUFBRSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxJQUFJO2FBQ2IsQ0FBQztTQUNGO1FBRUQsSUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBTSxrQkFBa0IsR0FBcUIsRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyxlQUFlLENBQ25CLFFBQVEsRUFDUixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixDQUNuQixDQUFDO1FBRUYsT0FBTztZQUNOLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsT0FBTyxFQUFFLGtCQUFrQjtTQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELGlDQUFXLEdBQVgsVUFBYSxRQUFrQjtRQUM5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFFRCxnQ0FBVSxHQUFWLFVBQVksUUFBa0I7O1FBQzdCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFekIsZ0JBQVEsR0FBQyxRQUFRLElBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUU7SUFDM0UsQ0FBQztJQUVPLHFDQUFlLEdBQXZCLFVBQ0MsUUFBa0IsRUFDbEIsY0FBa0MsRUFDbEMsa0JBQXNDLEVBQ3RDLG1CQUE4QztRQUU5QyxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FDbEIsUUFBUSxFQUNSLElBQUksRUFDSixrQkFBa0IsRUFDbEIsbUJBQW1CLENBQ25CLENBQUM7UUFFRixLQUE0QixVQUFjLEVBQWQsaUNBQWMsRUFBZCw0QkFBYyxFQUFkLElBQWMsRUFBRTtZQUF2QyxJQUFNLGFBQWE7WUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FDbEIsUUFBUSxFQUNSLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsbUJBQW1CLENBQ25CLENBQUM7U0FDRjtJQUNGLENBQUM7SUFFTyxvQ0FBYyxHQUF0QixVQUNDLFFBQWtCLEVBQ2xCLGFBQStCLEVBQy9CLGtCQUFvQyxFQUNwQyxtQkFBOEM7O1FBRTlDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDcEMsUUFBUSxFQUNSLE1BQU0sQ0FBQyxFQUFFLENBQ1QsQ0FBQztRQUVGLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUNqQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkMsT0FBTztTQUNQO1FBRUQsSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDaEQsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ25DO1FBRUQsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztRQUUxRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqQyxPQUFPO1NBQ1A7UUFFRCxJQUFNLGNBQWMsR0FBcUIsRUFBRSxDQUFDO1FBRTVDLElBQUksQ0FBQyxlQUFlLENBQ25CLGNBQWMsQ0FBQyxRQUFRLEVBQ3ZCLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixDQUNuQixDQUFDO1FBRUYsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPO1NBQ1A7UUFFRCxrQkFBa0IsQ0FBQyxJQUFJLFdBQUUsR0FBQyxNQUFNLENBQUMsRUFBRSxJQUFHLGNBQWMsTUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFTywrQkFBUyxHQUFqQixVQUNDLFFBQWtCLEVBQ2xCLFFBQWdCO1FBRWhCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE9BQU87U0FDUDtRQUVELE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDRixrQkFBQztBQUFELENBQUM7Ozs7QUMzS3lDO0FBRTFDOzs7R0FHRztBQUNIO0lBT0MseUJBQ1MsaUJBQW9DLEVBQ3JDLFFBQXNCLEVBQzdCLGNBQWlDLEVBQzFCLGVBQTBDO1FBSHpDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDckMsYUFBUSxHQUFSLFFBQVEsQ0FBYztRQUV0QixvQkFBZSxHQUFmLGVBQWUsQ0FBMkI7UUFUbEQsaUJBQVksR0FBd0UsRUFBRSxDQUFDO1FBQ3ZGLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQVU1QixJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDNUIsb0dBQW9HO1lBQ3BHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFFekIsS0FBSyxJQUFNLFFBQVEsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ25DO1NBQ0Q7YUFBTTtZQUNOLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7U0FDckM7SUFDRixDQUFDO0lBRUQsNkJBQUcsR0FBSCxVQUFLLFNBQWtDO1FBQ3RDLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUVqQyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDNUMsT0FBTyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixPQUFPLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxDQUFDO1lBQ04sU0FBUyxDQUFDLE1BQU0sQ0FDZixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQsOENBQW9CLEdBQXBCO1FBQ0MsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDaEMsSUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLHdDQUFnQixDQUFDLFlBQVksQ0FBVyxDQUFDLENBQUM7WUFFL0UsT0FBTyxlQUFlLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3ZFO1FBRUQsSUFBTSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztRQUV4QyxLQUFLLElBQU0sV0FBVyxJQUFJLFlBQVksRUFBRTtZQUN2QyxJQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbEQsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO2dCQUM3QixTQUFTO2FBQ1Q7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQ3ZCLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUMvQixhQUFhLENBQ2IsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVPLDZDQUFtQixHQUEzQixVQUNDLE9BQXdDLEVBQ3hDLFdBQTBCO1FBRTFCLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBRTNCLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDeEMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHO29CQUN2QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7b0JBQzNCLFFBQVEsRUFBRSxFQUFFO2lCQUNaLENBQUM7YUFDRjtZQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FDdkIsTUFBTSxDQUFDLFFBQVEsRUFDZixXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUM5QixDQUFDO1NBQ0Y7SUFDRixDQUFDO0lBQ0Ysc0JBQUM7QUFBRCxDQUFDOzs7O0FDMUdEO0lBQ0MsdUJBQ1MsaUJBQW9DLEVBQ3BDLFlBQW1DLEVBQ25DLGNBQXVDLEVBQ3ZDLEtBQWtCLEVBQ2xCLFVBQXNCO1FBSnRCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQXVCO1FBQ25DLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFhO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFFL0IsQ0FBQztJQUVELGlDQUFTLEdBQVQsVUFDQyxRQUFrQixFQUNsQixjQUE4QjtRQUU5QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUMxQixRQUFRLEVBQ1IsY0FBYyxDQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsa0NBQVUsR0FBVixVQUNDLFFBQWtCLEVBQ2xCLGNBQWlDLEVBQ2pDLGVBQTBDO1FBRTFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQzNCLFFBQVEsRUFDUixjQUFjLEVBQ2QsZUFBZSxDQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsaURBQXlCLEdBQXpCLFVBQTJCLFNBQXFCO1FBQy9DLElBQU0sUUFBUSxHQUFzRSxFQUFFLENBQUM7UUFFdkYsS0FBdUIsVUFBUyxFQUFULHVCQUFTLEVBQVQsdUJBQVMsRUFBVCxJQUFTLEVBQUU7WUFBN0IsSUFBTSxRQUFRO1lBQ2xCLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM5QixRQUFRLEVBQ1IsQ0FBQyxJQUFJLENBQUMsQ0FDTixDQUFDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUN0QyxJQUFJLENBQ0osa0JBQVE7WUFDUCxJQUFNLE1BQU0sR0FBaUMsRUFBRSxDQUFDO1lBRWhELEtBQUssSUFBTSxRQUFRLElBQUksUUFBUSxFQUFFO2dCQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDeEQ7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNmLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRCwrQkFBTyxHQUFQLFVBQ0MsUUFBa0IsRUFDbEIsT0FBMEIsRUFDMUIsTUFBd0I7O1FBSHpCLGlCQW9CQztRQWpCQSxvQ0FBVSxNQUFNLEVBQUUsS0FBSyxFQUFDO1FBRXhCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDcEMsUUFBUSxZQUNQLEdBQUMsUUFBUSxJQUFHLE9BQU8sT0FDcEIsTUFBTSxDQUNOO2FBQ0MsSUFBSSxDQUNKLHdCQUFjO1lBQ2IsT0FBTyxLQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FDM0IsUUFBUSxFQUNSLE9BQU8sRUFDUCxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FDbkMsQ0FBQztRQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRCw2QkFBSyxHQUFMLFVBQ0MsUUFBa0IsRUFDbEIsY0FBaUMsRUFDakMsTUFBWTtRQUhiLGlCQTJCQztRQXRCQSxJQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDekMsUUFBUSxFQUNSLGNBQWMsQ0FDZCxDQUFDO1FBRUYsSUFBSSxjQUFjLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0UsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkQ7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2xCLFFBQVEsRUFDUixjQUFjLENBQUMsT0FBTyxFQUN0QixNQUFNLENBQ047YUFDQyxJQUFJLENBQ0oseUJBQWU7WUFDZCxPQUFPLEtBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQzFDLGVBQWUsRUFDZixjQUFjLENBQUMsTUFBTSxDQUNyQixDQUFDLE1BQU0sQ0FBQztRQUNWLENBQUMsQ0FDRCxDQUFDO0lBQ0osQ0FBQztJQUVELGdDQUFRLEdBQVIsVUFBVSxRQUFrQjtRQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNqRTtRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxFQUNSLElBQUksQ0FDSixDQUFDO0lBQ0gsQ0FBQztJQUNGLG9CQUFDO0FBQUQsQ0FBQzs7Ozs7OztBQzFIK0M7QUFHaEQ7SUFTQyxvQkFDVSxTQUF5QixFQUN6QixNQUEwQztRQUExQyxzQ0FBMEM7UUFEMUMsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsV0FBTSxHQUFOLE1BQU0sQ0FBb0M7UUFOcEQsYUFBUSxHQUF3QixJQUFJLENBQUM7UUFDckMsYUFBUSxHQUFvQyxFQUFFLENBQUM7UUFDL0MsV0FBTSxHQUFZLElBQUksQ0FBQztRQU10QixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBRW5CLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQ25CO2FBQU07WUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxxQ0FBZ0IsR0FBRyxRQUFRLENBQUM7WUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxRQUFRLENBQUMsQ0FBQztnQkFDVixNQUFNLENBQUMsUUFBUSxHQUFHLHFDQUFnQixHQUFHLFFBQVEsQ0FBQztTQUMvQztJQUNGLENBQUM7SUFFRCxnQ0FBVyxHQUFYLFVBQWEsUUFBc0IsRUFBRSxRQUF5QztRQUM3RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFDRixpQkFBQztBQUFELENBQUM7Ozs7QUNwQ0QsSUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVsQjtJQXNCQyxtQkFDUyxVQUFzQixFQUN0QixnQkFBa0MsRUFDbkMsUUFBc0I7UUFGckIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ25DLGFBQVEsR0FBUixRQUFRLENBQWM7UUF4QjlCLE9BQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQztRQUlqQixhQUFRLEdBQThCLFdBQVcsQ0FBQztRQUVsRCxTQUFJLEdBQW9DLElBQUksQ0FBQztRQUM3QyxTQUFJLEdBQW9DLEVBQUUsQ0FBQztRQUMzQyxZQUFPLEdBQW9DLEVBQUUsQ0FBQztRQUM5QyxTQUFJLEdBQW9DLEVBQUUsQ0FBQztRQUMzQyxTQUFJLEdBQW9DLEVBQUUsQ0FBQztRQUMzQyxjQUFTLEdBQXNGO1lBQzlGLElBQUksRUFBRSxFQUFFO1lBQ1IsT0FBTyxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBQ0YsYUFBUSxHQUFvQyxFQUFFLENBQUM7UUFDL0MsV0FBTSxHQUFvQyxFQUFFLENBQUM7UUFDN0MsZUFBVSxHQUFvQyxFQUFFLENBQUM7UUFDakQsU0FBSSxHQUFvQyxFQUFFLENBQUM7UUFDM0MsWUFBTyxHQUFvQyxFQUFFLENBQUM7SUFPOUMsQ0FBQztJQUVNLG1DQUFlLEdBQXRCLFVBQXdCLFVBQXNCO1FBQzdDLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUM1QyxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztRQUU3QyxJQUFJLFNBQVMsRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUzQixJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzthQUN2QjtZQUVELHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNCO1NBQ0Q7UUFFRCxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEU7UUFFRCxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzNCO0lBQ0YsQ0FBQztJQUVELDBCQUFNLEdBQU47UUFDQyxJQUFNLFlBQVksR0FBRyxVQUFDLE9BQXFCLElBQUssY0FBTyxDQUFDLEdBQUcsQ0FDMUQsV0FBQyxJQUFJLFFBQUMsQ0FBQyxFQUFFLEVBQUosQ0FBSSxDQUFDLEVBRHFDLENBQ3JDLENBQUM7UUFFWixPQUFPO1lBQ04sSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVELHdDQUFvQixHQUFwQixVQUFzQixPQUEwQjtRQUMvQyxJQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQy9ELElBQUksQ0FBQyxPQUFPLEVBQ1osT0FBTyxDQUNQLENBQUMsTUFBTSxDQUFDO1FBRVQsSUFBSSxDQUFDLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsb0JBQW9CLEtBQUssSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFFRCxnQ0FBWSxHQUFaLFVBQWMsT0FBMEI7UUFDdkMsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQy9CO1FBRUQsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRXBDLElBQUksY0FBYyxLQUFLLElBQUksRUFBRTtZQUM1QixPQUFPLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25EO1FBRUQsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBekIsSUFBTSxNQUFNO1lBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUM3QixNQUFNLEVBQ04sY0FBYyxDQUNkLEVBQUU7Z0JBQ0YsT0FBTyxLQUFLLENBQUM7YUFDYjtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRU8sc0NBQWtCLEdBQTFCLFVBQ0Msb0JBQThDLEVBQzlDLHFCQUFnRCxFQUNoRCxrQkFBMkI7UUFFM0IsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FDN0MsSUFBSSxDQUFDLFFBQVEsRUFDYixvQkFBb0IsQ0FBQyxNQUFNLEVBQzNCLHFCQUFxQixDQUNyQixDQUFDO1FBRUYsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQztRQUUxRSxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRCx1Q0FBbUIsR0FBbkIsVUFBcUIsY0FBaUM7UUFDckQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUN6QyxJQUFJLENBQUMsT0FBTyxFQUNaLGNBQWMsQ0FDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELHdDQUFvQixHQUFwQixVQUFzQixlQUEwQztRQUMvRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQzFDLElBQUksQ0FBQyxRQUFRLEVBQ2IsZUFBZSxDQUNmLENBQUMsTUFBTSxDQUFDO0lBQ1YsQ0FBQztJQUVELHlCQUFLLEdBQUwsVUFBTyxTQUFrQztRQUN4QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFDM0MsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFDN0MsU0FBUyxDQUFDLGtCQUFrQixDQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELDBCQUFNLEdBQU4sVUFDQyxjQUFpQyxFQUNqQyxrQkFBMkIsRUFDM0IsZUFBMEM7UUFFMUMsSUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsSUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFekUsT0FBTztZQUNOLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQzlCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsa0JBQWtCLENBQ2xCO1lBQ0QsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzFDLElBQUksQ0FBQyxRQUFRLEVBQ2Isb0JBQW9CLENBQUMsVUFBVSxFQUMvQixxQkFBcUIsRUFBRSw4REFBOEQ7WUFDckYsS0FBSyxFQUNMLEtBQUssQ0FDTDtTQUNELENBQUM7SUFDSCxDQUFDO0lBQ0YsZ0JBQUM7QUFBRCxDQUFDOzs7O0FDckxEO0lBR0MsMkJBQ1EsY0FBaUM7UUFBakMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBSGpDLFVBQUssR0FBcUMsRUFBRSxDQUFDO0lBTXJELENBQUM7SUFFRCwrQkFBRyxHQUFILFVBQUssU0FBa0M7UUFDdEMsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBRWpDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVM7WUFDbkMsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNGLHdCQUFDO0FBQUQsQ0FBQzs7OztBQ3JCMkI7QUFFeUM7QUFVbkQ7QUFFeUI7QUFLM0M7SUFFQyxvQkFDUyxlQUF5QztRQUF6QyxvQkFBZSxHQUFmLGVBQWUsQ0FBMEI7SUFFbEQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSx1Q0FBa0IsR0FBekIsVUFDQyxVQUFvQixFQUNwQixRQUFrQjtRQUVsQixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVDLElBQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxJQUFNLE1BQU0sR0FBdUIsRUFBRSxDQUFDO1FBRXRDLFFBQVEsYUFBYSxDQUFDLElBQUksRUFBRTtZQUMzQixLQUFLLHdCQUFlLENBQUMsTUFBTTtnQkFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU07WUFDUCxLQUFLLHdCQUFlLENBQUMsU0FBUztnQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEIsTUFBTTtTQUNQO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUQsa0NBQWEsR0FBYixVQUNDLE9BQXlCLEVBQ3pCLFFBQXVCO1FBRXZCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEIsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBekIsSUFBTSxNQUFNO1lBQ2hCLE1BQU0sSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxTQUFTLEdBQUcscUNBQWdCLENBQUM7U0FDN0I7UUFFRCxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDdEIsTUFBTSxJQUFJLHdDQUFtQixHQUFHLFFBQVEsQ0FBQztTQUN6QztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELHlDQUFvQixHQUFwQixVQUFzQixVQUF1QjtRQUM1QyxJQUFNLEdBQUcsR0FBRyx5QkFBTSxFQUFFLENBQUM7UUFFckIsSUFBTSxPQUFPLEdBQUc7WUFDZixPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDakMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzFCLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUNqQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUN4QyxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDdEIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3ZCLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUN2QixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDdEIsQ0FBQztRQUVGLElBQUksVUFBVSxLQUFLLFVBQVUsRUFBRTtZQUM5Qiw4QkFBTSxDQUNMLE9BQU8sRUFDUDtnQkFDQyxXQUFXLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDM0MsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUNwQyxXQUFXLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztnQkFDMUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUMxQixDQUNELENBQUM7U0FDRjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxtQ0FBYyxHQUFkLFVBQWdCLE1BQXNCO1FBQ3JDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNwQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssYUFBYTtnQkFDakIsK0NBQStDO2dCQUMvQyxlQUFlO2dCQUNmLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRCxrQ0FBYSxHQUFiLFVBQWUsTUFBc0I7UUFDcEMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3BCLEtBQUssUUFBUSxDQUFDLENBQUMsdUJBQXVCO1lBQ3RDLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFlBQVk7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRCxnQ0FBVyxHQUFYLFVBQWEsTUFBc0I7UUFDbEMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3BCLEtBQUssS0FBSyxDQUFDLENBQUMsZ0JBQWdCO1lBQzVCLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRCxtQ0FBYyxHQUFkLFVBQWdCLE1BQXNCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxtQ0FBYyxHQUFkLFVBQWdCLE1BQXNCO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUM7SUFDM0MsQ0FBQztJQUVELGlDQUFZLEdBQVosVUFDQyxNQUFzQixFQUN0QixTQUFnQjtRQUFoQiw0Q0FBZ0I7UUFFaEIsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3BCLEtBQUssSUFBSTtnQkFDUixPQUFPLFNBQVMsQ0FBQztZQUNsQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLE1BQU07Z0JBQ1YsT0FBTyxJQUFJLENBQUM7WUFDYjtnQkFDQyxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0YsQ0FBQztJQUVELGlDQUFZLEdBQVosVUFBYyxNQUFzQjtRQUNuQyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDcEIsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxNQUFNO2dCQUNWLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRCxxQ0FBZ0IsR0FBaEIsVUFBa0IsTUFBc0I7UUFDdkMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3BCLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRCxxQ0FBZ0IsR0FBaEIsVUFBa0IsTUFBc0I7UUFDdkMsZ0JBQWdCO1FBQ2hCLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNwQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNoQixPQUFPLElBQUksQ0FBQztZQUNiO2dCQUNDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDRixDQUFDO0lBRUQsc0NBQWlCLEdBQWpCLFVBQW1CLE1BQXNCO1FBQ3hDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNwQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxVQUFVO2dCQUNkLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRCx1Q0FBa0IsR0FBbEIsVUFBb0IsTUFBc0I7UUFDekMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3BCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxZQUFZLENBQUM7WUFDbEIsS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUM7WUFDVixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZLENBQUM7WUFDbEIsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxPQUFPO2dCQUNYLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRCx3Q0FBbUIsR0FBbkIsVUFDQyxNQUFzQixFQUN0QixRQUFnQjtRQUVoQixzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxxQ0FBZ0IsR0FBaEIsVUFBa0IsTUFBc0I7UUFDdkMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDcEIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFVBQVU7Z0JBQ2QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVELHVDQUFrQixHQUFsQixVQUFvQixNQUFzQjtRQUN6QyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDcEIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxNQUFNO2dCQUNWLE9BQU8sSUFBSSxDQUFDO1lBQ2I7Z0JBQ0MsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNGLENBQUM7SUFFRCxxQ0FBZ0IsR0FBaEIsVUFBa0IsTUFBc0I7UUFDdkMsOENBQThDO1FBRTlDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNwQixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssU0FBUztnQkFDYixPQUFPLEdBQUcsQ0FBQztZQUVaLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU07Z0JBQ1YsT0FBTyxHQUFHLENBQUM7WUFFWixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssYUFBYTtnQkFDakIsT0FBTyxDQUFDLENBQUM7WUFFVixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxVQUFVO2dCQUNkLE9BQU8sQ0FBQyxDQUFDO1lBQ1Y7Z0JBQ0MsT0FBTyxDQUFDLENBQUM7U0FDVjtJQUNGLENBQUM7SUFLRCxtQ0FBYyxHQUFkLFVBQWdCLE1BQXNCO1FBQ3JDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNwQixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssT0FBTztnQkFDWCxPQUFPO29CQUNOLEdBQUc7b0JBQ0gsR0FBRztvQkFDSCxHQUFHO2lCQUNILENBQUM7WUFDSCxLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxVQUFVO2dCQUNkLE9BQU87b0JBQ04sR0FBRztvQkFDSCxHQUFHO2lCQUNILENBQUM7WUFDSDtnQkFDQyxPQUFPO29CQUNOLEdBQUc7b0JBQ0gsSUFBSTtpQkFDSixDQUFDO1NBQ0g7SUFDRixDQUFDO0lBRUQsbUNBQWMsR0FBZCxVQUNDLGFBQStCLEVBQy9CLFdBQStCO1FBRS9CLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0RCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ3pDLE1BQU0sQ0FBQyxFQUFFLEVBQ1QsV0FBVyxDQUNYLENBQUM7UUFFRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN2QixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELElBQUksT0FBTyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ2pELE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxLQUEwQixVQUFlLEVBQWYsV0FBTSxDQUFDLFFBQVEsRUFBZixjQUFlLEVBQWYsSUFBZSxFQUFFO1lBQXRDLElBQU0sV0FBVztZQUNyQixhQUFhO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQ3ZCLFdBQVcsRUFDWCxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUNuQyxFQUFFO2dCQUNGLE9BQU8sS0FBSyxDQUFDO2FBQ2I7U0FDRDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVELDJDQUFzQixHQUF0QixVQUF3QixjQUFrQztRQUN6RCxLQUFxQixVQUFjLEVBQWQsaUNBQWMsRUFBZCw0QkFBYyxFQUFkLElBQWMsRUFBRTtZQUFoQyxJQUFNLE1BQU07WUFDaEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3hELE9BQU8sSUFBSSxDQUFDO2FBQ1o7U0FDRDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVELDZDQUF3QixHQUF4QixVQUNDLFFBQWtCLEVBQ2xCLGNBQWtDLEVBQ2xDLGlCQUE0QztRQUU1QyxLQUE0QixVQUFjLEVBQWQsaUNBQWMsRUFBZCw0QkFBYyxFQUFkLElBQWMsRUFBRTtZQUF2QyxJQUFNLGFBQWE7WUFDdkIsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVELElBQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7WUFDdkMsSUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsSUFBSSxjQUFjLFVBQUM7WUFFbkIsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO2dCQUNsQyxPQUFPLEtBQUssQ0FBQzthQUNiO1lBRUQsY0FBYyxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFbEQsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxPQUFPLEtBQUssQ0FBQzthQUNiO1lBRUQsSUFDQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ25CLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUM3QixjQUFjLENBQUMsUUFBUSxFQUN2QixRQUFRLEVBQ1IsaUJBQWlCLENBQ2pCLEVBQ0E7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7YUFDYjtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBSUQsdUNBQWtCLEdBQWxCLFVBQW9CLE9BQTBCO1FBQzdDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsSUFBTSxNQUFNLEdBQXVCLEVBQUUsQ0FBQztRQUV0QyxLQUFxQixVQUFPLEVBQVAsbUJBQU8sRUFBUCxxQkFBTyxFQUFQLElBQU8sRUFBRTtZQUF6QixJQUFNLE1BQU07WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELHNDQUFpQixHQUFqQixVQUFtQixhQUErQjs7UUFDakQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQztTQUNqQjtRQUVELElBQU0sUUFBUSxHQUF1QixFQUFFLENBQUM7UUFFeEMsS0FBMEIsVUFBZSxFQUFmLFdBQU0sQ0FBQyxRQUFRLEVBQWYsY0FBZSxFQUFmLElBQWUsRUFBRTtZQUF0QyxJQUFNLFdBQVc7WUFDckIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUNuRDtRQUVELGdCQUFRLEdBQUMsTUFBTSxDQUFDLEVBQUUsSUFBRyxRQUFRLEtBQUU7SUFDaEMsQ0FBQztJQW9CRDs7Ozs7OztPQU9HO0lBQ0gsd0NBQW1CLEdBQW5CLFVBQ0MsS0FBd0IsRUFDeEIsTUFBeUI7UUFFekIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLDJCQUEyQjtTQUMvQztZQUNDLE9BQU87Z0JBQ04sTUFBTSxFQUFFLElBQUk7Z0JBQ1osVUFBVSxFQUFFLEVBQUU7YUFDZCxDQUFDO1NBQ0Y7UUFFRCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDcEIsT0FBTztnQkFDTixNQUFNLEVBQUUsSUFBSTtnQkFDWixVQUFVLEVBQUUsSUFBSTthQUNoQixDQUFDO1NBQ0Y7UUFFRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBTSxVQUFVLEdBQXVCLEVBQUUsQ0FBQztRQUUxQyxLQUFxQixVQUFNLEVBQU4saUJBQU0sRUFBTixvQkFBTSxFQUFOLElBQU0sRUFBRTtZQUF4QixJQUFNLE1BQU07WUFDaEIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUMxQyxNQUFNLEVBQ04sTUFBTSxDQUNOLENBQUM7WUFFRixJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDN0I7U0FDRDtRQUVELE9BQU87WUFDTixNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxVQUFVO1NBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsdUNBQWtCLEdBQWxCLFVBQ0MsYUFBK0IsRUFDL0IsV0FBK0I7O1FBRS9CLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0RCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ3pDLE1BQU0sQ0FBQyxFQUFFLEVBQ1QsV0FBVyxDQUNYLENBQUM7UUFFRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN2QixXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sYUFBYSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELElBQUksT0FBTyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ2pELFdBQVcsQ0FBQyxXQUFXLENBQUM7Z0JBQ3ZCLEdBQUMsTUFBTSxDQUFDLEVBQUUsSUFBRyxFQUFFO21CQUNmLENBQUM7U0FDRjtRQUVELElBQU0sWUFBWSxHQUFzQixFQUFFLENBQUM7UUFFM0MsS0FBMEIsVUFBZSxFQUFmLFdBQU0sQ0FBQyxRQUFRLEVBQWYsY0FBZSxFQUFmLElBQWUsRUFBRTtZQUF0QyxJQUFNLFdBQVc7WUFDckIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUMxQyxXQUFXO1lBQ1gsYUFBYTtZQUNiLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQ25DLENBQUM7WUFFRixJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDL0I7U0FDRDtRQUVELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELGdCQUFRLEdBQUMsTUFBTSxDQUFDLEVBQUUsSUFBRyxZQUFZLEtBQUU7SUFDcEMsQ0FBQztJQUVELHVDQUFrQixHQUFsQixVQUFvQixhQUErQjtRQUNsRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRTtZQUN0QyxPQUFPLGFBQWEsQ0FBQztTQUNyQjtRQUVELElBQUksUUFBUSxDQUFDO1FBRWIsS0FBSyxRQUFRLElBQUksYUFBYSxFQUFFO1NBQy9CO1FBRUQsT0FBTyxRQUFrQixDQUFDO0lBQzNCLENBQUM7SUFFRCx1Q0FBa0IsR0FBbEIsVUFBb0IsYUFBK0I7UUFDbEQsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7WUFDdEMsT0FBTztnQkFDTixFQUFFLEVBQUUsYUFBYTtnQkFDakIsUUFBUSxFQUFFLEVBQUU7YUFDWixDQUFDO1NBQ0Y7UUFFRCxJQUFJLFFBQVEsQ0FBQztRQUViLEtBQUssUUFBUSxJQUFJLGFBQWEsRUFBRTtTQUMvQjtRQUVELE9BQU87WUFDTixFQUFFLEVBQUUsUUFBa0I7WUFDdEIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFrQixDQUFDO1NBQzNDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHlDQUFvQixHQUFwQixVQUNDLEtBQWdDLEVBQ2hDLE1BQWlDO1FBRWpDLElBQU0sTUFBTSxHQUE4QixFQUFFLENBQUM7UUFDN0MsSUFBTSxVQUFVLEdBQThCLEVBQUUsQ0FBQztRQUVqRCxLQUFLLElBQU0sUUFBUSxJQUFJLEtBQUssRUFBRTtZQUM3QixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ25DLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRW5DLFNBQVM7YUFDVDtZQUVELElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDOUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDaEIsQ0FBQztZQUVGLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ3RDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1NBQzlDO1FBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSxNQUFNLEVBQUU7WUFDOUIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Q7UUFFRCxPQUFPO1lBQ04sTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUUsVUFBVTtTQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCwyQ0FBc0IsR0FBdEIsVUFDQyxLQUF3QixFQUN4QixNQUF5QjtRQUV6QixJQUFNLE1BQU0sR0FBc0IsRUFBRSxDQUFDO1FBQ3JDLElBQU0sVUFBVSxHQUFzQixFQUFFLENBQUM7UUFFekMsS0FBSyxJQUFNLFFBQVEsSUFBSSxLQUFLLEVBQUU7WUFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuQztRQUVELEtBQUssSUFBTSxRQUFRLElBQUksTUFBTSxFQUFFO1lBQzlCLElBQUksaUNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDL0IsU0FBUzthQUNUO1lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsT0FBTztZQUNOLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFLFVBQVU7U0FDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxvQ0FBZSxHQUFmLFVBQWlCLFFBQWdCO1FBQ2hDLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FDeEIsQ0FBQyxFQUNELENBQUMsQ0FDRCxLQUFLLElBQUksQ0FBQztJQUNaLENBQUM7SUFFRCx5Q0FBb0IsR0FBcEIsVUFBc0IsYUFBdUI7UUFDNUMsSUFBTSxPQUFPLEdBQXVCLEVBQUUsQ0FBQztRQUV2QyxLQUFxQixVQUFhLEVBQWIsK0JBQWEsRUFBYiwyQkFBYSxFQUFiLElBQWEsRUFBRTtZQUEvQixJQUFNLE1BQU07WUFDaEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNqQyxTQUFTO2FBQ1Q7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFDOUIsT0FBTyxDQUNQLENBQUM7U0FDRjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxzQ0FBaUIsR0FBakIsVUFBbUIsWUFBb0I7UUFDdEMsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLHdDQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHFDQUFnQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELHdDQUFtQixHQUFuQixVQUNDLGtCQUE0QixFQUM1QixXQUErQjs7UUFFL0IsSUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ3ZDLFFBQVEsRUFDUixXQUFXLENBQ1gsQ0FBQztRQUVGLElBQUksTUFBTSxFQUFFO1lBQ1gsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZCLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDM0I7WUFFRCxPQUFPO1NBQ1A7UUFFRCxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN2QixXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksV0FBRSxHQUFDLFFBQVEsSUFBRyxFQUFFLE1BQUUsR0FBRyxDQUFDLENBQUM7U0FDckQ7YUFBTSxJQUFJLE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUN4RCxXQUFXLENBQUMsV0FBVyxDQUFDLGFBQUksR0FBQyxRQUFRLElBQUcsRUFBRSxLQUFDLENBQUM7U0FDNUM7UUFFRCxhQUFhO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixDQUN2QixrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzNCLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxzQ0FBaUIsR0FBakIsVUFDQyxRQUFnQixFQUNoQixjQUFrQztRQUVsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFakMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUNqRCxPQUFPLENBQUMsQ0FBQzthQUNUO1NBQ0Q7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNGLGlCQUFDO0FBQUQsQ0FBQzs7OztBQ2x3QkQ7Ozs7OztHQU1HO0FBQ0g7SUFFQyw4QkFDUyxVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBRS9CLENBQUM7SUFFTSx1REFBd0IsR0FBL0IsVUFDQyxRQUFrQixFQUNsQixNQUFjLEVBQ2QsUUFBeUIsRUFDekIsV0FBd0I7UUFEeEIsMkNBQXlCO1FBR3pCLElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUV2QyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7UUFFckMsSUFBSSxRQUFRLEVBQUU7WUFDYixJQUFJLENBQUMsd0JBQXdCLENBQzVCLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLE1BQU0sQ0FDTixDQUFDO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTSx1REFBd0IsR0FBL0IsVUFDQyxVQUFvQixFQUNwQixRQUFnQixFQUNoQixXQUF3QixFQUN4QixhQUFrQztRQUVsQyxJQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUU1RCxLQUFLLElBQU0sUUFBUSxJQUFJLEtBQUssRUFBRTtZQUM3QixJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFaEMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUMxQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQzdCO1lBRUQsS0FBd0IsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7Z0JBQTVCLElBQU0sU0FBUztnQkFDbkIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBRWxFLElBQUksQ0FBQyx3QkFBd0IsQ0FDNUIsUUFBUSxFQUNSLFNBQVMsRUFDVCxXQUFXLEVBQ1gsYUFBYSxDQUNiLENBQUM7YUFDRjtTQUNEO0lBQ0YsQ0FBQztJQUVNLGtEQUFtQixHQUExQixVQUNDLFNBQW9CLEVBQ3BCLGFBQWtDLEVBQ2xDLFNBQWtCO1FBRWxCLElBQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUVoQyxJQUFJLGtCQUFrQixDQUFDO1FBRXZCLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUMxQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzdCO1FBRUQsa0JBQWtCLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzdDLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEM7UUFFRCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDNUIsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDekM7UUFFRCxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sdURBQXdCLEdBQS9CLFVBQ0MsV0FBa0MsRUFDbEMsYUFBa0M7UUFFbEMsS0FBd0IsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7WUFBaEMsSUFBTSxTQUFTO1lBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FDdkIsU0FBUyxFQUNULGFBQWEsQ0FDYixDQUFDO1NBQ0Y7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN0QixDQUFDO0lBRU0saURBQWtCLEdBQXpCLFVBQ0MsUUFBa0IsRUFDbEIsTUFBYyxFQUNkLEdBQXdCO1FBRXhCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxPQUFPLFNBQVMsQ0FBQztTQUNqQjtRQUVELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLCtDQUFnQixHQUF2QixVQUNDLE1BQThCLEVBQzlCLFdBQW1DLEVBQ25DLFdBQTRDLEVBQzVDLGFBQWtDLEVBQ2xDLE1BQThCO1FBQTlCLHNDQUE4QjtRQUU5QixLQUFxQixVQUFXLEVBQVgsMkJBQVcsRUFBWCx5QkFBVyxFQUFYLElBQVcsRUFBRTtZQUE3QixJQUFNLE1BQU07WUFDaEIsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBRW5DLDBGQUEwRjtZQUMxRixJQUFJLFFBQVEsVUFBQztZQUViLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDaEUsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO29CQUNwQixRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDekI7YUFDRDtpQkFBTTtnQkFDTixRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNqQyxTQUFTLENBQUMsUUFBUSxFQUNsQixNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLGFBQWEsQ0FDYixDQUFDO2FBQ0Y7WUFFRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7YUFDakM7U0FDRDtJQUNGLENBQUM7SUFDRiwyQkFBQztBQUFELENBQUM7Ozs7QUMzSmdDO0FBRWpDO0lBSUMsdUJBQ1MsWUFBMEIsRUFDMUIsVUFBc0IsRUFDdEIsNkJBQTRELEVBQzVELFdBQThCLEVBQzlCLFdBQTZCLEVBQzdCLGVBQXVCO1FBQXZCLHlEQUF1QjtRQUx2QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBK0I7UUFDNUQsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixvQkFBZSxHQUFmLGVBQWUsQ0FBUTtRQVJoQyxhQUFRLEdBQTRDLEVBQUUsQ0FBQztJQVV2RCxDQUFDO0lBRUQsdUNBQWUsR0FBZixVQUFpQixlQUFpRDtRQUNqRSxJQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN2RixJQUFNLGVBQWUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBRWhELEtBQThCLFVBQWlCLEVBQWpCLHVDQUFpQixFQUFqQiwrQkFBaUIsRUFBakIsSUFBaUIsRUFBRTtZQUE1QyxJQUFNLGVBQWU7WUFDekIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEQ7UUFFRCxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFeEQsT0FBTyxlQUFlLENBQUM7SUFDeEIsQ0FBQztJQUVELHdDQUFnQixHQUFoQixVQUNDLFVBQW9CLEVBQ3BCLFlBQThDO1FBRTlDLElBQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFFckMsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzFCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNoQyxPQUFPLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUV0QixPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFTSwyQkFBRyxHQUFWO1FBQ0MsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVyQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsS0FBSyxJQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUU7Z0JBQ3JDLElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFMUMsS0FBSyxJQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7b0JBQ2pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ3hDLFNBQVM7cUJBQ1Q7b0JBRUQsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBRWpELElBQUksQ0FBQyxhQUFhLENBQ2pCLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUNwQixVQUFVLEVBQ1YsZUFBZSxDQUNmLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ3BCLGVBQWUsQ0FDZixDQUFDO29CQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztpQkFDMUQ7YUFDRDtTQUNEO2FBQU07WUFDTixLQUFLLElBQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtnQkFDckMsSUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxQyxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDakQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUN0QyxVQUFVLEVBQ1YsZUFBZSxDQUNmLENBQUM7Z0JBRUYsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUV6QixLQUFLLElBQU0sUUFBUSxJQUFJLFNBQVMsRUFBRTtvQkFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDeEMsU0FBUztxQkFDVDtvQkFFRCxJQUFJLENBQUMsYUFBYSxDQUNqQixTQUFTLENBQUMsUUFBUSxDQUFDLEVBQ25CLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDNUIsZUFBZSxDQUNmLENBQUM7b0JBRUYsWUFBWSxHQUFHLElBQUksQ0FBQztpQkFDcEI7Z0JBRUQsSUFBSSxZQUFZLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztpQkFDMUQ7YUFDRDtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3RCLENBQUM7SUFFRCx5Q0FBaUIsR0FBakI7UUFDQyxPQUFPO1lBQ04sT0FBTyxFQUFFO2dCQUNSLFdBQVcsRUFBRSxRQUFRO2dCQUNyQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxPQUFPLEVBQUUsRUFBRTthQUNYO1lBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUU7WUFDdkQsS0FBSyxFQUFFLEVBQUU7WUFDVCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRTtTQUN0RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFDQUFhLEdBQXJCLFVBQ0MsVUFBd0MsRUFDeEMsZUFBOEIsRUFDOUIsV0FBNkM7UUFFN0MsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBRXZDLEtBQUssSUFBTSxRQUFRLElBQUksVUFBVSxFQUFFO1lBQ2xDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBd0IsQ0FBQzthQUM1QztZQUVELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDekMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDN0I7WUFFRCxLQUFLLElBQU0sTUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDMUMsSUFBTSxtQkFBbUIsR0FBd0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5RSxJQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBRTVDLElBQU0sWUFBWSxHQUFHLCtCQUFPLENBQzNCLElBQUksQ0FBQyxXQUFXLEVBQ2hCO29CQUNDLFFBQVE7b0JBQ1IsU0FBUyxDQUFDLE1BQU07aUJBQ2hCLENBQ0QsQ0FBQztnQkFDRixJQUFNLFdBQVcsR0FBUSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3hFLElBQU0sVUFBVSxHQUFHLCtCQUFPLENBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQ3JDO29CQUNDLFFBQVE7b0JBQ1IsU0FBUyxDQUFDLE1BQU07aUJBQ2hCLENBQ0QsQ0FBQztnQkFFRixJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUU7b0JBQzVCLE9BQU8sQ0FBQyxRQUF1QyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxlQUFlLENBQUM7aUJBQ3JGO2dCQUVELFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFOUMsMEJBQTBCO2dCQUMxQiw2Q0FBNkM7Z0JBRTdDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7Z0JBRTNDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FDeEQsbUJBQW1CLENBQUMsTUFBTSxFQUMxQixTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdEIsQ0FBQztnQkFFRixXQUFXLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztnQkFFcEMsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO29CQUMvQixTQUFTO2lCQUNUO2dCQUVELElBQU0sS0FBSyxHQUFtQyxXQUFXLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFFckUsS0FBSyxJQUFNLFNBQVMsSUFBSSxZQUFZLEVBQUU7b0JBQ3JDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBRXRCLEtBQUssSUFBTSxPQUFPLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUM5QyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FDN0IsT0FBTyxFQUNQLEVBQUUsQ0FDRixDQUFDLENBQUM7cUJBQ0g7aUJBQ0Q7Z0JBRUQsSUFBSSxDQUFDLGFBQWEsQ0FDakIsWUFBWSxFQUNaLElBQUksRUFDSixXQUFXLENBQ1gsQ0FBQzthQUNGO1NBQ0Q7SUFDRixDQUFDO0lBQ0Ysb0JBQUM7QUFBRCxDQUFDOzs7Ozs7O0FDNU15QztBQUUxQyxJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDcEIsc0JBQVM7SUFDVCx3QkFBVztBQUNaLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUlELElBQVksV0FRWDtBQVJELFdBQVksV0FBVztJQUN0QiwyQkFBWTtJQUNaLGdDQUFpQjtJQUNqQiw4QkFBZTtJQUNmLDhCQUFlO0lBQ2Ysd0NBQXlCO0lBQ3pCLHdDQUF5QjtJQUN6Qix3QkFBUztBQUNWLENBQUMsRUFSVyxXQUFXLEtBQVgsV0FBVyxRQVF0QjtBQUlEO0lBRUMseUJBQ1csS0FBZTtRQUFmLFVBQUssR0FBTCxLQUFLLENBQVU7SUFFMUIsQ0FBQztJQUVNLCtCQUFLLEdBQVosVUFBYyxLQUE0QjtRQUE1QixnQ0FBa0IsSUFBSSxDQUFDLEtBQUs7UUFDekMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FDN0IsS0FBSyxDQUFDLFFBQVEsRUFDZCxLQUFLLENBQUMsS0FBSyxFQUNYLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FDVCxDQUFDO1NBQ0Y7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUMzQixLQUFLLENBQUMsTUFBTSxFQUNaLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLEtBQUssQ0FBQyxHQUFHLENBQ1QsQ0FBQztTQUNGO1FBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDM0IsS0FBSyxDQUFDLE1BQU0sRUFDWixLQUFLLENBQUMsR0FBRyxDQUNULENBQUM7U0FDRjtRQUVELElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQzVCLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLEtBQUssQ0FBQyxRQUFRLEVBQ2QsS0FBSyxDQUFDLEdBQUcsQ0FDVCxDQUFDO1NBQ0Y7UUFFRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUM3QixLQUFLLENBQUMsR0FBRyxFQUNULEtBQUssQ0FBQyxRQUFRLEVBQ2QsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsS0FBSyxFQUNYLEtBQUssQ0FBQyxHQUFHLENBQ1QsQ0FBQztTQUNGO1FBRUQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUM1QixJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQ3BDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FDeEIsS0FBSyxDQUFDLEdBQUcsRUFDVCxLQUFLLENBQUMsS0FBSyxFQUNYLEtBQUssQ0FBQyxHQUFHLENBQ1QsQ0FBQzthQUNGO1lBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQzNCLEtBQUssQ0FBQyxHQUFHLEVBQ1QsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsVUFBVSxFQUNoQixLQUFLLENBQUMsR0FBRyxDQUNULENBQUM7U0FDRjtRQUVELElBQU0sR0FBRyxHQUFHLHdDQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUM5QjtRQUVELElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QixzQ0FBc0M7UUFDdEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLE1BQU0sRUFBRTtZQUNoRixPQUFPLElBQUksQ0FBQyxhQUFhLENBQ3hCLEdBQUcsRUFDSCxLQUFLLEVBQ0wsS0FBSyxDQUNMLENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUMzQixHQUFHLEVBQ0gsS0FBSyxFQUNMLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLEtBQUssQ0FBQyxHQUFHLENBQ1QsQ0FBQztJQUNILENBQUM7SUFnREYsc0JBQUM7QUFBRCxDQUFDOzs7OztBQzdKbUU7QUFFcEU7SUFDUyxxRUFBbUM7SUFFM0MsOEJBQ1MsVUFBc0IsRUFDdEIsUUFBa0IsRUFDMUIsS0FBZTtRQUhoQixZQUtDLGtCQUFNLEtBQUssQ0FBQyxTQUNaO1FBTFEsZ0JBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsY0FBUSxHQUFSLFFBQVEsQ0FBVTs7SUFJM0IsQ0FBQztJQUVTLDhDQUFlLEdBQXpCO1FBQ0MsT0FBTyxFQUFFLENBQUM7SUFDWCxDQUFDO0lBRVMsNENBQWEsR0FBdkIsVUFDQyxHQUFXLEVBQ1gsUUFBZ0IsRUFDaEIsSUFBcUI7O1FBQXJCLG1DQUFxQjtRQUVyQixPQUFPLFdBQUUsR0FBQyxHQUFHLElBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFUyxpREFBa0IsR0FBNUIsVUFDQyxJQUFZLEVBQ1osU0FBbUIsRUFDbkIsTUFBYyxFQUNkLE1BQWdCLEVBQ2hCLElBQWE7UUFFYixPQUFPLEVBQUUsQ0FBQztRQUNWLG9KQUFvSjtJQUNySixDQUFDO0lBRVMsK0NBQWdCLEdBQTFCLFVBQ0MsTUFBVyxFQUNYLElBQWE7UUFFYixPQUFPLEVBQUUsQ0FBQztJQUNYLENBQUM7SUFFUywrQ0FBZ0IsR0FBMUIsVUFDQyxPQUFlLEVBQ2YsV0FBZ0IsRUFDaEIsSUFBcUI7UUFBckIsbUNBQXFCO1FBRXJCLE9BQU8sRUFBRSxDQUFDO0lBQ1gsQ0FBQztJQUVTLCtDQUFnQixHQUExQixVQUNDLEdBQVcsRUFDWCxNQUFXLEVBQ1gsV0FBOEIsRUFDOUIsSUFBYztRQUVkLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFUyxpREFBa0IsR0FBNUIsVUFDQyxRQUFhLEVBQ2IsTUFBaUMsRUFDakMsUUFBeUIsRUFDekIsSUFBcUI7UUFGckIsa0NBQW1CLEVBQWM7UUFDakMsMkNBQXlCO1FBQ3pCLG1DQUFxQjtRQUVyQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQ3hDLFFBQVEsRUFDUixJQUFJLENBQUMsUUFBUSxDQUNiLENBQUM7SUFDSCxDQUFDO0lBRVMsZ0RBQWlCLEdBQTNCLFVBQ0MsVUFBaUIsRUFDakIsU0FBMEIsRUFDMUIsSUFBYztRQUVkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sOENBQWUsR0FBdkIsVUFBeUIsVUFBaUI7UUFBMUMsaUJBVUM7UUFUQSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQ3ZCLFVBQ0MsV0FBVyxFQUNYLFNBQVMsSUFDTCxrQkFBVyxDQUFDLE1BQU0sQ0FDdEIsS0FBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FDckIsRUFGSSxDQUVKLEVBQ0QsRUFBRSxDQUNGLENBQUM7SUFDSCxDQUFDO0lBRUYsMkJBQUM7QUFBRCxDQUFDLENBekZRLCtCQUFlLEdBeUZ2Qjs7OztBQy9FOEQ7QUFDN0I7QUFFa0Q7QUFFcEY7SUFVQywrQkFDVyxzQkFBOEMsRUFDOUMsVUFBc0IsRUFDdEIsNkJBQTRELEVBQ3RFLHNCQUE4QyxFQUNwQyxXQUEwQjtRQUoxQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsa0NBQTZCLEdBQTdCLDZCQUE2QixDQUErQjtRQUU1RCxnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQVg5QixzQkFBaUIsR0FJcEIsRUFBRSxDQUFDO1FBU04sSUFBSSxDQUFDLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQzlDLElBQUksQ0FBQyxXQUFXLENBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRU0sb0RBQW9CLEdBQTNCLFVBQ0MsUUFBc0IsRUFDdEIsV0FBbUIsRUFDbkIsV0FBMkM7UUFFM0MsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ25ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDdEM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsV0FBVyxDQUFDO0lBQzdELENBQUM7SUFFTSxvREFBb0IsR0FBM0IsVUFDQyxRQUFzQixFQUN0QixXQUFtQjtRQUVuQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDbkQsT0FBTyxTQUFTLENBQUM7U0FDakI7UUFFRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0kscURBQXFCLEdBQTVCLFVBQ0MsUUFBc0IsRUFDdEIsT0FBK0I7UUFFL0IsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUM3RSxRQUFRLEVBQ1IsT0FBTyxDQUNQLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsb0JBQW9CLENBQ3hCLGVBQWUsQ0FBQyxRQUFRLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUM1QixFQUFFLENBQ0YsQ0FBQztRQUVGLElBQU0saUJBQWlCLEdBQUcsSUFBSSwrREFBK0IsQ0FDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUN6QyxJQUFJLENBQUMsV0FBVyxFQUNoQixVQUFDLFdBQXFCLElBQUssa0JBQVcsS0FBSyxlQUFlLENBQUMsUUFBUTtZQUNsRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQXNCO1lBQ3hDLENBQUMsQ0FBQyxFQUFFLEVBRnNCLENBRXRCLENBQ0wsQ0FBQztRQUVGLElBQU0sWUFBWSxHQUFvQixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFN0UsS0FBMEIsVUFBWSxFQUFaLDZCQUFZLEVBQVosMEJBQVksRUFBWixJQUFZLEVBQUU7WUFBbkMsSUFBTSxXQUFXO1lBQ3JCLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFNUYsS0FBd0IsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7Z0JBQWhDLElBQU0sU0FBUztnQkFDbkIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FDekQsU0FBUyxDQUFDLEVBQUUsRUFDWixLQUFLLENBQ0wsQ0FBQztnQkFFRixpQkFBaUIsQ0FBQyxNQUFNLENBQ3ZCLFNBQVMsRUFDVCxPQUFPLENBQ1AsQ0FBQzthQUNGO1NBQ0Q7UUFFRCxpQkFBaUIsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBRWxELE9BQU8sZUFBZSxDQUFDO0lBQ3hCLENBQUM7SUFtREQ7Ozs7T0FJRztJQUNPLGtFQUFrQyxHQUE1QyxVQUNDLGVBQW9DLEVBQ3BDLFdBQThELEVBQzlELGlCQUFtRCxFQUNuRCx5QkFBa0M7UUFFbEMsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1A7UUFFRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ3hDLGVBQWUsQ0FBQyxRQUFRLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUM1QixDQUFDO1FBRUYsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzFCLE9BQU87U0FDUDtRQUVELElBQU0sZ0JBQWdCLEdBQWdCLEVBQUUsQ0FBQztRQUV6QyxLQUF3QixVQUFXLEVBQVgsMkJBQVcsRUFBWCx5QkFBVyxFQUFYLElBQVcsRUFBRTtZQUFoQyxJQUFNLFNBQVM7WUFDbkIsSUFDQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzttQkFDOUIsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEVBQzlCO2dCQUNELFNBQVM7YUFDVDtZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQ3pDLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIseUJBQXlCLENBQ3pCLENBQUM7SUFDSCxDQUFDO0lBUU0sc0VBQXNDLEdBQTdDLFVBQ0MsZUFBZ0MsRUFDaEMsT0FBaUIsRUFDakIseUJBQTBDO1FBQTFDLDZFQUEwQztRQUUxQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sRUFBRSxDQUFDO1NBQ1Y7UUFFRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ3hDLGVBQWUsQ0FBQyxRQUFRLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUM1QixDQUFDO1FBRUYsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzFCLE9BQU87U0FDUDtRQUVELElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FDakUsT0FBTyxFQUNQLG1CQUFTLElBQUksUUFBQywrQkFBTyxDQUNwQixTQUFTLENBQUMsTUFBTSxFQUNoQixPQUFPLENBQ1AsRUFIWSxDQUdaLENBQ0QsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGdDQUFnQyxDQUMzQyxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHlCQUF5QixDQUN6QixDQUFDO0lBQ0gsQ0FBQztJQVFEOzs7O09BSUc7SUFDTyw2REFBNkIsR0FBdkMsVUFDQyxRQUFrQixFQUNsQixPQUErQixFQUMvQixLQUFlO1FBRWYsSUFBTSxlQUFlLEdBQUcsSUFBSSx5Q0FBb0IsQ0FDL0MsSUFBSSxDQUFDLFVBQVUsRUFDZixRQUFRLEVBQ1IsS0FBSyxDQUNMLENBQUM7UUFFRixPQUFPLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUvQyxpREFBaUQ7UUFDakQsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtZQUM3QixPQUFPO1NBQ1A7UUFFRCxJQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUU5RSxzQkFBc0IsQ0FBQyx3QkFBd0IsQ0FDOUMsUUFBUSxFQUNSLE9BQU8sQ0FBQyxPQUFPLENBQ2YsQ0FBQztRQUVGLHNCQUFzQixDQUFDLHdCQUF3QixDQUM5QyxRQUFRLEVBQ1IsT0FBTyxDQUFDLFlBQVksQ0FDcEIsQ0FBQztRQUVGLE9BQU8sQ0FBQyxPQUFPLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNGLDRCQUFDO0FBQUQsQ0FBQzs7Ozs7QUNuUnVCO0FBY21CO0FBQ3NCO0FBSWpFO0lBQ1Msd0VBQXFCO0lBRTdCLGlDQUNTLHdCQUFrRCxFQUNsRCxvQkFBMEMsRUFDbEQsNkJBQTRELEVBQ3BELHNCQUE4QyxFQUM5QyxpQkFBb0MsRUFDNUMsc0JBQThDLEVBQzlDLHNCQUE4QyxFQUN0Qyx3QkFBa0QsRUFDbEQsWUFBbUMsRUFDbkMsV0FBOEIsRUFDOUIsY0FBdUMsRUFDdkMsWUFBMEIsRUFDbEMsVUFBc0IsRUFDWixXQUF3QjtRQWRuQyxZQWdCQyxrQkFDQyxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLDZCQUE2QixFQUM3QixzQkFBc0IsRUFDdEIsV0FBVyxDQUNYLFNBQ0Q7UUF0QlEsOEJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCwwQkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBRTFDLDRCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsdUJBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUdwQyw4QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELGtCQUFZLEdBQVosWUFBWSxDQUF1QjtRQUNuQyxpQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsb0JBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLGtCQUFZLEdBQVosWUFBWSxDQUFjO1FBRXhCLGlCQUFXLEdBQVgsV0FBVyxDQUFhOztJQVNuQyxDQUFDO0lBRU0seURBQXVCLEdBQTlCLFVBQ0MsUUFBc0IsRUFDdEIsS0FBZSxFQUNmLE9BQXlCO1FBSDFCLGlCQWtCQztRQWJBLE9BQU8sSUFBSTthQUNULG9CQUFvQixDQUNwQixRQUFRLEVBQ1IsSUFBSSw2QkFBc0IsQ0FBQztZQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLEtBQUssRUFBRSxLQUFLO1NBQ1osQ0FBQyxDQUNGO2FBQ0EsSUFBSSxDQUNKLHlCQUFlLElBQUksWUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUE5RSxDQUE4RSxFQUNqRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTSxzREFBb0IsR0FBM0I7UUFBQSxpQkFLQztRQUpBLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FDN0MsSUFBSSxDQUFDLFdBQVcsRUFDaEIsa0JBQVEsSUFBSSxZQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBcEMsQ0FBb0MsQ0FDaEQsQ0FBQztJQUNILENBQUM7SUFFTSxzREFBb0IsR0FBM0IsVUFDQyxRQUFzQixFQUN0QixPQUErQjtRQUUvQixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyw2QkFBNkIsQ0FDakMsUUFBUSxFQUNSLE9BQU8sRUFDUCxXQUFXLENBQUMsTUFBTSxDQUNsQixDQUFDO1FBRUYsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFlLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDOUIsUUFBUSxFQUNSLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsV0FBVyxDQUNYLENBQUM7SUFDSCxDQUFDO0lBRU0sOERBQTRCLEdBQW5DLFVBQ0MsVUFBb0IsRUFDcEIsYUFBMEMsRUFDMUMsUUFBc0IsRUFDdEIsT0FBK0I7UUFFL0IsSUFBTSxRQUFRLEdBQTRELEVBQUUsQ0FBQztRQUU3RSxJQUFJLHlCQUFVLENBQWlCLGFBQWEsQ0FBQyxFQUFFO1lBQzlDLGFBQWEsR0FBRyxhQUFhLEVBQUUsQ0FBQztTQUNoQztRQUVELEtBQXVCLFVBQWEsRUFBYiwrQkFBYSxFQUFiLDJCQUFhLEVBQWIsSUFBYSxFQUFFO1lBQWpDLElBQU0sUUFBUTtZQUNsQixJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUMxRCxPQUFPLEVBQ1A7Z0JBQ0MsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2FBQ2hCLENBQ0QsQ0FBQztZQUNGLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFeEUsSUFBSSxDQUFDLDZCQUE2QixDQUNqQyxRQUFRLEVBQ1IsVUFBVSxFQUNWLFdBQVcsQ0FBQyxNQUFNLENBQ2xCLENBQUM7WUFFRiw2RkFBNkY7WUFDN0YsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0RixRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUM1QyxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixXQUFXLENBQ1gsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sdURBQXFCLEdBQTVCLFVBQ0MsZUFBb0MsRUFDcEMsYUFBNEI7O1FBRTVCLElBQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3hFLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUNsRCxhQUFhLEVBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQzVCLElBQUk7YUFDRixvQkFBb0IsQ0FDcEIsZUFBZSxDQUFDLFFBQVEsRUFDeEIsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQzNCO2FBQ0QsR0FBRyxDQUNILG1CQUFTLElBQUksZ0JBQVMsQ0FBQyxNQUFNLEVBQWhCLENBQWdCLENBQzdCLENBQ0YsQ0FDRCxDQUFDO1FBRUYsSUFBSSxDQUFDLDZCQUE2QixDQUNqQyxlQUFlLENBQUMsUUFBUSxFQUN4QixlQUFlLENBQUMsT0FBTyxFQUN2QixhQUFhLENBQ2IsQ0FBQztRQUVGLElBQUksT0FBTyxDQUFDO1FBRVosSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDM0MsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQy9DO2dCQUNDLFdBQVcsRUFBRSxPQUFPO2dCQUNwQixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVE7Z0JBQ2xDLE9BQU8sWUFBRyxHQUFDLGVBQWUsQ0FBQyxRQUFRLElBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUM7Z0JBQ3RFLEtBQUssRUFBRSxhQUFhO2dCQUNwQixLQUFLLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2FBQ3BDLENBQ0QsQ0FBQztTQUNGO2FBQU07WUFDTixPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FDL0MsZUFBZSxDQUFDLFFBQVEsRUFDeEIsU0FBUyxFQUNULGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUMvQixDQUFDO1NBQ0Y7UUFFRCxlQUFlLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUVsQyxPQUFPLENBQUMsSUFBSSxDQUNYO1lBQ0MsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBQ2hDLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztRQUVGLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FDbEI7WUFDQyxPQUFPLGVBQWUsQ0FBQztRQUN4QixDQUFDLENBQ0QsQ0FBQztJQUNILENBQUM7SUFFTSx5REFBdUIsR0FBOUIsVUFDQyxVQUFvQixFQUNwQixRQUFzQixFQUN0QixXQUEwQyxFQUMxQyxpQkFBcUM7UUFKdEMsaUJBMkNDO1FBckNBLElBQUksaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzdDO1FBRUQsSUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBRW5DLDRCQUE0QjtRQUU1QixLQUFLLElBQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtZQUNuQyxJQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRXBELGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuRDtRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDckIsMEJBQTBCLENBQzFCLFVBQVUsRUFDVixhQUFhLEVBQ2IsUUFBUSxFQUNSLElBQUksRUFDSixpQkFBaUIsQ0FDakI7YUFDQSxJQUFJLENBQ0osa0JBQVE7WUFDUCxJQUFNLGVBQWUsR0FBRyxLQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUM1RCxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUM3QixDQUFDO1lBRUYsS0FBdUIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7Z0JBQWpDLElBQU0sUUFBUTtnQkFDbEIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDM0Q7WUFFRCxPQUFPLFdBQVcsQ0FBQztRQUNwQixDQUFDLENBQ0QsQ0FBQztJQUNKLENBQUM7SUFFTSx5REFBdUIsR0FBOUIsVUFDQyxVQUFvQixFQUNwQixRQUFrQixFQUNsQixPQUErQixFQUMvQixhQUE0QixFQUM1QixXQUFjO1FBRWQsSUFBSSxDQUFDLHFDQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xDO1FBRUQsSUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksV0FBVyxHQUFhLEVBQUUsQ0FBQztRQUUvQixPQUFPLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFekQsS0FBSyxJQUFNLFFBQVEsSUFBSSxXQUFXLEVBQUU7WUFDbkMsSUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUVwRCxlQUFlLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FDL0IsSUFBSTtpQkFDRixvQkFBb0IsQ0FDcEIsZUFBZSxDQUFDLFFBQVEsRUFDeEIsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQzNCO2lCQUNELEdBQUcsQ0FDSCxtQkFBUyxJQUFJLGdCQUFTLENBQUMsTUFBTSxFQUFoQixDQUFnQixDQUM3QixDQUNGLENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDckIsMEJBQTBCLENBQzFCLFVBQVUsRUFDVixhQUFhLEVBQ2IsUUFBUSxFQUNSLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUNoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQzFDLEVBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FDZjthQUNBLElBQUksQ0FDSjtRQUNBLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTSxtRUFBaUMsR0FBeEMsVUFDQyxlQUFvQyxFQUNwQyxXQUE4RCxFQUM5RCx5QkFBMEM7UUFBMUMsNkVBQTBDO1FBRTFDLGlCQUFNLGtDQUFrQyxZQUN2QyxlQUFlLEVBQ2YsV0FBVztRQUNYLDhEQUE4RDtRQUM5RCxtQkFBUyxJQUFJLGdCQUFTLENBQUMsT0FBTyxFQUFFLEVBQW5CLENBQW1CLEVBQ2hDLHlCQUF5QixDQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHVEQUFxQixHQUE1QixVQUNDLGVBQW9DLEVBQ3BDLFVBQTZCO1FBRjlCLGlCQWtEQztRQTlDTSxnRUFBOEUsRUFBN0Usa0JBQU0sRUFBRSwwQkFBcUUsQ0FBQztRQUVyRixJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbkQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNqRDtRQUVELElBQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFFMUMsSUFBSSxPQUFPLENBQUM7UUFFWixJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtZQUMzQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FDL0M7Z0JBQ0MsV0FBVyxFQUFFLE9BQU87Z0JBQ3BCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixPQUFPLEVBQUUsTUFBTTtnQkFDZixLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUNuQyxLQUFLLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2FBQ3BDLENBQ0QsQ0FBQztTQUNGO2FBQU07WUFDTixPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FDL0MsZUFBZSxDQUFDLFFBQVEsRUFDeEI7Z0JBQ0MsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUM1QixlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDNUIsRUFDRCxNQUFNLENBQ04sQ0FBQztTQUNGO1FBRUQsT0FBTyxPQUFPO2FBQ1osSUFBSSxDQUNKLGtCQUFRO1lBQ1AsSUFBTSxlQUFlLEdBQUcsS0FBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDNUQsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FDN0IsQ0FBQztZQUVGLGVBQWUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFL0MsT0FBTyxlQUFlLENBQUM7UUFDeEIsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVTLGdFQUE4QixHQUF4QyxVQUNDLGdCQUFxQyxFQUNyQyxZQUErRDtRQUUvRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU87U0FDUDtRQUVELGdEQUFnRDtRQUNoRCw4Q0FBOEM7SUFDL0MsQ0FBQztJQUVTLGtFQUFnQyxHQUExQyxVQUNDLGdCQUFxQyxFQUNyQyxrQkFBcUU7UUFFckUsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU87U0FDUDtRQUVELGdEQUFnRDtRQUNoRCx1REFBdUQ7SUFDeEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxxREFBbUIsR0FBM0IsVUFDQyxRQUFzQixFQUN0QixpQkFBa0QsRUFDbEQsT0FBK0IsRUFDL0IsZUFBZ0M7O1FBSmpDLGlCQTZGQztRQXZGQSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FDNUMsUUFBUSxFQUNSLGVBQWUsQ0FDZixDQUFDO1FBRUYsSUFBSSxlQUFlLEtBQUssSUFBSSxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0UsNEZBQTRGO1lBQzVGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDakQ7UUFFRCxJQUFNLDZCQUE2QixHQUFZLGVBQWUsS0FBSyxJQUFJLENBQUM7UUFFeEUsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQzdCLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQzNDLFFBQVEsRUFDUixPQUFPLENBQ1AsQ0FBQztTQUNGO1FBRUQsSUFBSSxPQUFPLENBQUM7UUFFWixJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQzNCLElBQU0sZ0JBQWMsYUFBSSxHQUFDLFFBQVEsSUFBRyxPQUFPLENBQUMsT0FBTyxLQUFDLENBQUM7WUFFckQsSUFBSSxVQUE4QixDQUFDO1lBRW5DLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCO2lCQUM5QixlQUFlLENBQ2Y7Z0JBQ0MsV0FBVyxFQUFFLE9BQU87Z0JBQ3BCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixPQUFPLEVBQUUsZ0JBQWM7Z0JBQ3ZCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztnQkFDcEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO2FBQ3BCLENBQ0Q7aUJBQ0EsSUFBSSxDQUNKLG1CQUFTO2dCQUNSLFVBQVEsR0FBRyxTQUFTLENBQUM7Z0JBRXJCLE9BQU8sS0FBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQ3RDLFVBQVEsRUFDUixnQkFBYyxFQUNkLEtBQUssRUFDTCxLQUFLLENBQ0wsQ0FBQztZQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEI7aUJBQ0EsSUFBSSxDQUNKLGNBQU0saUJBQVEsRUFBUixDQUFRLEVBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCLENBQUM7U0FDSDthQUFNO1lBQ04sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0I7aUJBQ2pDLFlBQVksQ0FDWixRQUFRLEVBQ1I7Z0JBQ0MsZUFBZSxDQUFDLE1BQU07Z0JBQ3RCLGVBQWUsQ0FBQyxNQUFNO2FBQ3RCLEVBQ0QsaUJBQWlCLENBQUMsY0FBYyxDQUNoQyxDQUFDO1NBQ0g7UUFFRCxPQUFPLE9BQU87YUFDWixJQUFJLENBQ0osa0JBQVE7WUFDUCxJQUFJLDZCQUE2QixFQUFFO2dCQUNsQyxlQUFnQixDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzFFLFFBQVEsRUFDUixpQkFBaUIsQ0FBQyxjQUFjLEVBQ2hDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUM3QixDQUFDO2FBQ0Y7aUJBQU07Z0JBQ04sSUFBTSxlQUFlLEdBQUcsS0FBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDNUQsUUFBUSxFQUNSLGlCQUFpQixDQUFDLGNBQWMsRUFDaEMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQzdCLENBQUM7Z0JBRUYsZUFBZ0IsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDaEQ7WUFFRCxPQUFPLGVBQWUsQ0FBQztRQUN4QixDQUFDLENBQ0QsQ0FBQztJQUNKLENBQUM7SUFDRiw4QkFBQztBQUFELENBQUMsQ0FwZFEsMkNBQXFCLEdBb2Q3Qjs7Ozs7QUNuZW9EO0FBS3JEO0lBQ1Msa0VBQWU7SUFNdkIsMkJBQ1Msb0JBQTBDLEVBQzFDLGtCQUFzQyxFQUN0QyxZQUEwQixFQUMxQix3QkFBa0QsRUFDMUQsWUFBbUMsRUFDbkMsY0FBdUMsRUFDdkMsVUFBc0IsRUFDdEIsWUFBMEIsRUFDMUIsZ0JBQWtDLEVBQ2xDLGdCQUFrQyxFQUNsQyw2QkFBNEQsRUFDbEQsV0FBd0I7UUFabkMsWUFjQyxrQkFDQyxVQUFVLEVBQ1YsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsWUFBWSxFQUNaLDZCQUE2QixFQUM3QixnQkFBZ0IsRUFDaEIsV0FBVyxDQUNYLFNBQ0Q7UUF2QlEsMEJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyx3QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGtCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLDhCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFRaEQsaUJBQVcsR0FBWCxXQUFXLENBQWE7UUFoQjVCLGlCQUFXLEdBRWQsRUFBRSxDQUFDOztJQTBCUCxDQUFDO0lBRU0sMkNBQWUsR0FBdEIsVUFDQyxXQUF3QztRQUV4QyxJQUFNLFNBQVMsR0FBRyxpQkFBTSxlQUFlLFlBQUMsV0FBVyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUVwRCxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksbURBQXVCLEdBQTlCLFVBQ0MscUJBQWdFLEVBQ2hFLGVBQWdDLEVBQ2hDLGNBQStCLEVBQy9CLDBCQUEyQyxFQUMzQyw2QkFBOEM7UUFIOUMseURBQWdDO1FBQ2hDLHVEQUErQjtRQUMvQiwrRUFBMkM7UUFDM0MscUZBQThDO1FBRTlDLElBQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQztRQUM5QyxJQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUM7UUFFOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtZQUNyQyxTQUFTLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1NBQ25EO1FBRUQsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUM5QixFQUFFLEVBQ0YsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3RCLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDM0IsT0FBTyxDQUFDLE1BQU0sRUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFDOUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3RCLENBQUM7UUFFRixtQkFBbUI7UUFDbkIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUU7WUFDcEMsU0FBUyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztTQUNyQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFFTSwyREFBK0IsR0FBdEMsVUFDQyxnQkFBNkMsRUFDN0MsS0FBZ0I7UUFFaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDbEMsZ0JBQWdCLENBQUMsT0FBTyxFQUN4QixFQUFFLEVBQ0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRU0sMENBQWMsR0FBckIsVUFDQyxRQUFzQixFQUN0QixNQUFjLEVBQ2QsT0FBeUI7UUFIMUIsaUJBeUJDO1FBcEJBLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtDQUFrQyxDQUN4RCxRQUFRLEVBQ1IsT0FBTyxDQUFDLE9BQU8sQ0FDZixDQUFDO1FBRUYsT0FBTyxJQUFJO2FBQ1Qsa0JBQWtCLENBQ2xCLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQ3hEO2FBQ0EsSUFBSSxDQUNKO1lBQ0MsT0FBTyxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDdEIsUUFBUSxFQUNSLE1BQU0sQ0FDTixDQUFDO1FBQ0gsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVNLG1EQUF1QixHQUE5QixVQUNDLFFBQXNCLEVBQ3RCLEtBQWUsRUFDZixZQUE4QjtRQUgvQixpQkEwQ0M7UUFyQ0EsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQzdELFFBQVEsRUFDUixZQUFZLENBQUMsT0FBTyxDQUNwQixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsb0JBQW9CO2FBQzlCLFlBQVksQ0FDWixRQUFRLEVBQ1IsSUFBSSxDQUFDLGtCQUFrQjthQUNyQixTQUFTLENBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FDbkMsS0FBSyxFQUNMLFlBQVksQ0FBQyxNQUFNLENBQ25CLENBQ0Q7YUFDQSxLQUFLLEVBQUUsRUFDVCxZQUFZLENBQUMsT0FBTyxDQUNwQjthQUNBLElBQUksQ0FDSixrQkFBUTtZQUNQLElBQU0sV0FBVyxHQUFnQixFQUFFLENBQUM7WUFFcEMsS0FBcUIsVUFBd0IsRUFBeEIsYUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBeEIsY0FBd0IsRUFBeEIsSUFBd0IsRUFBRTtnQkFBMUMsSUFBTSxNQUFNO2dCQUNoQixJQUFNLFNBQVMsR0FBRyxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDakMsUUFBUSxFQUNSLE1BQU0sQ0FDTixDQUFDO2dCQUVGLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtvQkFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDNUI7YUFDRDtZQUVELE9BQU8sV0FBVyxDQUFDO1FBQ3BCLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTSw0Q0FBZ0IsR0FBdkIsVUFDQyxRQUFzQixFQUN0QixPQUFpQixFQUNqQixPQUF5QjtRQUgxQixpQkEwQ0M7UUFyQ0EsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQ3hELFFBQVEsRUFDUixPQUFPLENBQUMsT0FBTyxDQUNmLENBQUM7UUFFRixJQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25GLElBQU0sUUFBUSxHQUFrQyxFQUFFLENBQUM7UUFFbkQsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBekIsSUFBTSxNQUFNO1lBQ2hCLFFBQVEsQ0FBQyxJQUFJLENBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUN0QixRQUFRLEVBQ1IsTUFBTSxFQUNOLGlCQUFpQixDQUNqQixDQUNELENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDeEIsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUNiLElBQUksQ0FDSjtZQUNDLElBQU0sV0FBVyxHQUFnQixFQUFFLENBQUM7WUFFcEMsS0FBcUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7Z0JBQXpCLElBQU0sTUFBTTtnQkFDaEIsV0FBVyxDQUFDLElBQUksQ0FDZixLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDZixRQUFRLEVBQ1IsTUFBTSxDQUNMLENBQ0YsQ0FBQzthQUNGO1lBRUQsT0FBTyxXQUFXLENBQUM7UUFDcEIsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0RBQTBCLEdBQWpDLFVBQ0MsVUFBb0IsRUFDcEIsYUFBdUIsRUFDdkIsUUFBa0IsRUFDbEIsS0FBZSxFQUNmLE9BQTBCO1FBRTFCLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQ25DLFVBQVUsRUFDVixhQUFhLEVBQ2IsT0FBTyxDQUNQLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQ3JDLFFBQVEsRUFDUixJQUFJLENBQUMsa0JBQWtCO2lCQUNyQixTQUFTLENBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQ2hDLEtBQUssRUFDTDtnQkFDQyxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsS0FBSyxFQUFFLEVBQUMsRUFBRSxFQUFFLGFBQWEsRUFBQzthQUMxQixDQUNELENBQ0Q7aUJBQ0EsS0FBSyxFQUFFO1lBQ1QsNERBQTREO1lBQzVELE9BQU8sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSw4Q0FBa0IsR0FBekIsVUFDQyxZQUEwQixFQUMxQixRQUE4QixFQUM5QixRQUFzQixFQUN0QixNQUFjLEVBQ2QsU0FBa0MsRUFDbEMsZUFBOEM7UUFFOUMsZ0VBQWdFO1FBQ2hFLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNqQyxRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7UUFFRixJQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsV0FBVyxDQUNsQyxRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7UUFFRixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBb0MsUUFBUSxTQUFJLE1BQVEsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQzVCLFlBQVksQ0FBQyxlQUFlLENBQzNCLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxDQUNULENBQUM7U0FDRjthQUFNO1lBQ04sWUFBWSxDQUFDLGNBQWMsQ0FDMUIsU0FBUyxFQUNULE1BQU0sRUFDTixlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FDdEMsQ0FBQztTQUNGO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw4Q0FBa0IsR0FBMUIsVUFDQyxRQUFzQixFQUN0QixNQUFjLEVBQ2QsaUJBQWtEO1FBRWxELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNqQyxRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7UUFFRixJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN4RSw0RkFBNEY7WUFDNUYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xDO1FBRUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CO2FBQzlCLFNBQVMsQ0FDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGlCQUFpQixDQUFDLGNBQWMsQ0FDaEM7YUFDQSxJQUFJLENBQ0o7UUFDQSxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCLENBQUM7SUFDSixDQUFDO0lBQ0Ysd0JBQUM7QUFBRCxDQUFDLENBbFVRLCtCQUFlLEdBa1V2Qjs7Ozs7QUNqVzRDO0FBWXJCO0FBT3lCO0FBQ29DO0FBRWpCO0FBQ1k7QUFFaEY7Ozs7OztHQU1HO0FBQ0g7SUFDUyw0REFBYTtJQU9yQixxQkFDVyxZQUE0QyxFQUN0RCxJQUFZO1FBRmIsWUFJQyxrQkFDQyxZQUFZLEVBQ1osSUFBSSxDQUNKLFNBaUNEO1FBdkNVLGtCQUFZLEdBQVosWUFBWSxDQUFnQztRQUhoRCxZQUFNLEdBQVMsSUFBSSxDQUFDO1FBVzFCLEtBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxtQ0FBaUIsQ0FDdkMsWUFBWSxDQUFDLG9CQUFvQixFQUNqQyxZQUFZLENBQUMsa0JBQWtCLEVBQy9CLFlBQVksQ0FBQyxZQUFZLEVBQ3pCLFlBQVksQ0FBQyx3QkFBd0IsRUFDckMsWUFBWSxDQUFDLFlBQVksRUFDekIsWUFBWSxDQUFDLGNBQWMsRUFDM0IsWUFBWSxDQUFDLFVBQVUsRUFDdkIsWUFBWSxDQUFDLFlBQVksRUFDekIsWUFBWSxDQUFDLGdCQUFnQixFQUM3QixZQUFZLENBQUMsZ0JBQWdCLEVBQzdCLFlBQVksQ0FBQyw2QkFBNkIsRUFDMUMsS0FBSSxDQUNKLENBQUM7UUFFRixLQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSwrQ0FBdUIsQ0FDbkQsWUFBWSxDQUFDLHdCQUF3QixFQUNyQyxZQUFZLENBQUMsb0JBQW9CLEVBQ2pDLFlBQVksQ0FBQyw2QkFBNkIsRUFDMUMsWUFBWSxDQUFDLHNCQUFzQixFQUNuQyxZQUFZLENBQUMsaUJBQWlCLEVBQzlCLFlBQVksQ0FBQyxzQkFBc0IsRUFDbkMsWUFBWSxDQUFDLHNCQUFzQixFQUNuQyxZQUFZLENBQUMsd0JBQXdCLEVBQ3JDLFlBQVksQ0FBQyxZQUFZLEVBQ3pCLEtBQUksQ0FBQyxXQUFXLEVBQ2hCLFlBQVksQ0FBQyxjQUFjLEVBQzNCLFlBQVksQ0FBQyxZQUFZLEVBQ3pCLFlBQVksQ0FBQyxVQUFVLEVBQ3ZCLEtBQUksQ0FDSixDQUFDOztJQUNILENBQUM7SUFFTSxvQ0FBYyxHQUFyQjtRQUNDLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVNLHFDQUFlLEdBQXRCLFVBQ0MsUUFBOEIsRUFDOUIsZ0JBQXFDLEVBQ3JDLG9CQUFxQyxFQUNyQyx5QkFBMEMsRUFDMUMsWUFBc0U7UUFGdEUsbUVBQXFDO1FBQ3JDLDZFQUEwQztRQUMxQyw4Q0FBNkIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUU7UUFFdEUsSUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUU1RCxLQUFLLElBQU0sUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDdEMsSUFBSSxTQUFTLFNBQVcsQ0FBQztZQUV6QixJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUNuQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQy9DLFFBQVEsRUFDUixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFDMUIscUJBQXFCLENBQ3JCLENBQUM7YUFDRjtpQkFBTTtnQkFDTixTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FDM0QsUUFBUSxFQUNSLHFCQUFxQixDQUNyQixDQUFDO2FBQ0Y7WUFFRCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDakUsUUFBUSxFQUNSLFNBQVMsQ0FBQyxrQkFBa0I7Z0JBQzNCLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUNwQixxQkFBcUIsQ0FDckIsQ0FBQztZQUVGLEtBQUssSUFBTSxZQUFZLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDbEMsWUFBWSxFQUNaLFFBQVEsRUFDUixRQUFRLEVBQ1IsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUNwQixTQUFTLEVBQ1QsZUFBZSxDQUNmLENBQUM7YUFDRjtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQzVCLFlBQVksRUFDWixvQkFBb0IsRUFDcEIseUJBQXlCLENBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksNENBQXNCLEdBQTdCLFVBQ0Msb0JBQTBDLEVBQzFDLG9CQUFxQyxFQUNyQyx5QkFBMEM7UUFIM0MsaUJBc0NDO1FBcENBLG1FQUFxQztRQUNyQyw2RUFBMEM7UUFFMUMsS0FBSyxJQUFNLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FDdkMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUN6Qyx5QkFBeUIsQ0FDekIsQ0FBQztTQUNGO1FBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7WUFDcEQsS0FBd0IsVUFBc0MsRUFBdEMseUJBQW9CLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUF0QyxjQUFzQyxFQUF0QyxJQUFzQyxFQUFFO2dCQUEzRCxJQUFNLFNBQVM7Z0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFMUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDbEQ7U0FDRDtRQUVELElBQU0saUJBQWlCLEdBQUcsSUFBSSwrREFBK0IsQ0FDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFDckMsSUFBSSxFQUNKLGtCQUFRLElBQUksWUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQXRELENBQXNELENBQ2xFLENBQUM7UUFFRixpQkFBaUI7YUFDZixZQUFZLENBQUMsb0JBQW9CLENBQUM7YUFDbEMsNkJBQTZCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUUzRCxLQUFvQixVQUFhLEVBQWIsU0FBSSxDQUFDLFFBQVEsRUFBYixjQUFhLEVBQWIsSUFBYSxFQUFFO1lBQTlCLElBQU0sS0FBSztZQUNmLEtBQUssQ0FBQyxzQkFBc0IsQ0FDM0Isb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQix5QkFBeUIsQ0FDekIsQ0FBQztTQUNGO0lBQ0YsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDJDQUFxQixHQUE1QixVQUNDLE1BQW1CLEVBQ25CLFFBQXNCO1FBRXRCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pELElBQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBa0IsQ0FBQyxDQUFDO1FBQ3BFLElBQU0sTUFBTSxHQUFvQyxFQUFFLENBQUM7UUFFbkQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQThCLE1BQU0sQ0FBQyxRQUFRLFlBQU8sUUFBUSxNQUFHLENBQUMsQ0FBQztTQUNqRjtRQUVELElBQUksYUFBYSxDQUFDLElBQUksS0FBSyx3QkFBZSxDQUFDLE1BQU0sRUFBRTtZQUNsRCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDNUM7YUFBTTtZQUNOLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDNUI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksK0JBQVMsR0FBaEIsVUFDQyxTQUFrQyxFQUNsQyxZQUE0QixFQUM1QixlQUF3QztRQUR4QyxrREFBNEI7UUFHNUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzlCLFNBQVMsRUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQzFDLENBQUM7SUFDSCxDQUFDO0lBRU0sK0NBQXlCLEdBQWhDLFVBQ0MsV0FBNEIsRUFDNUIsVUFBMEI7UUFBMUIsOENBQTBCO1FBRTFCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0RCxJQUNDLE9BQU8sS0FBSyxTQUFTO2VBQ2xCLFNBQVMsS0FBSyxTQUFTLEVBQ3pCO1lBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDaEIsT0FBTyxPQUFPLENBQUM7YUFDZjtZQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMvQyxPQUFPLEVBQ1AsRUFBRSxFQUNGLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixDQUFDO1NBQ0Y7UUFFRCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBc0QsU0FBUyxDQUFDLFFBQVEsTUFBRyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG1EQUE2QixHQUFwQyxVQUNDLFdBQTRCO1FBSzVCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0RCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBZ0QsV0FBVywyQkFBd0IsQ0FBQyxDQUFDO1NBQ3JHO1FBRUQsT0FBTztZQUNOLEtBQUssRUFBRSxTQUFTO1lBQ2hCLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7U0FDbEQsQ0FBQztJQUNILENBQUM7SUFFTSxxREFBK0IsR0FBdEMsVUFBd0MsaUJBQXdDO1FBQy9FLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN4QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQ3hELEtBQUssQ0FBQyxRQUFRLEVBQ2QsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ2xCLENBQUM7WUFFRixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQzFCLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBRWIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUMxQyxLQUFLLENBQUMsUUFBUSxFQUNkLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNsQixPQUFPLENBQ1AsQ0FBQzthQUNGO1lBRUQsT0FBTyxPQUFPLENBQUM7U0FDZjtRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0kscUNBQWUsR0FBdEI7UUFDQyxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUMvQixtQkFBUyxJQUFJLGdCQUFTLENBQUMsV0FBVyxFQUFFLEVBQXZCLENBQXVCLENBQ3BDLENBQUM7UUFFRiwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3JDLHlCQUFlLElBQUksc0JBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBN0IsQ0FBNkIsQ0FDaEQsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksMkNBQXFCLEdBQTVCLFVBQ0MsV0FBNkIsRUFDN0IsZUFBeUIsRUFDekIscUJBQTZDO1FBRzdDLHdFQUF3RTtRQUV4RSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCO2FBQzlDLFNBQVMsQ0FDVCxXQUFXLEVBQ1gsZUFBZSxFQUNmLHFCQUFxQixDQUNyQjthQUNBLE9BQU8sRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1Q0FBaUIsR0FBeEIsVUFDQyxZQUEwQixFQUMxQixvQkFBb0MsRUFDcEMseUJBQTBDO1FBSDNDLGlCQStEQztRQTdEQSxrRUFBb0M7UUFDcEMsNkVBQTBDO1FBRTFDLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUMzQztnQkFDQyxPQUFPLEVBQUUsRUFBRTtnQkFDWCxRQUFRLEVBQUUsd0JBQUk7YUFDZCxDQUNELENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSTthQUNULGtDQUFrQyxDQUFDLFlBQVksQ0FBQzthQUNoRCxJQUFJLENBQ0o7WUFDTyxzRUFBMEYsRUFBekYsa0JBQU0sRUFBRSw4Q0FBb0IsRUFBRSx3Q0FBMkQsQ0FBQztZQUVqRyxLQUFLLElBQU0sUUFBUSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUU7d0NBQ2pDLFNBQVM7b0JBQ25CLEtBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDMUMsSUFBTSxVQUFVLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUU5RCxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQyxPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFbEQsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUUvQyxpQkFBaUIsQ0FBQyxJQUFJLENBQ3JCLHVCQUFhO3dCQUNaLGFBQWEsQ0FBQyxjQUFjLENBQzNCLFNBQVMsRUFDVCxVQUFVLENBQ1YsQ0FBQztvQkFDSCxDQUFDLENBQ0QsQ0FBQzs7Z0JBaEJILEtBQXdCLFVBQThCLEVBQTlCLGlCQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUE5QixjQUE4QixFQUE5QixJQUE4QjtvQkFBakQsSUFBTSxTQUFTOzRCQUFULFNBQVM7aUJBaUJuQjthQUNEO1lBRUQsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLCtEQUErQixDQUM1RCxLQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUNuQyxLQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUNyQyxLQUFJLEVBQ0osa0JBQVEsSUFBSSxZQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBdEQsQ0FBc0QsQ0FDbEUsQ0FBQztZQUVGLGlCQUFpQjtpQkFDZixZQUFZLENBQUMsb0JBQW9CLENBQUM7aUJBQ2xDLDZCQUE2QixDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFFM0QsS0FBb0IsVUFBYSxFQUFiLFVBQUksQ0FBQyxRQUFRLEVBQWIsY0FBYSxFQUFiLElBQWEsRUFBRTtnQkFBOUIsSUFBTSxLQUFLO2dCQUNmLEtBQUssQ0FBQyxzQkFBc0IsQ0FDM0Isb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQix5QkFBeUIsQ0FDekIsQ0FBQzthQUNGO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDZixDQUFDLENBQ0QsQ0FBQztJQUNKLENBQUM7SUFFTSx1Q0FBaUIsR0FBeEIsVUFDQyxXQUE0QjtRQUU1QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFckUsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVNLCtDQUF5QixHQUFoQyxVQUNDLFFBQWtCLEVBQ2xCLE1BQTJCO1FBRTNCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDN0MsUUFBUSxFQUNSLE1BQU0sQ0FDTixDQUFDO1FBRUYsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVNLDBEQUFvQyxHQUEzQyxVQUNDLFFBQWtCLEVBQ2xCLFdBQW1CO1FBRW5CLElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQ3RFLFFBQVEsRUFDUixXQUFXLENBQ1gsQ0FBQztRQUVGLElBQUksZUFBZSxLQUFLLElBQUksRUFBRTtZQUM3QixPQUFPLGVBQWUsQ0FBQztTQUN2QjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFFTSw2Q0FBdUIsR0FBOUIsVUFBZ0MsaUJBQXdDO1FBQ3ZFLElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFdkYsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sZUFBZSxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVNLCtDQUF5QixHQUFoQyxVQUNDLGFBQW1EO1FBRW5ELE9BQU8sYUFBYSxDQUFDO0lBQ3RCLENBQUM7SUFDRixrQkFBQztBQUFELENBQUMsQ0F4YlEsMkJBQWEsR0F3YnJCOzs7O0FDcmR3RDtBQUV6RDtJQVFDLG1CQUNTLG1CQUF3QyxFQUN4QyxXQUEwQjtRQUQxQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBUjNCLFlBQU8sR0FBc0IsRUFBRSxDQUFDO1FBRWpDLHFCQUFnQixHQUVuQixFQUFFLENBQUM7SUFNUCxDQUFDO0lBRU0sZ0NBQVksR0FBbkIsVUFBcUIsV0FBNEI7UUFDaEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELHdCQUFJLEdBQUosVUFBTSxRQUFxRDtRQUMxRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTdCLEtBQUssSUFBTSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQy9CLEtBQUssSUFBTSxNQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtvQkFDeEMsT0FBTyxJQUFJLENBQUM7aUJBQ1o7YUFDRDtTQUNEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRUQsaUNBQWEsR0FBYixVQUE4QyxRQUFzQjtRQUNuRSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQU0sTUFBTSxHQUFtQyxFQUFFLENBQUM7UUFFbEQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzFCLE9BQU8sTUFBTSxDQUFDO1NBQ2Q7UUFFRCxLQUFLLElBQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUQsOEJBQVUsR0FBVixVQUNDLFFBQXNCLEVBQ3RCLEtBQXNCO1FBRXRCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBTSxNQUFNLEdBQW1DLEVBQUUsQ0FBQztRQUVsRCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxNQUFNLENBQUM7U0FDZDtRQUVELEtBQUssSUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzdCLElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVsQyxJQUNDLElBQUksQ0FBQyxVQUFVLENBQ2QsU0FBUyxFQUNULEtBQUssQ0FDTCxFQUNBO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdkI7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELG1DQUFlLEdBQWYsVUFDQyxRQUFzQixFQUN0QixLQUFzQjtRQUV0QixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQU0sTUFBTSxHQUFtQyxFQUFFLENBQUM7UUFFbEQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzFCLE9BQU8sTUFBTSxDQUFDO1NBQ2Q7UUFFRCxLQUFLLElBQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM3QixJQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDekIsU0FBUzthQUNUO1lBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUNsQixTQUFTLEVBQ1QsS0FBSyxDQUNMLEVBQUU7Z0JBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN2QjtTQUNEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUQsK0JBQVcsR0FBWCxVQUNDLFVBQW9CLEVBQ3BCLFFBQWdCLEVBQ2hCLFFBQXNCO1FBRXRCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBTSxNQUFNLEdBQW1DLEVBQUUsQ0FBQztRQUVsRCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxNQUFNLENBQUM7U0FDZDtRQUVELEtBQUssSUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzdCLElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFNLFFBQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVyRCxJQUFJLFFBQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLFNBQVM7YUFDVDtZQUVELHlDQUF5QztZQUN6QyxJQUFJLFFBQU0sQ0FBQyxRQUFRLEtBQUssVUFBVSxJQUFJLFFBQU0sQ0FBQyxNQUFNLElBQUksUUFBUSxFQUFFO2dCQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3ZCO1NBQ0Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRCx5Q0FBcUIsR0FBckIsVUFDQyxVQUFvQixFQUNwQixTQUFtQixFQUNuQixRQUFzQixFQUN0QixlQUFvQjtRQUVwQixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQU0sTUFBTSxHQUF1QyxFQUFFLENBQUM7UUFFdEQsS0FBdUIsVUFBUyxFQUFULHVCQUFTLEVBQVQsdUJBQVMsRUFBVCxJQUFTLEVBQUU7WUFBN0IsSUFBTSxRQUFRO1lBQ2xCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDdEI7UUFFRCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxNQUFNLENBQUM7U0FDZDtRQUVELEtBQUssSUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzdCLElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFNLFFBQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVyRCxJQUFJLFFBQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLFNBQVM7YUFDVDtZQUVELElBQUksUUFBTSxDQUFDLFFBQVEsS0FBSyxVQUFVLElBQUksTUFBTSxDQUFDLFFBQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQzFFLFNBQVM7YUFDVDtZQUVELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3pCLFNBQVM7YUFDVDtZQUVELElBQUksZUFBZSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUM5QyxTQUFTLEVBQ1QsZUFBZSxDQUNmLEVBQUU7Z0JBQ0YsTUFBTSxDQUFDLFFBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdEM7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELDJCQUFPLEdBQVAsVUFDQyxRQUVTO1FBRVQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUU3QixLQUFLLElBQU0sUUFBUSxJQUFJLE9BQU8sRUFBRTtZQUMvQixLQUFLLElBQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDdkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ3BDO1NBQ0Q7SUFDRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsMkJBQU8sR0FBUDtRQUNDLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBTSxNQUFNLEdBQStCLEVBQUUsQ0FBQztRQUU5QyxLQUFLLElBQU0sUUFBUSxJQUFJLE9BQU8sRUFBRTtZQUMvQixLQUFLLElBQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUN2QztTQUNEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUQsdUJBQUcsR0FBSCxVQUFvQyxTQUFrQztRQUNyRSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFFcEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDdkI7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVoRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCx1QkFBRyxHQUFILFVBQ0MsUUFBc0IsRUFDdEIsTUFBdUI7UUFFdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsNEJBQVEsR0FBUixVQUNDLFFBQWtCLEVBQ2xCLE1BQXVCO1FBRXZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDN0YsQ0FBQztJQUVELGdDQUFZLEdBQVosVUFDQyxTQUFZLEVBQ1osU0FBMEI7UUFFMUIsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEQsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0IsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRUQseUJBQUssR0FBTCxVQUFPLFNBQTBCO1FBQ2hDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1lBRTNCLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQ3hCLFNBQVMsQ0FBQyxRQUFRLEVBQ2xCLFNBQVMsQ0FBQyxNQUFNLENBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsaUNBQWEsR0FBYixVQUNDLFFBQWtCLEVBQ2xCLE1BQWM7UUFFZCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXZDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqRCxPQUFPLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCw4QkFBVSxHQUFWLFVBQ0MsU0FBeUIsRUFDekIsS0FBc0I7UUFFdEIsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0UsT0FBTyxJQUFJLENBQUMsbUJBQW1CO2FBQzdCLFNBQVMsQ0FDVCxTQUFTLENBQUMsUUFBUSxFQUNsQixDQUFDLElBQUksQ0FBQyxXQUFXLFlBQVksdUJBQVcsQ0FBQztZQUN4QyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDZixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUNyQzthQUNBLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsZUFBZTtJQUNyRCxDQUFDO0lBQ0YsZ0JBQUM7QUFBRCxDQUFDOzs7O0FDMVQyQjtBQUVtQjtBQUdTO0FBU3RDO0FBRWxCO0lBRUMsMEJBQ1MsYUFBNEIsRUFDNUIsZUFBeUM7UUFEekMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQTBCO0lBRWxELENBQUM7SUFFTSxzQ0FBVyxHQUFsQixVQUNDLFNBQTBCLEVBQzFCLFNBQTBCO1FBRTFCLElBQUksU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzdDLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFFRCxJQUNDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDO2VBQ3ZDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDLEVBQzVDO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELHNEQUFzRDtRQUN0RCxPQUFPLENBQ04sU0FBVSxDQUFDLFFBQVEsS0FBSyxTQUFVLENBQUMsUUFBUTtZQUMzQyx5Q0FBeUM7ZUFDdEMsU0FBVSxDQUFDLE1BQU0sSUFBSSxTQUFVLENBQUMsTUFBTSxDQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdEQUFxQixHQUE1QixVQUNDLE1BQW1CLEVBQ25CLFFBQXNCO1FBRXRCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFFcEUsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQThCLE1BQU0sQ0FBQyxRQUFRLFlBQU8sUUFBUSxNQUFHLENBQUMsQ0FBQztTQUNqRjtRQUVELElBQU0sTUFBTSxHQUFvQyxFQUFFLENBQUM7UUFFbkQsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLHdCQUFlLENBQUMsTUFBTSxFQUFFO1lBQ2xELE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUM1QzthQUFNO1lBQ04sTUFBTSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUM1QjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDRDQUFpQixHQUF4QixVQUNDLFVBQW9CLEVBQ3BCLFNBQWtDLEVBQ2xDLE1BQThCO1FBRTlCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFFekUsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQThCLFVBQVUsWUFBTyxTQUFTLENBQUMsUUFBUSxNQUFHLENBQUMsQ0FBQztTQUN0RjtRQUVELElBQU0sTUFBTSxHQUFnQixFQUFpQixDQUFDO1FBRTlDLElBQUksYUFBYSxDQUFDLElBQUksS0FBSyx3QkFBZSxDQUFDLE1BQU0sRUFBRTtZQUNsRCxNQUFNLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUM3QixNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7YUFBTTtZQUNOLDhDQUE4QztZQUM5QyxNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQzVCO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU0seUNBQWMsR0FBckIsVUFDQyxTQUF3QixFQUN4QixNQUEyQztRQUczQyxRQUFRLFNBQVMsQ0FBQyxRQUFRLEVBQUU7WUFDM0IsS0FBSyxTQUFTO2dCQUNiLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTO29CQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU87b0JBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUNqQixNQUFNLENBQUMsUUFBUSxFQUNmLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQ1gsQ0FBQztZQUNKLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssUUFBUTtnQkFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQ3RCLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsTUFBTSxDQUFDLGFBQWEsRUFDcEIsTUFBTSxDQUFDLFVBQVUsQ0FDakIsQ0FBQztZQUNIO2dCQUNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7SUFDRixDQUFDO0lBRUQseUNBQWMsR0FBZCxVQUFnQixPQUE2QjtRQUM1QyxPQUFPLElBQUksa0NBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQix1REFBNEIsR0FBNUI7UUFDQyxPQUFPLEVBQUMsT0FBTyxFQUFFLHFGQUFxRixFQUFDLENBQUM7SUFDekcsQ0FBQztJQUVELHNEQUEyQixHQUEzQixVQUE2QixRQUFrQjtRQUM5QyxPQUFPLEVBQUMsT0FBTyxFQUFFLDBCQUF3QixRQUFRLHdCQUFxQixFQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELHVEQUE0QixHQUE1QixVQUE4QixRQUFrQjtRQUMvQyxPQUFPLEVBQUMsT0FBTyxFQUFFLDBCQUF3QixRQUFRLDhDQUEyQyxFQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELHNDQUFXLEdBQVgsVUFDQyxTQUFzQixFQUN0QixLQUFrQixFQUNsQixRQUFxQjtRQUZyQiwwQ0FBc0I7UUFDdEIsa0NBQWtCO1FBQ2xCLHdDQUFxQjtRQUVyQixPQUFPLFNBQVM7YUFDZCxJQUFJLEVBQUU7YUFDTixNQUFNLENBQ04sR0FBRyxFQUNILEtBQUssQ0FDTDthQUNBLElBQUksRUFBRTthQUNOLE1BQU0sQ0FDTixHQUFHLEVBQ0gsUUFBUSxDQUNSO2FBQ0EsSUFBSSxFQUFFLENBQUM7SUFDVixDQUFDO0lBRUQsd0NBQWEsR0FBYixVQUFlLFFBQWtCO1FBQ2hDLFFBQVEsUUFBUSxFQUFFO1lBQ2pCLEtBQUssV0FBVztnQkFDZixPQUFPLGFBQWEsQ0FBQztZQUN0QixLQUFLLFNBQVM7Z0JBQ2IsT0FBTyxRQUFRLENBQUM7WUFDakIsS0FBSyxPQUFPO2dCQUNYLE9BQU8sY0FBYyxDQUFDO1lBQ3ZCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxrQkFBa0I7Z0JBQ3RCLE9BQU8sWUFBWSxDQUFDO1lBQ3JCLEtBQUssaUJBQWlCO2dCQUNyQixPQUFPLGNBQWMsQ0FBQztZQUN2QixLQUFLLFNBQVM7Z0JBQ2IsT0FBTyxNQUFNLENBQUM7WUFDZixLQUFLLGNBQWMsQ0FBQztZQUNwQixLQUFLLG1CQUFtQixDQUFDO1lBQ3pCLEtBQUssYUFBYSxDQUFDO1lBQ25CLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssZUFBZSxDQUFDO1lBQ3JCLEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxpQkFBaUIsQ0FBQztZQUN2QixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLGNBQWMsQ0FBQztZQUNwQixLQUFLLGtCQUFrQixDQUFDO1lBQ3hCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxtQkFBbUIsQ0FBQztZQUN6QixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFVBQVU7Z0JBQ2QsT0FBTyxNQUFNLENBQUM7WUFDZixrQkFBa0I7WUFDbEIscUJBQXFCO1lBQ3JCLGlCQUFpQjtZQUNqQjtnQkFDQyxnRkFBZ0Y7Z0JBQ2hGLGlEQUFpRDtnQkFDakQsT0FBTyxhQUFhLENBQUM7U0FDdEI7SUFDRixDQUFDO0lBRUQsdUZBQXVGO0lBQ2hGLGdEQUFxQixHQUE1QjtRQUNDLE9BQU87WUFDTixXQUFXLEVBQUUsb0NBQWU7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFO1lBQ3ZDLE9BQU8sRUFBRSx5QkFBTSxFQUFFO1NBQ2pCLENBQUM7SUFDSCxDQUFDO0lBQ0YsdUJBQUM7QUFBRCxDQUFDOzs7O0FDek8yRjtBQUNsQztBQUUxRDtJQUdDO1FBRkEsY0FBUyxHQUFXLEdBQUcsQ0FBQztJQUVSLENBQUM7SUFFakIsaUNBQVksR0FBWixVQUFjLFFBQWdCLEVBQUUsTUFBdUI7UUFDdEQsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUVELDhCQUFTLEdBQVQ7UUFBVyxjQUFPO2FBQVAsVUFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTztZQUFQLHlCQUFPOztRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELGtDQUFhLEdBQWIsVUFBZSxRQUFnQjtRQUM5QixRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRS9CLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsZ0NBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxnQ0FBVztZQUM1RCxPQUFPO2dCQUNOLElBQUksRUFBRSxxQkFBWSxDQUFDLEdBQUc7Z0JBQ3RCLFFBQVEsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLGdDQUFXLENBQUMsTUFBTSxDQUFDLENBQUMscURBQXFEO2FBQ3RHLENBQUM7UUFFSCxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLHNDQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLHNDQUFpQjtZQUN4RSxPQUFPO2dCQUNOLElBQUksRUFBRSxxQkFBWSxDQUFDLFNBQVM7Z0JBQzVCLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsc0NBQWlCLENBQUMsTUFBTSxDQUFDO2FBQ3JELENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRCx5Q0FBb0IsR0FBcEIsVUFBc0IsTUFBdUI7UUFDNUMsT0FBTyxzQ0FBaUIsR0FBRyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVELG1DQUFjLEdBQWQsVUFBZ0IsWUFBb0I7UUFDbkMsT0FBTyxnQ0FBVyxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsK0JBQVUsR0FBVjtRQUNDLE9BQU8sQ0FBQyxDQUFDLCtCQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELHdDQUFtQixHQUFuQjtRQUNDLE9BQU8sQ0FBQyxDQUFDLHFDQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxvQ0FBZSxHQUFmO1FBQ0MsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLDZEQUE2RDtJQUM3RCw4QkFBUyxHQUFULFVBQVcsTUFBdUI7UUFDakMsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELDRCQUFPLEdBQVAsVUFBUyxNQUF1QjtRQUMvQixPQUFPLE1BQU0sS0FBSyxnQ0FBVyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsK0JBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSywrQkFBVSxDQUFDO0lBQy9GLENBQUM7SUFFRCxrQ0FBYSxHQUFiLFVBQWUsTUFBdUI7UUFDckMsT0FBTyxNQUFNLEtBQUssc0NBQWlCLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxxQ0FBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxxQ0FBZ0IsQ0FBQztJQUNqSCxDQUFDO0lBQ0YsaUJBQUM7QUFBRCxDQUFDOzs7O0FDOURtQztBQUlwQztJQUtDLHFCQUNTLGlCQUFvQyxFQUNwQyxZQUFtQyxFQUNuQyxVQUFzQixFQUN0QixjQUF1QztRQUh2QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUF1QjtRQUNuQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtRQVB4QyxjQUFTLEdBQXVCLEVBQUUsQ0FBQztRQUNuQyxhQUFRLEdBQXlDLEVBQUUsQ0FBQztJQVM1RCxDQUFDO0lBRU0sOEJBQVEsR0FBZjtRQUNDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRU0sNkJBQU8sR0FBZCxVQUFnQixXQUFtQjtRQUNsQyxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRWpDLEtBQUssSUFBTSxRQUFRLElBQUksU0FBUyxFQUFFO1lBQ2pDLEtBQUssSUFBTSxNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN6QyxJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRTdDLHlDQUF5QztnQkFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLEVBQUUsSUFBSSxXQUFXLEVBQUU7b0JBQ3RELE9BQU8sSUFBSSxDQUFDO2lCQUNaO2FBQ0Q7U0FDRDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVELDJCQUEyQjtJQUNwQiw4QkFBUSxHQUFmLFVBQWlCLFNBQXlCO1FBQ3pDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQzdCLFNBQVMsRUFDVCxJQUFJLENBQUMsU0FBUyxDQUNkLENBQUM7UUFFRixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDM0IsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBRU0sZ0NBQVUsR0FBakIsVUFBbUIsU0FBeUI7UUFDM0MsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FDN0IsU0FBUyxFQUNULElBQUksQ0FBQyxTQUFTLENBQ2QsQ0FBQztRQUVGLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMzQixPQUFPLFNBQVMsQ0FBQztTQUNqQjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3hCLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO1FBRUQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsNkJBQTZCO0lBQ3RCLHFDQUFlLEdBQXRCLFVBQXdCLFNBQXlCO1FBQ2hELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQ3pCLFNBQVMsRUFDVCxJQUFJLENBQUMsU0FBUyxDQUNkLENBQUM7UUFFRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QztRQUVELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQzVCLFNBQVMsRUFDVCxJQUFJLENBQUMsUUFBUSxDQUNiLENBQUM7UUFFRixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxPQUFPLENBQUM7U0FDZjtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sK0JBQVMsR0FBaEIsVUFBa0IsU0FBeUI7UUFBM0MsaUJBc0JDO1FBckJBLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFdkMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQzthQUNwQyxJQUFJLENBQ0osa0JBQVE7WUFDUCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLE9BQU8sUUFBUSxDQUFDO2FBQ2hCO1lBRUQsT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsRUFDRCxZQUFZLENBQUMsTUFBTSxDQUNuQjthQUNBLElBQUksQ0FDSixrQkFBUTtZQUNQLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQixZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsRUFDRCxZQUFZLENBQUMsTUFBTSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVNLGlDQUFXLEdBQWxCLFVBQW9CLFNBQXlCO1FBQTdDLGlCQWdEQztRQS9DTyxpQ0FBUSxFQUFFLHlCQUFNLENBQWM7UUFFckMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQjthQUNwQyxNQUFNLENBQ04sV0FBVyxFQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQzVCO1lBQ0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsSUFBSSxFQUFFLE1BQU07U0FDWixDQUNEO2FBQ0EsSUFBSSxDQUNKLGtCQUFRO1lBQ1AsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXZDLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FDbkIsU0FBUyxFQUNULFFBQVEsQ0FBQyxXQUFXLENBQ25CLFdBQVcsRUFDWCxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDM0IsRUFDRCxLQUFJLENBQUMsU0FBUyxDQUNkLENBQUM7UUFDSCxDQUFDLEVBQ0QsZUFBSztZQUNKLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV2QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFFO2dCQUN2QixPQUFPLEtBQUksQ0FBQyxRQUFRLENBQ25CLFNBQVMsRUFDVDtvQkFDQyxTQUFTLEVBQUUsSUFBSTtvQkFDZixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87aUJBQ3RCLEVBQ0QsS0FBSSxDQUFDLFNBQVMsQ0FDZCxDQUFDO2FBQ0Y7WUFFRCxPQUFPLEtBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FDRCxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUNuQixTQUFTLEVBQ1QsT0FBTyxFQUNQLElBQUksQ0FBQyxRQUFRLENBQ2IsQ0FBQztJQUNILENBQUM7SUFFTSxnQ0FBVSxHQUFqQixVQUFtQixTQUF5QjtRQUE1QyxpQkE2QkM7UUE1QkEsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQzthQUNwQyxJQUFJLENBQ0osb0JBQVU7WUFDVCwrQkFBK0I7WUFDL0IsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO2dCQUM3QixPQUFPO2FBQ1A7WUFFRCxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRTFCLE9BQU87YUFDUDtZQUVELE9BQU8sS0FBSSxDQUFDLGlCQUFpQjtpQkFDM0IsTUFBTSxDQUNOLFdBQVcsRUFDWCxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FDZjtpQkFDQSxJQUFJLENBQ0o7Z0JBQ0MsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDLEVBQ0QsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCLENBQUM7UUFDSixDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3hCLENBQUM7SUFDSixDQUFDO0lBRU0sK0JBQVMsR0FBaEIsVUFBa0IsU0FBeUI7UUFDMUMsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxPQUFPLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sOEJBQVEsR0FBaEIsVUFDQyxTQUF5QixFQUN6QixHQUFlO1FBRWYsSUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUVwQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsT0FBTyxTQUFTLENBQUM7U0FDakI7UUFFRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLDhCQUFRLEdBQWhCLFVBQ0MsU0FBeUIsRUFDekIsS0FBUSxFQUNSLEdBQWU7UUFFZixPQUFPLGtDQUFVLENBQ2hCLEdBQUcsRUFDSDtZQUNDLFNBQVMsQ0FBQyxRQUFRO1lBQ2xCLFNBQVMsQ0FBQyxNQUFNO1NBQ2hCLEVBQ0Q7WUFDQyxFQUFFO1lBQ0YsS0FBSztTQUNMLENBQ0QsQ0FBQztJQUNILENBQUM7SUFFRixrQkFBQztBQUFELENBQUM7Ozs7QUNqUHNDO0FBRXZDLElBQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQVF2QjtJQUtDLGtDQUNTLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUovQixjQUFTLEdBQVEsRUFBRSxDQUFDO1FBQ3BCLGdCQUFXLEdBQXNCLEVBQUUsQ0FBQztJQUszQyxDQUFDO0lBRUQsMENBQU8sR0FBUDtRQUNDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztTQUN4RjtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhDLElBQUksQ0FBQyxZQUFZLENBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFDbEMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUMzQixFQUFFLENBQ0YsQ0FBQztRQUVGLE9BQU87WUFDTixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUTtZQUM1QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDdkIsQ0FBQztJQUNILENBQUM7SUFFTyxrREFBZSxHQUF2QjtRQUFBLGlCQXdDQztRQXZDQSxJQUFNLE1BQU0sR0FNUixFQUFFLENBQUM7UUFFUCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDM0MsbUJBQVM7WUFDUixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQ3BDLElBQU0sTUFBTSxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXJELCtEQUErRDtZQUMvRCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU87YUFDUDtZQUVELElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDbkMsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUUvQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3JDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDeEI7WUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQy9DLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDbEM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pELE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDNUM7WUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FDRCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU8sK0NBQVksR0FBcEIsVUFDQyxRQUFzQixFQUN0QixXQUEyQyxFQUMzQyxlQUErQztRQUUvQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzVDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDL0I7UUFFRCxLQUF3QixVQUFXLEVBQVgsMkJBQVcsRUFBWCx5QkFBVyxFQUFYLElBQVcsRUFBRTtZQUFoQyxJQUFNLFNBQVM7WUFDbkIsSUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUVoQywrREFBK0Q7WUFDL0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDckQsU0FBUzthQUNUO1lBRUQsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV2QyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDakU7SUFDRixDQUFDO0lBRU8sOENBQVcsR0FBbkIsVUFDQyxTQUFrQztRQUVsQyxJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ3BDLElBQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUN2QyxRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7UUFFRixJQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUN6RixRQUFRLEVBQ1IsTUFBTSxDQUNOLENBQUM7UUFFRixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckUsSUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBRWpCLEtBQUssSUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQ2hCLFNBQVMsRUFDVCxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQ3JCLEtBQUssQ0FDTCxDQUFDO1NBQ0Y7UUFFRCxLQUE4QixVQUFnQixFQUFoQixxQ0FBZ0IsRUFBaEIsOEJBQWdCLEVBQWhCLElBQWdCLEVBQUU7WUFBM0MsSUFBTSxlQUFlO1lBQ3pCLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUMzQyxTQUFTO2FBQ1Q7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUNoQixlQUFlLENBQUMsUUFBUSxFQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsRUFDcEUsS0FBSyxDQUNMLENBQUM7U0FDRjtRQUVELElBQU0sU0FBUyxHQUFHLHFDQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBTSxRQUFRLEdBQUcscUNBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUU7WUFDMUIsT0FBTztnQkFDTixNQUFNLEVBQUUsTUFBTTtnQkFDZCxLQUFLLEVBQUUsS0FBSzthQUNaLENBQUM7U0FDRjtRQUVELElBQUksU0FBUyxFQUFFO1lBQ2QsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsQ0FBQztTQUN4QjtRQUVELElBQUksUUFBUSxFQUFFO1lBQ2IsT0FBTyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQztTQUN0QjtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3BCLENBQUM7SUFFTyxtREFBZ0IsR0FBeEIsVUFDQyxVQUFvQixFQUNwQixRQUFnQjtRQUVoQixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMzQixPQUFPLEVBQUUsQ0FBQztTQUNWO1FBRUQsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3JDLE9BQU8sRUFBRSxDQUFDO1NBQ1Y7UUFFRCxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQ0YsK0JBQUM7QUFBRCxDQUFDOzs7O0FDNUwyQjtBQUtvQjtBQUVoRCxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFFdEI7SUFDQyxzQkFDUyxZQUEwQixFQUMzQixRQUFrQixFQUNsQixNQUFnQixFQUNoQixNQUE4QjtRQUE5QixzQ0FBOEI7UUFIN0IsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDM0IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFVO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQXdCO0lBR3RDLENBQUM7SUFFTyxvQ0FBYSxHQUFyQixVQUNDLEtBQVUsRUFDVixVQUFlO1FBRWYsSUFBSSx5QkFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQzVDLFVBQVUsRUFDVixLQUFLLENBQ0wsQ0FBQztTQUNGO1FBRUQsSUFBSSx5QkFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQ3hDLFVBQVUsRUFDVixLQUFLLENBQ0wsQ0FBQztTQUNGO1FBRUQseUNBQXlDO1FBQ3pDLE9BQU8sVUFBVSxJQUFJLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsaUNBQVUsR0FBVixVQUFZLEtBQWU7UUFDMUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEM7UUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQ3RCLEtBQUssQ0FDTCxDQUFDO1NBQ0Y7UUFFRCxJQUFJLENBQUMscUNBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyx5Q0FBa0IsR0FBMUIsVUFBNEIsS0FBZTtRQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDbEIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxLQUFLLENBQUM7UUFFVixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDcEIsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUNkO2FBQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDOUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUNkO2FBQU07WUFDTixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUM1QixNQUFNLENBQUMsTUFBTSxFQUNiLEtBQUssQ0FBQyxLQUFLLENBQ1gsQ0FBQztTQUNGO1FBRUQsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFFTyx3Q0FBaUIsR0FBekIsVUFBMkIsS0FBZTtRQUN6QyxJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBRXBDLElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxRQUFRLENBQUM7UUFFYixRQUFRLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDdkIsS0FBSyxLQUFLO2dCQUNULE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2QsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDakIsTUFBTTtZQUNQLEtBQUssSUFBSTtnQkFDUixNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNmLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLE1BQU07WUFDUDtnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFFRCxLQUF3QixVQUFVLEVBQVYseUJBQVUsRUFBVix3QkFBVSxFQUFWLElBQVUsRUFBRTtZQUEvQixJQUFNLFNBQVM7WUFDbkIsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzthQUN4QztZQUVELElBQUksS0FBSyxLQUFLLEtBQUssRUFBRTtnQkFDcEIsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNmO1NBQ0Q7UUFFRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7WUFDckIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBRU8sdUNBQWdCLEdBQXhCLFVBQ0MsS0FBVSxFQUNWLEtBQWU7UUFFZixJQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3RCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFN0IsSUFBSSxDQUFDLHFDQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsb0NBQW9DO1NBQy9EO1lBQ0MsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN4QixPQUFPLENBQUMsSUFBSSxDQUNYLGdCQUFnQixFQUNoQixHQUFHLEVBQ0gsZUFBZSxFQUNmLElBQUksQ0FBQyxRQUFRLENBQ2IsQ0FBQztZQUVGLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDekIsVUFBVSxHQUFHLHlCQUFNLEVBQUUsQ0FBQztTQUN0QjtRQUVELFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUN6QixLQUFLLEdBQUc7Z0JBQ1AsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUN4QixLQUFLLEVBQ0wsVUFBVSxDQUNWLENBQUM7WUFDSCxLQUFLLElBQUk7Z0JBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQ3pCLEtBQUssRUFDTCxVQUFVLENBQ1YsQ0FBQztZQUNILEtBQUssR0FBRztnQkFDUCxPQUFPLEtBQUssR0FBRyxVQUFVLENBQUM7WUFDM0IsS0FBSyxJQUFJO2dCQUNSLE9BQU8sS0FBSyxJQUFJLFVBQVUsQ0FBQztZQUM1QixLQUFLLEdBQUc7Z0JBQ1AsT0FBTyxLQUFLLEdBQUcsVUFBVSxDQUFDO1lBQzNCLEtBQUssSUFBSTtnQkFDUixPQUFPLEtBQUssSUFBSSxVQUFVLENBQUM7WUFDNUIsS0FBSyxJQUFJO2dCQUNSLDZFQUE2RTtnQkFDN0UsSUFBTSxHQUFHLEdBQUcsK0JBQU8sQ0FDbEIsS0FBSyxFQUNMLFVBQVUsQ0FDVixDQUFDO2dCQUVGLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvQjtnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQUcsWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQ3JHO0lBQ0YsQ0FBQztJQUNGLG1CQUFDO0FBQUQsQ0FBQzs7Ozs7O0FDdk0yQjtBQUVnRTtBQUU1RixJQUFZLHFCQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ3BCLHVDQUFPO0lBQ1AsdUNBQU87SUFDUCxzQkFBUztBQUNWLENBQUMsRUFKVyxxQkFBUyxLQUFULHFCQUFTLFFBSXBCO0FBRUQsSUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztLQUNoRCxHQUFHLENBQ0gsYUFBRyxJQUFJLGtCQUFXLENBQUMsR0FBRyxDQUFDLEVBQWhCLENBQWdCLENBQ3ZCLENBQUM7QUFJSCxJQUFNLHVCQUF1QjtJQUM1QixjQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUcsV0FBVyxDQUFDLFVBQVU7SUFDNUMsY0FBQyxXQUFXLENBQUMsVUFBVSxJQUFHLFdBQVcsQ0FBQyxNQUFNO0lBQzVDLGNBQUMsV0FBVyxDQUFDLFNBQVMsSUFBRyxXQUFXLENBQUMsa0JBQWtCO0lBQ3ZELGNBQUMsV0FBVyxDQUFDLFNBQVMsSUFBRyxXQUFXLENBQUMsa0JBQWtCO0lBQ3ZELGNBQUMsV0FBVyxDQUFDLGtCQUFrQixJQUFHLFdBQVcsQ0FBQyxTQUFTO0lBQ3ZELGNBQUMsV0FBVyxDQUFDLGtCQUFrQixJQUFHLFdBQVcsQ0FBQyxTQUFTO0lBQ3ZELHFEQUFxRDtJQUNyRCxjQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUcsV0FBVyxDQUFDLEVBQUU7a0JBQ2hDLENBQUM7QUFFRjtJQUNTLDREQUFpQztJQUV6QyxxQkFDQyxLQUFlLEVBQ1AsVUFBa0I7UUFGM0IsWUFJQyxrQkFDQyxLQUFLLENBQ0wsU0FDRDtRQUxRLGdCQUFVLEdBQVYsVUFBVSxDQUFROztJQUszQixDQUFDO0lBRVMscUNBQWUsR0FBekI7UUFDQyxPQUFPO1lBQ04sRUFBRTtZQUNGLElBQUk7U0FDZ0IsQ0FBQztJQUN2QixDQUFDO0lBRVMsbUNBQWEsR0FBdkIsVUFDQyxHQUFXLEVBQ1gsUUFBZ0IsRUFDaEIsR0FBb0I7UUFBcEIsaUNBQW9CO1FBRXBCLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekMsT0FBTztZQUNOO2dCQUNDLEdBQUc7Z0JBQ0gsS0FBSyxFQUFFLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQztnQkFDakMsR0FBRzthQUNIO1lBQ0QsR0FBRyxHQUFHLEtBQUssR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcscUJBQVMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcscUJBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7U0FDMUcsQ0FBQztJQUNILENBQUM7SUFFUyx3Q0FBa0IsR0FBNUIsVUFDQyxHQUFnQixFQUNoQixRQUF1QixFQUN2QixLQUFrQixFQUNsQixLQUFlLEVBQ2YsR0FBb0I7UUFKcEIsOEJBQWdCO1FBQ2hCLHdDQUF1QjtRQUN2QixrQ0FBa0I7UUFFbEIsaUNBQW9CO1FBRXBCLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsT0FBTztZQUNOO2dCQUNDLEdBQUc7Z0JBQ0gsUUFBUTtnQkFDUixLQUFLO2dCQUNMLEtBQUssRUFBRSxXQUFXLENBQUMscUJBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pDLEdBQUc7YUFDSDtZQUNELDJDQUEyQztZQUMzQyxHQUFHLEdBQUcsVUFBVSxHQUFHLHFCQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxRQUFRLEdBQUcscUJBQVMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLHFCQUFTLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLHFCQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1NBQ2xLLENBQUM7SUFDSCxDQUFDO0lBRVMsc0NBQWdCLEdBQTFCLFVBQ0MsS0FBVSxFQUNWLEdBQW9CO1FBQXBCLGlDQUFvQjtRQUVwQixLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoQyxPQUFPO1lBQ047Z0JBQ0MsTUFBTSxFQUFFLEtBQUssQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQztnQkFDNUIsR0FBRzthQUNIO1lBQ0QsR0FBRyxHQUFHLFFBQVEsR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMscUJBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztTQUNqRixDQUFDO0lBQ0gsQ0FBQztJQUVTLHNDQUFnQixHQUExQixVQUNDLE1BQWMsRUFDZCxVQUFlLEVBQ2YsR0FBb0I7UUFBcEIsaUNBQW9CO1FBRXBCLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUM3QixPQUFPO2dCQUNOO29CQUNDLE1BQU07b0JBQ04sR0FBRztpQkFDSDtnQkFDRCxHQUFHLEdBQUcsTUFBTSxHQUFHLHFCQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO2FBQ3hDLENBQUM7U0FDRjtRQUVELElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWhFLE9BQU87WUFDTjtnQkFDQyxNQUFNO2dCQUNOLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQztnQkFDM0MsR0FBRzthQUNIO1lBQ0QsR0FBRyxHQUFHLE1BQU0sR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLHFCQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1NBQzFGLENBQUM7SUFDSCxDQUFDO0lBRVMsMkNBQXFCLEdBQS9CLFVBQWlDLFVBQWU7UUFDL0MsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDbEMsSUFBSSxFQUFFLENBQUM7UUFFVCxJQUFNLEtBQUssR0FBYSxFQUFjLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRWhELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMscUJBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVsQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1YsTUFBTSxJQUFJLHFCQUFTLENBQUMsR0FBRyxDQUFDO2FBQ3hCO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsT0FBTztZQUNOLEtBQUs7WUFDTCxNQUFNO1NBQ04sQ0FBQztJQUNILENBQUM7SUFFUyxzQ0FBZ0IsR0FBMUIsVUFDQyxHQUFXLEVBQ1gsS0FBVSxFQUNWLFVBQTZCLEVBQzdCLEdBQW9CO1FBQXBCLGlDQUFvQjtRQUVwQixLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoQyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDN0IsVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztTQUN2RjtRQUVELElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXVCLFVBQVUsMkVBQXdFLENBQUMsQ0FBQztTQUMzSDtRQUVELElBQUksR0FBRyxFQUFFO1lBQ1IsVUFBVSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsd0NBQXdDO1FBQ3hDLElBQU0sT0FBTyxHQUFHLFVBQVUsS0FBSyxXQUFXLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUVyRCxJQUFNLE1BQU0sR0FBcUI7WUFDaEM7Z0JBQ0MsR0FBRztnQkFDSCxLQUFLLEVBQUUsS0FBSyxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDO2dCQUMzQixVQUFVO2dCQUNWLEdBQUcsRUFBRSxPQUFPO2FBQ1o7WUFDRCxHQUFHLEdBQUcsVUFBVSxHQUFHLHFCQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMscUJBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHO1NBQ25GLENBQUM7UUFFRixJQUFJLE9BQU8sRUFBRTtZQUNaLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUMxQixDQUFDLEVBQ0QsQ0FBQyxDQUFDLENBQ0YsQ0FBQztZQUNGLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxxQkFBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRVMsd0NBQWtCLEdBQTVCLFVBQ0MsUUFBYSxFQUNiLEtBQWdDLEVBQ2hDLE9BQXdCLEVBQ3hCLEdBQW9CO1FBRnBCLGdDQUFrQixFQUFjO1FBQ2hDLHlDQUF3QjtRQUN4QixpQ0FBb0I7UUFFcEIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxPQUFPO1lBQ047Z0JBQ0MsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLEtBQUssRUFBRSxXQUFXLENBQUMscUJBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixHQUFHLEVBQUUsR0FBRzthQUNSO1lBQ0QsR0FBRyxHQUFHLFVBQVUsR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxRQUFRLEdBQUcscUJBQVMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcscUJBQVMsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLHFCQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1NBQzlJLENBQUM7SUFDSCxDQUFDO0lBRVMsdUNBQWlCLEdBQTNCLFVBQ0MsVUFBaUIsRUFDakIsUUFBd0MsRUFDeEMsR0FBb0I7UUFEcEIsc0NBQTJCLFNBQVMsQ0FBQyxHQUFHO1FBQ3hDLGlDQUFvQjtRQUVwQixRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBZSxDQUFDO1FBRS9DLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxRCxPQUFPO1lBQ047Z0JBQ0MsVUFBVSxFQUFFLGdCQUFnQixDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDO2dCQUMzQyxRQUFRO2dCQUNSLEdBQUc7YUFDSDtZQUNELEdBQUcsR0FBRyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMscUJBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztTQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFDQUFlLEdBQXZCLFVBQXlCLFVBQWlCO1FBQTFDLGlCQTBCQztRQXpCQSxJQUFJLGdCQUFnQixHQUE0QixFQUFFLENBQUM7UUFDbkQsSUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixLQUF3QixVQUFVLEVBQVYseUJBQVUsRUFBVix3QkFBVSxFQUFWLElBQVUsRUFBRTtZQUEvQixJQUFNLFNBQVM7WUFDbkIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUM3QztRQUVELGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUN4QyxDQUFDLEVBQ0QsQ0FBQyxJQUNHLFlBQUksQ0FBQyxvQkFBb0IsQ0FDN0IsQ0FBQyxFQUNELENBQUMsQ0FDRCxFQUhJLENBR0osQ0FBQyxDQUFDO1FBRUgsS0FBOEIsVUFBZ0IsRUFBaEIscUNBQWdCLEVBQWhCLDhCQUFnQixFQUFoQixJQUFnQixFQUFFO1lBQTNDLElBQU0sZUFBZTtZQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLGVBQWUsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsT0FBTztZQUNOLEtBQUs7WUFDTCxNQUFNO1NBQ04sQ0FBQztJQUNILENBQUM7SUFFTyxpQ0FBVyxHQUFuQixVQUF3QixLQUFRO1FBQy9CLElBQUksY0FBYyxDQUFDO1FBRW5CLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ3pELElBQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFL0IsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFN0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUM3RTtZQUVELGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTFDLE9BQU87Z0JBQ04sY0FBYztnQkFDZCxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUs7YUFDakIsQ0FBQztTQUNGO1FBRUQsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsT0FBTztZQUNOLGNBQWM7WUFDZCxFQUFFLEdBQUcsY0FBYztTQUNuQixDQUFDO0lBQ0gsQ0FBQztJQU1PLGtDQUFZLEdBQXBCLFVBQXlCLEtBQWdEO1FBQ3hFLDRFQUE0RTtRQUM1RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsT0FBTyxLQUFLO2lCQUNWLEtBQUssRUFBRTtpQkFDUCxJQUFJLEVBQUUsQ0FBQztTQUNUO1FBRUQsSUFBSSx5QkFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQixPQUFPLHlCQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckI7UUFFRCxJQUFJLHlCQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU8seUJBQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTywwQ0FBb0IsR0FBNUIsVUFDQyxDQUFtQixFQUNuQixDQUFtQjtRQUVuQixJQUFJLENBQUMsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLE9BQU8sQ0FBQyxDQUFDO1NBQ1Q7UUFFRCxPQUFPLENBQUMsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRixrQkFBQztBQUFELENBQUMsQ0F4U1EsK0JBQWUsR0F3U3ZCOzs7O0FDcFUwRDtBQUUzRDtJQUNDO0lBQ0EsQ0FBQztJQUVELHNDQUFlLEdBQWYsVUFDQyxLQUFlLEVBQ2YsU0FBbUI7UUFFbkIsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxFQUFFLEVBQUU7WUFDdEUsT0FBTztnQkFDTixVQUFVLEVBQUU7b0JBQ1gsS0FBSztvQkFDTCxTQUFTO2lCQUNUO2FBQ0QsQ0FBQztTQUNGO1FBRUQsNkJBQTZCO1FBQzdCLE9BQU8sRUFBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQscUNBQWMsR0FBZCxVQUNDLEtBQWUsRUFDZixTQUFtQjtRQUVuQixJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRTtZQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUM7U0FDeEQ7UUFFRCw2QkFBNkI7UUFDN0IsT0FBTztZQUNOLFVBQVUsRUFBRTtnQkFDWCxLQUFLO2dCQUNMLFNBQVM7YUFDVDtZQUNELFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtTQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELHlDQUFrQixHQUFsQixVQUNDLEtBQWUsRUFDZixNQUF1QjtRQUV2QixJQUFJLGFBQWEsQ0FBQztRQUVsQixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELGFBQWEsR0FBRztZQUNmLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU07U0FDcEIsQ0FBQztRQUVGLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUMzRCxLQUFLLEVBQ0wsYUFBYSxDQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsa0NBQVcsR0FBWCxVQUFhLE9BQWlCO1FBQzdCLE9BQU87WUFDTixVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUU7WUFDMUIsR0FBRyxFQUFFLElBQUk7WUFDVCxLQUFLLEVBQUUsT0FBTztZQUNkLEdBQUcsRUFBRSxJQUFJO1NBQ1QsQ0FBQztJQUNILENBQUM7SUFDRixtQkFBQztBQUFELENBQUM7Ozs7QUNsRUQ7SUFJQyxnQ0FDUyxVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBSnZCLFlBQU8sR0FBcUIsRUFBRSxDQUFDO1FBQy9CLG1CQUFjLEdBQXFDLEVBQUUsQ0FBQztJQUs5RCxDQUFDO0lBRU0seURBQXdCLEdBQS9CLFVBQ0MsUUFBa0IsRUFDbEIsY0FBaUM7UUFFakMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUU3QixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDcEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN2QjtRQUVELE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVTthQUNqQyxtQkFBbUIsQ0FDbkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUNqQixjQUFjLENBQ2Q7YUFDQSxNQUFNLENBQUM7SUFDVixDQUFDO0lBRU0sdUNBQU0sR0FBYixVQUE4QyxTQUFZO1FBQ3pELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdEMsT0FBTztTQUNQO1FBRUQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBRXBDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNwQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVO2FBQ2pDLG1CQUFtQixDQUNuQixPQUFPLENBQUMsUUFBUSxDQUFDLEVBQ2pCLFNBQVMsQ0FBQyxPQUFPLENBQ2pCO2FBQ0EsTUFBTSxDQUFDO1FBRVQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFFTSxvQ0FBRyxHQUFWO1FBQ0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3JCLENBQUM7SUFDRiw2QkFBQztBQUFELENBQUM7Ozs7QUNqQ0Q7SUFFQyw4QkFDUyxvQkFBMEMsRUFDMUMsbUJBQXdDLEVBQ3hDLFlBQTBCLEVBQzFCLFlBQW1DLEVBQ25DLHVCQUFnRCxFQUNoRCxjQUF1QyxFQUN2Qyw2QkFBNEQsRUFDNUQsaUJBQW9DO1FBUHBDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7UUFDdkMsa0NBQTZCLEdBQTdCLDZCQUE2QixDQUErQjtRQUM1RCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBRTdDLENBQUM7SUFFTSxnREFBaUIsR0FBeEIsVUFBMEIsT0FBc0I7UUFDL0MsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMvQixLQUFLLFFBQVE7Z0JBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLEtBQUssUUFBUTtnQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsS0FBSyxRQUFRO2dCQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxLQUFLLFFBQVE7Z0JBQ1osT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDO0lBQ0YsQ0FBQztJQUVPLGtEQUFtQixHQUEzQixVQUNDLE1BQVcsRUFDWCxPQUF5QjtRQUV6QixJQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsS0FBSyxJQUFNLFFBQVEsSUFBSSxPQUFPLEVBQUU7WUFDL0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQ3ZELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDaEIsQ0FBQztTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU8sa0RBQW1CLEdBQTNCLFVBQ0MsUUFBc0IsRUFDdEIsS0FBOEIsRUFDOUIsT0FBeUI7UUFFekIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2xFLElBQU0sTUFBTSxHQUFzQyxFQUFFLENBQUM7UUFFckQsS0FBSyxJQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDM0IsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLElBQU0sUUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUN0QyxJQUFJLENBQUMsTUFBTSxFQUNYLE9BQU8sQ0FDUCxDQUFDO1lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQ3RFLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBTSxDQUNOLENBQUM7U0FDRjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdEQUFpQixHQUF6QixVQUNDLFFBQXNCLEVBQ3RCLGFBQWdEO1FBRWhELElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNsRSxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdkUsS0FBSyxJQUFNLE1BQU0sSUFBSSxhQUFhLEVBQUU7WUFDbkMsSUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLElBQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUMvQyxJQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ3BELFFBQVEsRUFDUixNQUFNLENBQ04sQ0FBQztZQUVGLEtBQWdDLFVBQWtCLEVBQWxCLHlDQUFrQixFQUFsQixnQ0FBa0IsRUFBbEIsSUFBa0IsRUFBRTtnQkFBL0MsSUFBTSxpQkFBaUI7Z0JBQzNCLGVBQWUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbEQ7WUFFRCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQzVCLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzFDO1NBQ0Q7UUFFRCxPQUFPLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sNkNBQWMsR0FBdEIsVUFDQyxJQUFPO1FBRVAsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2xFLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1FBRWhDLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0MsUUFBUSxFQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQ3RCLENBQUM7UUFFRixJQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQzVDLFFBQVEsRUFDUixhQUFhLENBQ2IsQ0FBQztRQUVGLEtBQUssSUFBTSxZQUFZLElBQUksYUFBYSxFQUFFO1lBQ3pDLElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDcEQsUUFBUSxFQUNSLFlBQVksQ0FDWixDQUFDO1lBRUYsSUFBTSxNQUFNLEdBQUcsQ0FBQyxZQUFZLENBQUM7WUFFN0IsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUV4QixTQUFTO2FBQ1Q7WUFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDL0MsU0FBUzthQUNUO1lBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QjtRQUVELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xDO1FBRUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCO2FBQzNCLEtBQUssQ0FDTCxRQUFRLEVBQ1I7WUFDQyxHQUFHLEVBQUUsSUFBSTtZQUNULFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEtBQUssRUFBRSxVQUFVO1NBQ2pCLEVBQ0QsY0FBYyxDQUNkO2FBQ0EsSUFBSSxDQUNKLGtCQUFRO1lBQ1AsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUNqQyxRQUFRLEVBQ1IsY0FBYyxFQUNkLEtBQUssRUFDTCxJQUFJLENBQ0osQ0FBQztRQUNILENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyw0REFBNkIsR0FBckMsVUFDQyxJQUFPO1FBRFIsaUJBOEVDO1FBM0VBLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNsRSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQ2hELElBQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUVoQyxLQUFLLElBQU0sTUFBTSxJQUFJLEtBQUssRUFBRTtZQUMzQixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUMvQyxJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ3hELFNBQVMsRUFDVCxVQUFVLENBQ1YsQ0FBQztZQUVGLElBQ0MsYUFBYSxLQUFLLFNBQVM7bUJBQ3hCLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUNqRTtnQkFDRCxTQUFTO2FBQ1Q7WUFFRCxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbEM7UUFFRCxPQUFPLElBQUksQ0FBQyxvQkFBb0I7YUFDOUIsVUFBVSxDQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsQ0FBQyxZQUFZLENBQUMsQ0FDZDthQUNBLElBQUksQ0FDSix3QkFBYztZQUNiLGdFQUFnRTtZQUNoRSxJQUFNLFlBQVksR0FBRyxLQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsSUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBRTFELEtBQXFCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO2dCQUE3QixJQUFNLE1BQU07Z0JBQ2hCLElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDcEQsU0FBUyxFQUNULE1BQU0sQ0FDTCxDQUFDO2dCQUVILElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFbkUsSUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ3pELFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxDQUNMLENBQUM7Z0JBRUYsSUFDQyxjQUFjLEtBQUssU0FBUztvQkFDNUIsY0FBYyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsVUFBVSxFQUNoRDtvQkFDRCxTQUFTO2lCQUNUO2dCQUVELFlBQVksQ0FBQyxjQUFjLENBQzFCLFNBQVMsRUFDVCxFQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVSxFQUFDLENBQ3ZDLENBQUM7YUFDRjtZQUVELE9BQU8sV0FBVyxDQUFDLGlCQUFpQixDQUNuQyxZQUFZLEVBQ1osS0FBSyxFQUNMLElBQUksQ0FDSixDQUFDO1FBQ0gsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN4QjthQUNBLEtBQUssQ0FDTCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFTyw4REFBK0IsR0FBdkMsVUFBeUMsT0FBc0I7UUFDOUQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyx3QkFBd0IsQ0FBQztJQUMzRCxDQUFDO0lBSU8sMkNBQVksR0FBcEIsVUFBc0IsT0FBc0I7UUFDM0MsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoRDtRQUVELE9BQU8sSUFBSTthQUNULGNBQWMsQ0FBQyxJQUFJLENBQUM7YUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLDJDQUFZLEdBQXBCLFVBQXNCLE9BQTRCO1FBQ2pELE9BQU8sSUFBSTthQUNULGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTywyQ0FBWSxHQUFwQixVQUFzQixPQUE0QjtRQUNqRCxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN2RSxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEUsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFNLGtCQUFrQixHQUFnQixFQUFFLENBQUM7UUFFM0MsS0FBcUIsVUFBVSxFQUFWLFNBQUksQ0FBQyxLQUFLLEVBQVYsY0FBVSxFQUFWLElBQVUsRUFBRTtZQUE1QixJQUFNLE1BQU07WUFDaEIsSUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUN0RCxJQUFJLENBQUMsUUFBUSxFQUNiLE1BQU0sQ0FDTixDQUFDO1lBRUYsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUM5QixTQUFTO2FBQ1Q7WUFFRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDckM7UUFFRCxZQUFZLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFakQsV0FBVyxDQUFDLHNCQUFzQixDQUNqQyxZQUFZLEVBQ1osS0FBSyxFQUNMLElBQUksQ0FDSixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTyw2Q0FBYyxHQUF0QixVQUF3QixPQUE0QjtRQUNuRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzthQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBcUJGLDJCQUFDO0FBQUQsQ0FBQzs7Ozs7QUN4VXVCO0FBV3lDO0FBR2pFO0lBQ1MsNkVBQXFCO0lBTTdCLHNDQUNTLFlBQTZELEVBQzdELFdBQW1DLEVBQ2pDLFdBQTZCO1FBSHhDLFlBS0Msa0JBQ0MsWUFBWSxDQUFDLHNCQUFzQixFQUNuQyxZQUFZLENBQUMsVUFBVSxFQUN2QixZQUFZLENBQUMsNkJBQTZCLEVBQzFDLFlBQVksQ0FBQyxzQkFBc0IsRUFDbkMsV0FBVyxDQUNYLFNBRUQ7UUFaUSxrQkFBWSxHQUFaLFlBQVksQ0FBaUQ7UUFDN0QsaUJBQVcsR0FBWCxXQUFXLENBQXdCO1FBQ2pDLGlCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQVBqQyx5QkFBbUIsR0FFdEIsRUFBRSxDQUFDOztJQWVQLENBQUM7SUFFTSw4REFBdUIsR0FBOUIsVUFDQyxRQUFzQixFQUN0QixLQUFlLEVBQ2YsT0FBeUI7UUFIMUIsaUJBK0JDO1FBMUJBLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLFdBQVc7aUJBQ3JCLGNBQWMsRUFBRTtpQkFDaEIsaUJBQWlCO2lCQUNqQix1QkFBdUIsQ0FDdkIsUUFBUSxFQUNSLEtBQUssRUFDTCxPQUFPLENBQ1AsQ0FBQztTQUNIO1FBRUQsT0FBTyxJQUFJO2FBQ1Qsb0JBQW9CLENBQ3BCLFFBQVEsRUFDUixJQUFJLDZCQUFzQixDQUN6QjtZQUNDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsS0FBSyxFQUFFLEtBQUs7U0FDWixDQUNELENBQ0Q7YUFDQSxJQUFJLENBQ0oseUJBQWUsSUFBSSxZQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQTlFLENBQThFLEVBQ2pHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTSxrRUFBMkIsR0FBbEMsVUFDQyxRQUFzQjtRQUV0QixJQUFNLGlCQUFpQixHQUFzQixFQUFFLENBQUM7UUFFaEQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ25ELE9BQU8saUJBQWlCLENBQUM7U0FDekI7UUFFRCxLQUFLLElBQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzRCxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG9DQUFvQyxDQUM1RSxRQUFRLEVBQ1IsV0FBVyxDQUNYLENBQUM7WUFFRixJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzNFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN4QztTQUNEO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUMxQixDQUFDO0lBRU0sNERBQXFCLEdBQTVCLFVBQ0MsUUFBc0IsRUFDdEIsT0FBK0I7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsV0FBVztpQkFDckIsY0FBYyxFQUFFO2lCQUNoQixpQkFBaUI7aUJBQ2pCLHFCQUFxQixDQUNyQixRQUFRLEVBQ1IsT0FBTyxDQUNQLENBQUM7U0FDSDtRQUVELE9BQU8saUJBQU0scUJBQXFCLFlBQ2pDLFFBQVEsRUFDUixPQUFPLENBQ1AsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksMkRBQW9CLEdBQTNCLFVBQ0MsZUFBZ0MsRUFDaEMsYUFBNEI7UUFFNUIsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvRCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDNUIsT0FBTztTQUNQO1FBRUQsS0FBdUIsVUFBUyxFQUFULHVCQUFTLEVBQVQsdUJBQVMsRUFBVCxJQUFTLEVBQUU7WUFBN0IsSUFBTSxRQUFRO1lBQ2xCLElBQUk7Z0JBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDL0M7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFDO1NBQ0Q7SUFDRixDQUFDO0lBRU0saURBQVUsR0FBakIsVUFBbUIsS0FBc0I7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLDhEQUE4RDtRQUM5RCxxREFBcUQ7SUFDdEQsQ0FBQztJQUVNLGtEQUFXLEdBQWxCLFVBQW9CLFFBQTRCO1FBQy9DLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWhFLElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRTtZQUNoQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2pFO1FBRUQsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sb0RBQWEsR0FBcEIsVUFBc0IsUUFBNEI7UUFDakQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUxQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNqQixTQUFTLENBQUMsTUFBTSxDQUNmLEtBQUssRUFDTCxDQUFDLENBQ0QsQ0FBQztTQUNGO1FBRUQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO0lBQ0YsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGdEQUFTLEdBQWhCLFVBQ0MscUJBQTBDLEVBQzFDLDBCQUErQyxFQUMvQyxXQUE4RDtRQUU5RCxJQUFJLHFCQUFxQixDQUFDLFFBQVEsS0FBSywwQkFBMEIsQ0FBQyxRQUFRLEVBQUU7WUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1NBQ25GO1FBRUQsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV2RSw0QkFBNEI7UUFDNUIsS0FBd0IsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7WUFBaEMsSUFBTSxTQUFTO1lBQ25CLFlBQVksQ0FBQyxZQUFZLENBQ3hCLFNBQVMsRUFDVCwwQkFBMEIsQ0FBQyxNQUFPLENBQ2xDLENBQUM7U0FDRjtRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLDREQUFxQixHQUE1QixVQUNDLGVBQW9DLEVBQ3BDLGFBQTRCO1FBRTVCLE9BQU8sSUFBSTthQUNULFdBQVc7YUFDWCxjQUFjLEVBQUU7YUFDaEIsaUJBQWlCO2FBQ2pCLHFCQUFxQixDQUNyQixlQUFlLEVBQ2YsYUFBYSxDQUNiLENBQUM7SUFDSixDQUFDO0lBRU0sMkRBQW9CLEdBQTNCLFVBQ0MsWUFBMEIsRUFDMUIsV0FBZ0MsRUFDaEMsYUFBdUMsRUFDdkMsb0JBQTJDO1FBRDNDLGtEQUF1QztRQUd2QyxrSEFBa0g7UUFDbEgsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUN6RSxXQUFXLENBQUMsRUFBRSxDQUNkLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUNoQyxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixvQkFBb0IsQ0FDcEIsQ0FBQztJQUNILENBQUM7SUFFTSwyREFBb0IsR0FBM0I7UUFBQSxpQkFLQztRQUpBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQzFELElBQUksQ0FBQyxXQUFXLEVBQ2hCLGtCQUFRLElBQUksWUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxFQUExQyxDQUEwQyxDQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVNLDJEQUFvQixHQUEzQixVQUNDLFFBQXNCLEVBQ3RCLE9BQStCO1FBRmhDLGlCQStDQztRQTNDQSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxXQUFXO2lCQUNyQixjQUFjLEVBQUU7aUJBQ2hCLGlCQUFpQjtpQkFDakIsb0JBQW9CLENBQ3BCLFFBQVEsRUFDUixPQUFPLENBQ1AsQ0FBQztTQUNIO1FBRUQsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsNkJBQTZCLENBQ2pDLFFBQVEsRUFDUixPQUFPLEVBQ1AsV0FBVyxDQUFDLE1BQU0sQ0FDbEIsQ0FBQztRQUVGLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkUsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFaEcsSUFBSSxlQUFlLENBQUM7UUFFcEIsT0FBTyxJQUFJO2FBQ1QsbUJBQW1CLENBQ25CLFlBQVksRUFDWixRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxXQUFXLENBQ1g7YUFDQSxJQUFJLENBQ0osMEJBQWdCO1lBQ2YsZUFBZSxHQUFHLGdCQUFnQixDQUFDO1lBRW5DLE9BQU8sS0FBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQzthQUNBLElBQUksQ0FDSixjQUFNLHNCQUFlLEVBQWYsQ0FBZSxFQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU0sbUVBQTRCLEdBQW5DLFVBQ0MsVUFBb0IsRUFDcEIsYUFBMEMsRUFDMUMsUUFBc0IsRUFDdEIsT0FBK0I7UUFFL0IsSUFBSSx5QkFBVSxDQUFpQixhQUFhLENBQUMsRUFBRTtZQUM5QyxhQUFhLEdBQUcsYUFBYSxFQUFFLENBQUM7U0FDaEM7UUFFRCxJQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7UUFDckMsSUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1FBRXBDLEtBQXFCLFVBQWEsRUFBYiwrQkFBYSxFQUFiLDJCQUFhLEVBQWIsSUFBYSxFQUFFO1lBQS9CLElBQU0sTUFBTTtZQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbkQsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtpQkFBTTtnQkFDTixlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzdCO1NBQ0Q7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYzthQUNyQyxHQUFHLENBQUM7WUFDSixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7aUJBQ3RCLGNBQWMsRUFBRTtpQkFDaEIsaUJBQWlCO2lCQUNqQiw0QkFBNEIsQ0FDNUIsVUFBVSxFQUNWLGVBQWUsRUFDZixRQUFRLEVBQ1IsT0FBTyxDQUNQO1lBQ0YsS0FBSyxFQUFFLElBQUksQ0FBQyxpQ0FBaUMsQ0FDNUMsVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBQ1IsT0FBTyxDQUNQO1NBQ0QsQ0FBQzthQUNELElBQUksQ0FDSixnQkFBTTtZQUNMLE9BQU8sZ0ZBQ0gsTUFBTSxDQUFDLE1BQU0sR0FDYixNQUFNLENBQUMsS0FBSyxFQUNkO1FBQ0gsQ0FBQyxDQUNELENBQUM7SUFDSixDQUFDO0lBRU0sOERBQXVCLEdBQTlCLFVBQ0MsVUFBb0IsRUFDcEIsUUFBc0IsRUFDdEIsV0FBMEMsRUFDMUMsVUFBOEI7UUFFOUIsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNyQixjQUFjLEVBQUU7YUFDaEIsaUJBQWlCO2FBQ2pCLHVCQUF1QixDQUN2QixVQUFVLEVBQ1YsUUFBUSxFQUNSLFdBQVcsRUFDWCxVQUFVLENBQ1YsQ0FBQztJQUNKLENBQUM7SUFFTSw4REFBdUIsR0FBOUIsVUFDQyxVQUFvQixFQUNwQixRQUFrQixFQUNsQixPQUErQixFQUMvQixhQUE0QixFQUM1QixXQUFjO1FBRWQsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNyQixjQUFjLEVBQUU7YUFDaEIsaUJBQWlCO2FBQ2pCLHVCQUF1QixDQUN2QixVQUFVLEVBQ1YsUUFBUSxFQUNSLE9BQU8sRUFDUCxhQUFhLEVBQ2IsV0FBVyxDQUNYLENBQUM7SUFDSixDQUFDO0lBRU0sd0VBQWlDLEdBQXhDLFVBQ0MsZUFBb0MsRUFDcEMsV0FBOEQsRUFDOUQseUJBQTBDO1FBQTFDLDZFQUEwQztRQUUxQyxpQkFBTSxrQ0FBa0MsWUFDdkMsZUFBZSxFQUNmLFdBQVcsRUFDWCxjQUFNLFlBQUssRUFBTCxDQUFLLEVBQ1gseUJBQXlCLENBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU0sOENBQU8sR0FBZCxVQUNDLE9BQWtEO1FBRWxELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFOUIsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLDREQUFxQixHQUE1QixVQUNDLFlBQTBCLEVBQzFCLGVBQW9DLEVBQ3BDLFVBQTZCO1FBSDlCLGlCQStDQztRQTFDTyxtRkFBVSxDQUE0RDtRQUU3RSxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbkQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDOUQ7UUFFRCxJQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDO1FBRTFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhO2FBQ3BDLEtBQUssQ0FDTCxRQUFRLEVBQ1IsVUFBVSxDQUNWO2FBQ0EsSUFBSSxDQUNKLHlCQUFlO1lBQ2QsT0FBTyxLQUFJLENBQUMsV0FBVztpQkFDckIsc0JBQXNCLENBQ3RCLFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSSxDQUFDLG9CQUFvQixDQUN4QixlQUFlLENBQUMsUUFBUSxFQUN4QixlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDM0IsRUFDRixVQUFVLEVBQ1YsZUFBZSxDQUNmO2lCQUNBLElBQUksQ0FDSjtnQkFDQyxJQUFNLGVBQWUsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDekUsUUFBUSxFQUNSLFVBQVUsRUFDVixlQUFlLENBQ2YsQ0FBQztnQkFDRixlQUFlLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUUvQyxPQUFPLGVBQWUsQ0FBQztZQUN4QixDQUFDLEVBQ0QsS0FBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDO1FBQ0osQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ08scUVBQThCLEdBQXhDLFVBQ0MsZUFBb0MsRUFDcEMsWUFBK0Q7UUFFL0QsSUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXpFLDRFQUE0RTtRQUM1RSxJQUNDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQztlQUN0QixtQkFBbUIsS0FBSyxTQUFTO2VBQ2pDLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ2xDO1lBQ0QsT0FBTztTQUNQO1FBRUQsS0FBaUMsVUFBbUIsRUFBbkIsMkNBQW1CLEVBQW5CLGlDQUFtQixFQUFuQixJQUFtQixFQUFFO1lBQWpELElBQU0sa0JBQWtCO1lBQzVCLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2xEO0lBQ0YsQ0FBQztJQUVEOzs7T0FHRztJQUNPLHVFQUFnQyxHQUExQyxVQUNDLGVBQW9DLEVBQ3BDLGtCQUFxRTtRQUVyRSxJQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekUsSUFDQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztlQUM1QixtQkFBbUIsS0FBSyxTQUFTO2VBQ2pDLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ2xDO1lBQ0QsT0FBTztTQUNQO1FBRUQsS0FBaUMsVUFBbUIsRUFBbkIsMkNBQW1CLEVBQW5CLGlDQUFtQixFQUFuQixJQUFtQixFQUFFO1lBQWpELElBQU0sa0JBQWtCO1lBQzVCLElBQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUVwRixrQkFBa0IsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNsRDtJQUNGLENBQUM7SUFFTywwREFBbUIsR0FBM0IsVUFDQyxZQUEwQixFQUMxQixRQUFzQixFQUN0QixpQkFBa0QsRUFDbEQsT0FBK0IsRUFDL0IsZUFBZ0M7UUFMakMsaUJBK0NDO1FBeENBLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQ3BELFFBQVEsRUFDUixlQUFlLENBQ2YsQ0FBQztRQUVGLElBQUkscUJBQXFCLEtBQUssSUFBSSxFQUFFO1lBQ25DLDRGQUE0RjtZQUU1RixJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQzthQUNwRTtZQUVELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUNoQyxZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLGlCQUFpQixDQUFDLGNBQWMsQ0FDaEMsQ0FBQztTQUNGO1FBRUQsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUNqRCxRQUFRLEVBQ1IsT0FBTyxDQUNQLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYTthQUNwQyxLQUFLLENBQ0wsUUFBUSxFQUNSLE9BQU8sQ0FBQyxPQUFPLENBQ2Y7YUFDQSxJQUFJLENBQ0oseUJBQWU7WUFDZCxlQUFlLENBQUMsT0FBTyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FDekUsZUFBZSxDQUFDLFFBQVEsRUFDeEIsT0FBTyxDQUFDLE9BQU8sRUFDZixlQUFlLENBQ2YsQ0FBQztZQUVGLE9BQU8sZUFBZSxDQUFDO1FBQ3hCLENBQUMsQ0FDRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLHdFQUFpQyxHQUF6QyxVQUNDLFVBQW9CLEVBQ3BCLGFBQXVCLEVBQ3ZCLFFBQWtCLEVBQ2xCLE9BQStCO1FBSmhDLGlCQW1EQztRQTdDQSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZFLElBQU0sUUFBUSxHQUE0RCxFQUFFLENBQUM7UUFFN0UsS0FBdUIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7WUFBakMsSUFBTSxRQUFRO1lBQ2xCLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQzFELE9BQU8sRUFDUDtnQkFDQyxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDaEIsQ0FDRCxDQUFDO1lBRUYsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUV4RSxJQUFJLENBQUMsNkJBQTZCLENBQ2pDLFFBQVEsRUFDUixVQUFVLEVBQ1YsV0FBVyxDQUFDLE1BQU0sQ0FDbEIsQ0FBQztZQUVGLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5HLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQzVDLFlBQVksRUFDWixRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixXQUFXLENBQ1gsQ0FBQztTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWM7YUFDckMsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUNiLElBQUksQ0FDSixvQ0FBMEI7WUFFekIsT0FBTyxLQUFJLENBQUMsV0FBVztpQkFDckIsaUJBQWlCLENBQUMsWUFBWSxDQUFDO2lCQUMvQixJQUFJLENBQ0osY0FBTSxpQ0FBMEIsRUFBMUIsQ0FBMEIsRUFDaEMsS0FBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDO1FBQ0osQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFDRixtQ0FBQztBQUFELENBQUMsQ0Eza0JRLDJDQUFxQixHQTJrQjdCOzs7O0FDeG1CMEM7QUFTM0M7SUFjQyw4QkFDVyxXQUE2QjtRQUE3QixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFiaEMsZUFBVSxHQU9kO1lBQ0gsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtTQUNSLENBQUM7SUFNRixDQUFDO0lBc0JTLDZDQUFjLEdBQXhCLFVBQ0MsR0FBVyxFQUNYLFNBQThDLEVBQzlDLDRCQUEwQyxFQUMxQyxLQUE0QjtRQUo3QixpQkEyQ0M7UUFyQ0EsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUVyQyxJQUFJLENBQUMscUNBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDL0IsR0FBRyxFQUNILFNBQVMsRUFDVCw0QkFBNEIsRUFDNUIsS0FBSyxDQUNMLENBQUM7WUFFRixPQUFPO1NBQ1A7UUFFRCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWpDLFNBQVMsQ0FBQyxJQUFJLENBQ2IseUJBQWU7WUFDZCxJQUFJLE1BQU0sS0FBSyxLQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDM0MsT0FBTzthQUNQO1lBRUQsT0FBTyxLQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQyxLQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDL0IsR0FBRyxFQUNILGVBQWUsRUFDZiw0QkFBNEIsRUFDNUIsS0FBSyxDQUNMLENBQUM7UUFDSCxDQUFDLEVBQ0Q7WUFDQyxLQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FDRCxDQUFDO0lBQ0gsQ0FBQztJQUVTLDJDQUFZLEdBQXRCLFVBQ0MsV0FBNEIsRUFDNUIsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsU0FBOEMsRUFDOUMsdUJBQXFDLEVBQ3JDLDRCQUEwQyxFQUMxQyxLQUE0QjtRQVA3QixpQkFtREM7UUExQ0EsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUUzQyxJQUFJLENBQUMscUNBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FDN0IsV0FBVyxFQUNYLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULHVCQUF1QixFQUN2Qiw0QkFBNEIsRUFDNUIsS0FBSyxDQUNMLENBQUM7WUFFRixPQUFPO1NBQ1A7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFakMsU0FBUyxDQUFDLElBQUksQ0FDYix5QkFBZTtZQUNkLElBQUksTUFBTSxLQUFLLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNqRCxPQUFPO2FBQ1A7WUFFRCxPQUFPLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXpDLEtBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUM3QixXQUFXLEVBQ1gsUUFBUSxFQUNSLFFBQVEsRUFDUixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLDRCQUE0QixFQUM1QixLQUFLLENBQ0wsQ0FBQztRQUNILENBQUMsRUFDRDtZQUNDLEtBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUNELENBQUM7SUFDSCxDQUFDO0lBRU8sMENBQVcsR0FBbkI7UUFDQyxPQUFPLElBQUk7YUFDVCxNQUFNLEVBQUU7YUFDUixRQUFRLEVBQUU7YUFDVixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVGLDJCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVKRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ0s7QUFDRztBQUNGO0FBQ0Y7QUFDRDtBQUNPO0FBQ0w7QUFDUTtBQUNkO0FBQ0k7QUFDRjtBQUNIO0FBQ0Q7QUFDUTtBQUNQO0FBQ1U7QUFDUDtBQUNKO0FBQ087QUFDTjtBQUMrQjtBQUM5QjtBQUNhO0FBQ1o7QUFDRDtBQUNDO0FBQ1U7QUFDRjtBQUNoQjtBQUNlO0FBQ0s7QUFDTTtBQUNNO0FBQ0Y7QUFDTTtBQUNNO0FBQ0w7QUFDSDtBQUN0QjtBQUNKO0FBQ1E7QUFDQTtBQUNQO0FBQ0k7QUFDRTs7Ozs7Ozs7QUMzQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFPLFNBQVMsa0JBQWtCLENBQ2pDLE9BQTZCLEVBQzdCLE1BQWM7SUFFZCxLQUFLLElBQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtRQUN6QixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUU7WUFDdEIsU0FBUztTQUNUO1FBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzlCLFNBQVM7U0FDVDtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDM0I7QUFDRixDQUFDO0FBRU0sU0FBUyxZQUFZLENBQzNCLE1BQU0sRUFDTixRQUFRO0lBRVIsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1FBQ3pCLE9BQU8sUUFBUSxDQUFDO0tBQ2hCO0lBRUQsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBRWxCLEtBQUssSUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDeEMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDN0I7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUM7QUFFTSxTQUFTLGFBQWEsQ0FBRSxNQUFNO0lBQ3BDLGFBQWE7SUFDYixLQUFLLElBQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtRQUN6QixPQUFPLElBQUksQ0FBQztLQUNaO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDO0FBRU0sU0FBUyxnQkFBZ0IsQ0FBRSxNQUFNO0lBQ3ZDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0tBQ1o7SUFFRCxLQUFLLElBQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtRQUN6QixPQUFPLEdBQUcsQ0FBQztLQUNYO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDYixDQUFDO0FBRU0sU0FBUyxPQUFPLENBQ3RCLE1BQU0sRUFDTixRQUFRO0lBRVIsS0FBa0IsVUFBUSxFQUFSLHFCQUFRLEVBQVIsc0JBQVEsRUFBUixJQUFRLEVBQUU7UUFBdkIsSUFBTSxHQUFHO1FBQ2IseUNBQXlDO1FBQ3pDLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQztTQUNaO0tBQ0Q7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNkLENBQUM7QUFFTSxTQUFTLFdBQVcsQ0FDMUIsTUFBVyxFQUNYLFFBQThCO0lBRTlCLElBQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztJQUV6QixLQUFrQixVQUFNLEVBQU4saUJBQU0sRUFBTixvQkFBTSxFQUFOLElBQU0sRUFBRTtRQUFyQixJQUFNLEdBQUc7UUFDYixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25CO0tBQ0Q7SUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUN0QyxPQUFPLEtBQUssQ0FBQztLQUNiO0lBRUQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5CLEtBQXFCLFVBQVEsRUFBUixxQkFBUSxFQUFSLHNCQUFRLEVBQVIsSUFBUSxFQUFFO1FBQTFCLElBQU0sTUFBTTtRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3BCO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDYixDQUFDO0FBRU0sU0FBUyxVQUFVLENBQUUsS0FBSztJQUNoQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFFTSxTQUFTLFVBQVUsQ0FDekIsTUFBTSxFQUNOLElBQUk7SUFFSixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUNsQyxPQUFPLEtBQUssQ0FBQztLQUNiO0lBRUQsS0FBZ0IsVUFBSSxFQUFKLGFBQUksRUFBSixrQkFBSSxFQUFKLElBQUksRUFBRTtRQUFqQixJQUFNLENBQUM7UUFDWCxJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUNyQyxPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuQjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2IsQ0FBQztBQUVNLFNBQVMsVUFBVSxDQUN6QixNQUFXLEVBQ1gsSUFBNEIsRUFDNUIsUUFBZTtJQUVmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjtRQUVELE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdkI7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUM7QUFFTSxTQUFTLE9BQU8sQ0FDdEIsTUFBVSxFQUNWLElBQTRCLEVBQzVCLE1BQXVCO0lBQXZCLHVDQUF1QjtJQUV2QixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7UUFDekIsT0FBTyxTQUFTLENBQUM7S0FDakI7SUFFRCxLQUFnQixVQUFJLEVBQUosYUFBSSxFQUFKLGtCQUFJLEVBQUosSUFBSSxFQUFFO1FBQWpCLElBQU0sQ0FBQztRQUNYLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0I7UUFFbkQsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3BDLE9BQU8sU0FBUyxDQUFDO1NBQ2pCO0tBQ0Q7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsU0FBUyxVQUFVLENBQ2xCLEdBQUcsRUFDSCxJQUFJLEVBQ0osSUFBSTtJQUVKLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDOUMsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkMsU0FBUztTQUNUO1FBRUQsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFckIsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDaEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDekIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMzQjtxQkFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ3hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMvQjtxQkFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDdkI7cUJBQU07b0JBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ2xDO29CQUVELFVBQVUsQ0FDVCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQ1IsQ0FBQyxHQUFHLENBQUMsRUFDTCxJQUFJLENBQ0osQ0FBQztpQkFDRjthQUNEO2lCQUFNO2dCQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDZjtTQUNEO0tBQ0Q7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNaLENBQUM7QUFFTSxTQUFTLE1BQU0sQ0FDckIsR0FBRztJQUNILGNBQU87U0FBUCxVQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPO1FBQVAsNkJBQU87O0lBRVAsT0FBTyxVQUFVLENBQ2hCLEdBQUcsRUFDSCxJQUFJLEVBQ0osS0FBSyxDQUNMLENBQUM7QUFDSCxDQUFDO0FBRU0sU0FBUyxLQUFLLENBQ3BCLEdBQUc7SUFDSCxjQUFPO1NBQVAsVUFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTztRQUFQLDZCQUFPOztJQUVQLE9BQU8sVUFBVSxDQUNoQixHQUFHLEVBQ0gsSUFBSSxFQUNKLElBQUksQ0FDSixDQUFDO0FBQ0gsQ0FBQztBQUVNLFNBQVMsUUFBUSxDQUFFLEtBQUs7SUFDOUIsOEJBQThCO0lBQzlCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDcEQsQ0FBQztBQUVNLFNBQVMsYUFBYSxDQUFFLEtBQUs7SUFDbkMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVNLFNBQVMsUUFBUSxDQUFFLEtBQUs7SUFDOUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDbEMsQ0FBQztBQUVNLFNBQVMsUUFBUSxDQUFFLEtBQUs7SUFDOUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDbEMsQ0FBQztBQUVNLFNBQVMsTUFBTSxDQUFFLEtBQUs7SUFDNUIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGVBQWUsQ0FBQztBQUNqRCxDQUFDO0FBRU0sSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUU5QixTQUFTLFVBQVUsQ0FBSyxLQUFVO0lBQ3hDLE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDO0FBQ3BDLENBQUM7QUFFTSxTQUFTLGFBQWEsQ0FBVyxHQUFRO0lBQy9DLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVNLFNBQVMsUUFBUSxDQUFFLEtBQUs7SUFDOUIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGlCQUFpQixDQUFDO0FBQ25ELENBQUM7QUFFTSxTQUFTLFNBQVMsQ0FBRSxLQUFLO0lBQy9CLE9BQU8sT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQ25DLENBQUM7QUFFTSxTQUFTLFNBQVMsQ0FBRSxJQUFJO0lBQzlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNiLENBQ0MsSUFBSSxDQUFDLFFBQVEsQ0FBRSwyQkFBMkI7ZUFDdkMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUN4QyxDQUNELENBQUMsQ0FBRSxvREFBb0Q7QUFDekQsQ0FBQztBQUVNLFNBQVMsUUFBUSxDQUFFLEdBQUc7SUFDNUIsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDbEMsQ0FBQztBQUVNLFNBQVMsU0FBUyxDQUFFLEtBQUs7SUFDL0IsT0FBTyxPQUFPLEtBQUssS0FBSyxXQUFXLENBQUM7QUFDckMsQ0FBQztBQUVNLFNBQVMsTUFBTSxDQUNyQixFQUFFLEVBQ0YsRUFBRTtJQUVGLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFDO0tBQ1o7SUFFRCxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvQixPQUFPLEtBQUssQ0FBQztLQUNiO0lBRUQsMkNBQTJDO0lBQzNDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLE9BQU8sSUFBSSxDQUFDO0tBQ1osQ0FBQyxjQUFjO0lBRWhCLElBQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLElBQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBRXJCLElBQUksTUFBTSxDQUFDO0lBQ1gsSUFBSSxHQUFHLENBQUM7SUFDUixJQUFJLE1BQU0sQ0FBQztJQUVYLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssUUFBUSxFQUFFO1FBQ2pDLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pCLE9BQU8sS0FBSyxDQUFDO2FBQ2I7WUFFRCxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUVuQixJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRTtnQkFDNUIsS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxNQUFNLENBQ1YsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUNQLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FDUCxFQUFFO3dCQUNGLE9BQU8sS0FBSyxDQUFDO3FCQUNiO2lCQUNEO2dCQUVELE9BQU8sSUFBSSxDQUFDO2FBQ1o7U0FDRDthQUFNLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO2FBQ2I7WUFFRCxPQUFPLGFBQWEsQ0FDbkIsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUNaLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FDWixDQUFDO1NBQ0Y7YUFBTSxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNsQixPQUFPLEtBQUssQ0FBQzthQUNiO1lBRUQsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3ZDO2FBQU07WUFDTixJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQzlFLE9BQU8sS0FBSyxDQUFDO2FBQ2I7WUFFRCxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDckIsS0FBSyxHQUFHLElBQUksRUFBRSxFQUFFO2dCQUNmLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUN4QixTQUFTO2lCQUNUO2dCQUVELElBQUksQ0FBQyxNQUFNLENBQ1YsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUNQLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FDUCxFQUFFO29CQUNGLE9BQU8sS0FBSyxDQUFDO2lCQUNiO2dCQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDbkI7WUFFRCxLQUFLLEdBQUcsSUFBSSxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDbkUsT0FBTyxLQUFLLENBQUM7aUJBQ2I7YUFDRDtZQUVELE9BQU8sSUFBSSxDQUFDO1NBQ1o7S0FDRDtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsU0FBUztJQUNqQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELDJDQUEyQztBQUMzQyxTQUFTLGFBQWEsQ0FDckIsQ0FBQyxFQUNELENBQUM7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBRSxRQUFRO0lBQ3ZDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVNLFNBQVMsSUFBSSxDQUNuQixNQUFNLEVBQ04sV0FBWSxFQUNaLFFBQVM7SUFFVCxJQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDdkIsSUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFFNUQsSUFBSSxXQUFXLEVBQUU7UUFDaEIsSUFBSSxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztTQUN0RTtRQUVELCtCQUErQjtRQUMvQixJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN6QixXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUN2QjthQUFNO1lBQ04sS0FBSyxJQUFNLEdBQUcsSUFBSSxXQUFXLEVBQUU7Z0JBQzlCLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3hCO1NBQ0Q7UUFFRCxhQUFhO1FBQ2IsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixhQUFhO1FBQ2IsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1QixPQUFPLFdBQVcsQ0FDakIsTUFBTSxFQUNOLFdBQVcsRUFDWCxRQUFRLENBQ1IsQ0FBQztLQUNGO0lBRUQsT0FBTyxXQUFXLENBQ2pCLE1BQU0sRUFDTixRQUFRLENBQ1IsQ0FBQztJQUVGLFNBQVMsV0FBVyxDQUNuQixPQUFPLEVBQ1AsWUFBWSxFQUNaLFNBQVM7UUFFVCxTQUFTLEVBQUUsQ0FBQztRQUVaLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtZQUNsQixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQzVCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFDVixTQUFTLENBQ1QsQ0FBQyxDQUFDO2FBQ0g7U0FDRDthQUFNLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLGdHQUFnRztZQUNoRyxLQUFLLElBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRTtnQkFDMUIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUNaLFNBQVMsQ0FDVCxDQUFDO2FBQ0Y7U0FDRDthQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUU7WUFDbkUsK0NBQStDO1lBQy9DLEtBQUssSUFBTSxHQUFHLElBQUksT0FBTyxFQUFFO2dCQUMxQixJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2hDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFDWixTQUFTLENBQ1QsQ0FBQztpQkFDRjthQUNEO1NBQ0Q7YUFBTTtZQUNOLDhEQUE4RDtZQUM5RCxLQUFLLElBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRTtnQkFDMUIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3ZDLE9BQU8sRUFDUCxHQUFHLENBQ0gsRUFBRTtvQkFDRixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQ1osU0FBUyxDQUNULENBQUM7aUJBQ0Y7YUFDRDtTQUNEO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDckIsQ0FBQztJQUVELFNBQVMsV0FBVyxDQUNuQixPQUFPLEVBQ1AsU0FBYTtRQUFiLHlDQUFhO1FBRWIsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxPQUFPLENBQUM7U0FDZjtRQUVELHdCQUF3QjtRQUN4QixhQUFhO1FBQ2IsSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUzQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNqQixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QjtRQUVELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztTQUNwRjtRQUVELElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFckMsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQy9CLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDckYsWUFBWSxHQUFHLElBQUksQ0FBQztTQUNwQjtRQUVELGFBQWE7UUFDYixXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLGFBQWE7UUFDYixTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTdCLE9BQU8sWUFBWTtZQUNsQixDQUFDLENBQUMsV0FBVyxDQUNaLE9BQU8sRUFDUCxZQUFZLEVBQ1osU0FBUyxDQUNUO1lBQ0QsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNqQixDQUFDO0lBRUQsU0FBUyxRQUFRLENBQUUsT0FBTztRQUN6QixRQUFRLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0IsS0FBSyxvQkFBb0IsQ0FBQztZQUMxQixLQUFLLHFCQUFxQixDQUFDO1lBQzNCLEtBQUsscUJBQXFCLENBQUM7WUFDM0IsS0FBSyx1QkFBdUIsQ0FBQztZQUM3QixLQUFLLHVCQUF1QixDQUFDO1lBQzdCLEtBQUsscUJBQXFCLENBQUM7WUFDM0IsS0FBSyw0QkFBNEIsQ0FBQztZQUNsQyxLQUFLLHNCQUFzQixDQUFDO1lBQzVCLEtBQUssc0JBQXNCO2dCQUMxQixPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FDN0IsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDM0IsT0FBTyxDQUFDLFVBQVUsRUFDbEIsT0FBTyxDQUFDLE1BQU0sQ0FDZCxDQUFDO1lBRUgsS0FBSyxzQkFBc0I7Z0JBQzFCLGdCQUFnQjtnQkFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ25CLHFFQUFxRTtvQkFDckUsNkJBQTZCO29CQUM3QixJQUFNLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ25ELElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNwRCxtQkFBbUI7b0JBQ25CLE9BQU8sTUFBTSxDQUFDO2lCQUNkO2dCQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV6QixLQUFLLGtCQUFrQixDQUFDO1lBQ3hCLEtBQUssaUJBQWlCLENBQUM7WUFDdkIsS0FBSyxpQkFBaUIsQ0FBQztZQUN2QixLQUFLLGVBQWU7Z0JBQ25CLE9BQU8sSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRW5ELEtBQUssaUJBQWlCO2dCQUNyQixJQUFNLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FDcEIsT0FBTyxDQUFDLE9BQU8sRUFDZixPQUFPLENBQUMsUUFBUSxFQUFFO3FCQUNoQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BCLENBQUM7Z0JBRUYsRUFBRSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUVqQyxPQUFPLEVBQUUsQ0FBQztZQUVYLEtBQUssZUFBZTtnQkFDbkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQzdCLENBQUMsT0FBTyxDQUFDLEVBQ1QsRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBQyxDQUNwQixDQUFDO1NBQ0g7UUFFRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbEMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9CO0lBQ0YsQ0FBQztBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7QUM1a0IrQztBQUtoRDtJQUtDLDBCQUFhLE1BQWlDO1FBSnZDLFlBQU8sR0FBc0IsSUFBSSxDQUFDO1FBQ2xDLFdBQU0sR0FBb0IsSUFBSSxDQUFDO1FBQy9CLG9CQUFlLEdBQVEsRUFBRSxDQUFDLENBQUMsT0FBTztRQUd4Qyw4Q0FBa0IsQ0FDakIsSUFBSSxFQUNKLE1BQU0sQ0FDTixDQUFDO0lBQ0gsQ0FBQztJQUNGLHVCQUFDO0FBQUQsQ0FBQzs7OztBQ1pELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVsQjtJQUtDLG1CQUNTLE9BQXlCLEVBQzFCLFFBQXNCLEVBQ3RCLE1BQWMsRUFDZCxPQUFnQztRQUgvQixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUMxQixhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQVBqQyxPQUFFLEdBQVcsRUFBRSxTQUFTLENBQUM7UUFDekIsaUJBQVksR0FBWSxLQUFLLENBQUM7SUFRckMsQ0FBQztJQUVNLCtCQUFXLEdBQWxCO1FBQ0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekIsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRU0sMkJBQU8sR0FBZDtRQUNDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU0sOEJBQVUsR0FBakI7UUFDQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3RCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFlBQVksQ0FBQztZQUNsQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFVBQVU7Z0JBQ2QsT0FBTyxJQUFJLENBQUM7WUFDYjtnQkFDQyxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0YsQ0FBQztJQUVNLDBCQUFNLEdBQWI7UUFDQyxPQUFPO1lBQ04sRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3JCLENBQUM7SUFDSCxDQUFDO0lBQ0YsZ0JBQUM7QUFBRCxDQUFDOzs7O0FDckR5RDtBQUsxRDtJQU1DLHNCQUNvQixPQUE0QixFQUMvQixLQUE4QixFQUMzQixNQUFlLEVBQ2YsV0FBNkI7UUFIN0IsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDL0IsVUFBSyxHQUFMLEtBQUssQ0FBeUI7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUVoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUMxRSxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFcEUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxtQ0FBbUM7SUFDNUIsa0NBQVcsR0FBbEI7SUFFQSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZ0NBQVMsR0FBaEIsVUFDQyxNQUE4QjtRQUQvQixpQkE2QkM7UUExQkEsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUU3QixLQUFLLElBQU0sUUFBUSxJQUFJLE1BQU0sRUFBRTtZQUM5QixJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFakMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN6QixPQUFPLENBQUMsSUFBSSxDQUNYLGdDQUFnQyxFQUNoQyxRQUFRLENBQ1IsQ0FBQzthQUNGO1NBQ0Q7UUFFRCxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFM0QsWUFBWSxDQUFDLGNBQWMsQ0FDMUIsSUFBSSxDQUFDLEtBQUssRUFDVixNQUFNLENBQ04sQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDckIsaUJBQWlCLENBQUMsWUFBWSxDQUFDO2FBQy9CLElBQUksQ0FDSixjQUFNLFlBQUksRUFBSixDQUFJLEVBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVNLGlDQUFVLEdBQWpCLFVBQW1CLFdBQXdDO1FBQXhDLDhDQUF3QztRQUMxRCxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTdCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDbkMsSUFBSSxDQUFDLE1BQU0sRUFDWCxXQUFXLEVBQ1gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3RCLENBQUM7UUFFRixPQUFPLFdBQVcsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGdDQUFTLEdBQWhCLFVBQ0MsV0FBcUI7UUFFckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FDaEMsSUFBSSxDQUFDLEtBQUssRUFDVixXQUFXLEVBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FDWCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG1DQUFZLEdBQW5CLFVBQ0MsUUFBZ0M7UUFEakMsaUJBMEJDOztRQXZCQSxJQUFNLGlCQUFpQixTQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLDBDQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEgsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7WUFDcEMsT0FBTztTQUNQO1FBRUQsS0FBdUIsVUFBaUIsRUFBakIsdUNBQWlCLEVBQWpCLCtCQUFpQixFQUFqQixJQUFpQixFQUFFO1lBQXJDLElBQU0sUUFBUTtZQUNsQixJQUFJO2dCQUNILFFBQVEsQ0FDUCxJQUFJLENBQUMsS0FBSyxFQUNWLGtCQUFRLElBQUksWUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUNsRCxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQy9ELEtBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ3JCLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FDbEIsRUFKVyxDQUlYLEVBQ0QsSUFBSSxDQUFDLE1BQU0sRUFDWCxLQUFLLEVBQ0wsUUFBUSxDQUNSLENBQUM7YUFDRjtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckM7U0FDRDtJQUNGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSSx1Q0FBZ0IsR0FBdkIsVUFDQyxRQUFzQyxFQUN0QyxRQUFnQztRQUVoQyxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7U0FDbkU7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FDN0MsTUFBTSxDQUFDLElBQUksRUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUNyQixRQUFRLENBQUMsUUFBUSxDQUFDLENBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRU0saUNBQVUsR0FBakI7UUFDQyxPQUFPLElBQUk7YUFDVCxXQUFXO2FBQ1gsV0FBVzthQUNYLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLCtDQUF3QixHQUEvQixVQUNDLFVBQWU7UUFFZixxQ0FBVSxDQUNULElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQ3JDO1lBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtTQUNqQixFQUNEO1lBQ0MsRUFBRTtZQUNGLFVBQVU7U0FDVixDQUNELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksNEJBQUssR0FBWjtRQUNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwQixDQUFDO0lBRU0sOEJBQU8sR0FBZDtRQUNDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sNkJBQU0sR0FBYjtRQUNDLElBQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUUvQixLQUFLLElBQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDcEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU87WUFDTixPQUFPLEVBQUUsU0FBUztZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxzQ0FBZSxHQUF0QixVQUE2QyxVQUE2QjtRQUN6RSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDbEQsSUFBSSxDQUFDLEtBQUssRUFDVixVQUFVLENBQ1YsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLHVDQUFnQixHQUF2QixVQUNDLFVBQW9CO1FBRXBCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQ25ELElBQUksQ0FBQyxLQUFLLEVBQ1YsVUFBVSxDQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0YsbUJBQUM7QUFBRCxDQUFDOzs7O0FDOU8rQztBQUtoRDtJQVVDLGdDQUFhLE1BQXVDO1FBVHBELFlBQU8sR0FBc0IsRUFBRSxDQUFDO1FBQ2hDLFVBQUssR0FBb0IsSUFBSSxDQUFDO1FBQzlCLGdCQUFXLEdBQVEsRUFBRSxDQUFDLENBQUMsT0FBTztRQUM5QixpQkFBWSxHQUFzQixFQUFFLENBQUM7UUFDckMsV0FBTSxHQUFvQixJQUFJLENBQUM7UUFDL0IsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsVUFBSyxHQUEyQixJQUFJLENBQUM7UUFDckMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFHOUIsOENBQWtCLENBQ2pCLElBQUksRUFDSixNQUFNLENBQ04sQ0FBQztJQUNILENBQUM7SUFDRiw2QkFBQztBQUFELENBQUM7Ozs7Ozs7QUNyQitDO0FBQ2pCO0FBd0IvQjtJQWdCQyxtQ0FBYSxNQUF3RDtRQWZyRSw4QkFBeUIsR0FBWSxLQUFLLENBQUM7UUFFM0M7OztXQUdHO1FBQ0gsbUJBQWMsR0FBMkIsb0JBQUksQ0FBQztRQUM5QyxVQUFLLEdBQWtELG9CQUFJLENBQUM7UUFDNUQsYUFBUSxHQUE2QyxvQkFBSSxDQUFDO1FBQzFELGFBQVEsR0FBd0Isb0JBQUksQ0FBQztRQUNyQyxpQkFBWSxHQUFvRCxvQkFBSSxDQUFDO1FBQ3JFLG9CQUFlLEdBQW9ELG9CQUFJLENBQUM7UUFDeEUsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLFdBQU0sR0FBUSxJQUFJLENBQUM7UUFHbEIsOENBQWtCLENBQ2pCLElBQUksRUFDSixNQUFNLENBQ04sQ0FBQztJQUNILENBQUM7SUFDRixnQ0FBQztBQUFELENBQUM7Ozs7QUNoQ0QsSUFBSSx5QkFBUyxHQUFHLENBQUMsQ0FBQztBQUVsQjtJQVNDLGtFQUFrRTtJQUVsRSx5QkFDUyxzQkFBOEMsRUFDOUMsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3ZCLFFBQXNCLEVBQ3RCLE9BQStCO1FBSjlCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3ZCLGFBQVEsR0FBUixRQUFRLENBQWM7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFkaEMsT0FBRSxHQUFXLHlCQUFTLEVBQUUsQ0FBQztRQUN6QixXQUFNLEdBQW9CLElBQUksQ0FBQztRQUcvQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQVlwQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FDakQsUUFBUSxFQUNSLE9BQU8sQ0FBQyxPQUFPLENBQ2YsQ0FBQztJQUNILENBQUM7SUFFTSxpQ0FBTyxHQUFkO1FBQ0MsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUUzQixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSxxQ0FBVyxHQUFsQixVQUNDLFFBQWtCLEVBQ2xCLE1BQWM7UUFFZCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTNCLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNwQixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsd0JBQXdCO1FBQ3hCLHlDQUF5QztRQUN6QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO0lBQ2hFLENBQUM7SUFFTSxxQ0FBVyxHQUFsQixVQUFvQixRQUF3QjtRQUMzQyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTdCLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbEI7UUFFRCxPQUFPLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFcEQsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLHFDQUFXLEdBQWxCO1FBQ0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVNLHVDQUFhLEdBQXBCLFVBQXNCLGVBQThDO1FBQ25FLElBQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFELElBQUksZUFBZSxLQUFLLElBQUksRUFBRTtZQUM3QixPQUFPO1NBQ1A7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDdEMsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzdDLENBQUM7SUFFTSw4Q0FBb0IsR0FBM0IsVUFBNkIsY0FBaUM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUM3QyxDQUFDO0lBRU0sK0NBQXFCLEdBQTVCLFVBQ0MsYUFBa0M7UUFFbEMsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEMsSUFBTSxNQUFNLEdBQW1ELEVBQUUsQ0FBQztRQUVsRSxLQUFxQixVQUFXLEVBQVgsMkJBQVcsRUFBWCx5QkFBVyxFQUFYLElBQVcsRUFBRTtZQUE3QixJQUFNLE1BQU07WUFDaEIsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQzNELE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQzNCO1NBQ0Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUEwRUYsc0JBQUM7QUFBRCxDQUFDOzs7O0FDNUx3QztBQWtCekM7SUFZQyw0QkFDVyxPQUFrQyxFQUNyQyxLQUFvQyxFQUNwQyxPQUFnRCxFQUNoRCxXQUE2QjtRQUpyQyxpQkF3Q0M7UUF2Q1UsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDckMsVUFBSyxHQUFMLEtBQUssQ0FBK0I7UUFDcEMsWUFBTyxHQUFQLE9BQU8sQ0FBeUM7UUFDaEQsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBWjNCLGNBQVMsR0FBc0QsRUFBRSxDQUFDO1FBRXBFLHdCQUFtQixHQUV2QixFQUFFLENBQUM7UUFVTixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXRDLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQ2YsU0FBa0MsRUFDbEMsWUFBa0MsRUFDbEMsTUFBOEIsRUFDOUIseUJBQWtDLEVBQ2xDLFFBQWdDO1lBRWhDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hCLEtBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ25DO1lBRUQsS0FBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQ3BCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLHlCQUF5QixFQUN6QixRQUFRLENBQ1IsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsQ0FDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2IsRUFDRCxJQUFJLENBQ0osQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsbUNBQW1DO0lBQzVCLHdDQUFXLEdBQWxCO0lBRUEsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHNDQUFTLEdBQWhCLFVBQ0MsV0FBMkMsRUFDM0MsbUJBQXFEO1FBRXJELE9BQU8sSUFBSTthQUNULFdBQVc7YUFDWCxpQkFBaUI7YUFDakIsU0FBUyxDQUNULElBQUksQ0FBQyxLQUFLLEVBQ1YsbUJBQW1CLENBQUMsS0FBSyxFQUN6QixXQUFXLENBQ1gsQ0FBQztJQUNKLENBQUM7SUFFTSx3Q0FBVyxHQUFsQixVQUNDLE9BQWlCO1FBRWpCLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEUsSUFBTSxrQkFBa0IsR0FBZ0IsRUFBRSxDQUFDO1FBRTNDLEtBQTJCLFVBQVUsRUFBVixTQUFJLENBQUMsS0FBSyxFQUFWLGNBQVUsRUFBVixJQUFVLEVBQUU7WUFBbEMsSUFBTSxZQUFZO1lBQ3RCLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFFckMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDN0MsU0FBUzthQUNUO1lBRUQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLHVDQUFVLEdBQWpCLFVBQ0MsTUFBYztRQUVkLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FDdEIsQ0FBQyxNQUFNLENBQUMsQ0FDUixDQUFDO0lBQ0gsQ0FBQztJQUVNLHFDQUFRLEdBQWYsVUFDQyxXQUEwQztRQUQzQyxpQkEwQkM7UUF2QkEsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQy9CLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQ3ZFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDbkIsQ0FBQztZQUVGLEtBQXFCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO2dCQUE3QixJQUFNLE1BQU07Z0JBQ2hCLEtBQUssSUFBTSxRQUFRLElBQUksWUFBWSxFQUFFO29CQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUMxQzthQUNEO1NBQ0Q7UUFFRCxPQUFPLFlBQVk7YUFDakIsZUFBZSxDQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUNuQixXQUFXLENBQ1g7YUFDQSxJQUFJLENBQ0osY0FBTSxZQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxFQUFoRCxDQUFnRCxDQUN0RCxDQUFDO0lBQ0osQ0FBQztJQUVNLG9DQUFPLEdBQWQsVUFDQyxNQUE4QjtRQUU5QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQ25CLENBQUMsTUFBTSxDQUFDLENBQ1IsQ0FBQztJQUNILENBQUM7SUFFTSx1Q0FBVSxHQUFqQjtRQUNDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ3BCLHNCQUFZLElBQUksbUJBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUF6QixDQUF5QixDQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELDZFQUE2RTtJQUN0RSx3Q0FBVyxHQUFsQixVQUFvQixNQUFjO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sNkNBQWdCLEdBQXZCLFVBQ0MsV0FBMkMsRUFDM0MsYUFBOEI7UUFBOUIscURBQThCO1FBRTlCLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxFQUFFLENBQUM7U0FDVjtRQUVELElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ3RDLHNCQUFZLElBQUksbUJBQVksQ0FBQyxLQUFLLEVBQWxCLENBQWtCLENBQ2xDLENBQUM7UUFFRixxRkFBcUY7UUFDckYsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQy9CLG1CQUFTLElBQUksdUJBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUExQyxDQUEwQyxDQUN2RCxDQUFDO1FBRUYsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FDekQsV0FBVyxDQUNYLENBQUM7UUFFRixLQUEyQixVQUFhLEVBQWIsK0JBQWEsRUFBYiwyQkFBYSxFQUFiLElBQWEsRUFBRTtZQUFyQyxJQUFNLFlBQVk7WUFDdEIsSUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFFekMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO2FBQ3JGO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUM7WUFFdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsQ0FDakcsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQzNCLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUN6QixJQUFJLENBQUMsUUFBUSxDQUNiLENBQUM7U0FDRjtRQUVELElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRTtZQUM3RCxJQUFJLENBQUMsU0FBUyxDQUNiLGFBQWEsRUFDYixhQUFhLENBQ2IsQ0FBQztTQUNGO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnREFBbUIsR0FBMUIsVUFBNEIsV0FBMkM7UUFBdkUsaUJBdUJDO1FBdEJBLElBQU0sTUFBTSxHQUFzQyxFQUFFLENBQUM7UUFFckQsc0NBQVcsQ0FDVixJQUFJLENBQUMsS0FBSyxFQUNWLHNCQUFZO1lBQ1gsS0FBd0IsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7Z0JBQWhDLElBQU0sU0FBUztnQkFDbkIsSUFBSSxZQUFZLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtvQkFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDMUIsT0FBTyxLQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFeEMsS0FBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUM3QyxPQUFPLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRWxELE9BQU8sS0FBSyxDQUFDO2lCQUNiO2FBQ0Q7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNiLENBQUMsQ0FDRCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU0sc0NBQVMsR0FBaEIsVUFDQyxhQUFnRCxFQUNoRCxhQUE4QjtRQUE5QixxREFBOEI7UUFFOUIsSUFBSTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUNqQixhQUFhLEVBQ2IsSUFBSSxFQUNKLGFBQWEsQ0FDYixDQUFDO1NBQ0Y7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7SUFDRixDQUFDO0lBRU0seUNBQVksR0FBbkIsVUFBcUIsYUFBZ0Q7UUFDcEUsSUFBSTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUNwQixhQUFhLEVBQ2IsSUFBSSxDQUNKLENBQUM7U0FDRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQztJQUNGLENBQUM7SUFFTSxvQ0FBTyxHQUFkLFVBQWdCLFFBQTREO1FBQzNFLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFakMsS0FBMkIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7WUFBckMsSUFBTSxZQUFZO1lBQ3RCLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN2QjtJQUNGLENBQUM7SUFFTSxtQ0FBTSxHQUFiLFVBQWUsUUFBK0Q7UUFDN0UsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUFNLE1BQU0sR0FBc0MsRUFBRSxDQUFDO1FBRXJELEtBQTJCLFVBQWEsRUFBYiwrQkFBYSxFQUFiLDJCQUFhLEVBQWIsSUFBYSxFQUFFO1lBQXJDLElBQU0sWUFBWTtZQUN0QixJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMxQjtTQUNEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU0sa0NBQUssR0FBWixVQUFjLFFBQStEO1FBQzVFLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFakMsS0FBMkIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7WUFBckMsSUFBTSxZQUFZO1lBQ3RCLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMzQixPQUFPLFlBQVksQ0FBQzthQUNwQjtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRU0saUNBQUksR0FBWCxVQUFhLFFBQStEO1FBQzNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVNLG9DQUFPLEdBQWQsVUFBZ0IsUUFBZ0Y7UUFDL0YsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxJQUFNLE1BQU0sR0FBdUQsRUFBRSxDQUFDO1FBRXRFLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUM3RSxNQUFNLElBQUksS0FBSyxDQUFDLDRFQUEwRSxRQUFRLE9BQUksQ0FBQyxDQUFDO2FBQ3hHO1lBRUQsS0FBMkIsVUFBYyxFQUFkLGlDQUFjLEVBQWQsNEJBQWMsRUFBZCxJQUFjLEVBQUU7Z0JBQXRDLElBQU0sWUFBWTtnQkFDdEIsSUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFNUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFO29CQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNuQjtnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Q7UUFFRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUNuQyxLQUEyQixVQUFjLEVBQWQsaUNBQWMsRUFBZCw0QkFBYyxFQUFkLElBQWMsRUFBRTtnQkFBdEMsSUFBTSxZQUFZO2dCQUN0QixJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRXJDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtvQkFDbkIsU0FBUztpQkFDVDtnQkFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ25CO2dCQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDakM7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVNLGdDQUFHLEdBQVYsVUFBZSxRQUFvRTtRQUNsRixJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFakMsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUM7U0FDRDtRQUVELElBQUksT0FBTyxRQUFRLEtBQUssVUFBVSxFQUFFO1lBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkM7U0FDRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVNLG1DQUFNLEdBQWIsVUFDQyxRQUdNLEVBQ04sS0FBUTtRQUVSLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFakMsS0FBMkIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7WUFBckMsSUFBTSxZQUFZO1lBQ3RCLEtBQUssR0FBRyxRQUFRLENBQ2YsWUFBWSxFQUNaLEtBQUssQ0FDTCxDQUFDO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQ0FBTSxHQUFiLFVBQ0MsYUFBNEI7UUFFNUIsT0FBTyxJQUFJO2FBQ1QsV0FBVzthQUNYLGlCQUFpQjthQUNqQixxQkFBcUIsQ0FDckIsSUFBSSxDQUFDLEtBQUssRUFDVixhQUFhLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQ0FBYSxHQUFwQjtRQUNDLEtBQUssSUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0YseUJBQUM7QUFBRCxDQUFDOzs7O0FDcGFEO0lBSUMsa0JBQ0MsT0FBd0IsRUFDakIsUUFBc0IsRUFDdEIsUUFBcUIsRUFDNUIsd0JBQTZDLEVBQzdDLHlCQUFvRDtRQUg3QyxhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQWE7UUFJNUIsSUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFdEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUM3RCxlQUFlLEVBQ2YseUJBQXlCLENBQ3pCLENBQUMsTUFBTSxDQUFDO1FBRVQseUpBQXlKO1FBQ3pKLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUM1RCxRQUFRLEVBQ1IsZUFBZSxDQUNmLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ3pCLE1BQU0sQ0FDTix3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFDbEMsS0FBSyxFQUNMLHlCQUF5QixDQUN6QjthQUNBLE1BQU0sQ0FBQztJQUNWLENBQUM7SUFFTSw0QkFBUyxHQUFoQjtRQUNDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFL0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDL0IsUUFBUSxFQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMvQixDQUFDO0lBQ0osQ0FBQztJQUNGLGVBQUM7QUFBRCxDQUFDOzs7O0FDN0NEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FBbUM7QUFDQTtBQUNQO0FBQ0c7QUFDVTtBQUNHO0FBQ1Y7QUFDRztBQUNWOzs7Ozs7OztBQ1IzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFPLElBQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUU1QixJQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUM3QixJQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUVoQyxJQUFNLFVBQVUsR0FBVyxJQUFJLENBQUM7QUFDaEMsSUFBTSxnQkFBZ0IsR0FBVyxJQUFJLENBQUM7QUFFdEMsSUFBTSxXQUFXLEdBQVcsTUFBTSxDQUFDO0FBQ25DLElBQU0saUJBQWlCLEdBQVcsTUFBTSxDQUFDOzs7Ozs7OztBQ1RoRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQixzQ0FBc0MsaUJBQWlCLEVBQUU7QUFDbkYseUJBQXlCLHVEQUF1RDtBQUNoRjtBQUNBOztBQUVPO0FBQ1A7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7O0FBRU87QUFDUDtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsY0FBYztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7O0FBRU87QUFDUCxtQ0FBbUMsb0NBQW9DO0FBQ3ZFOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLGlFQUFpRSx1QkFBdUIsRUFBRSw0QkFBNEI7QUFDcko7QUFDQSxLQUFLO0FBQ0w7O0FBRU87QUFDUCxhQUFhLDZCQUE2QiwwQkFBMEIsYUFBYSxFQUFFLHFCQUFxQjtBQUN4RyxnQkFBZ0IscURBQXFELG9FQUFvRSxhQUFhLEVBQUU7QUFDeEosc0JBQXNCLHNCQUFzQixxQkFBcUIsR0FBRztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsa0NBQWtDLFNBQVM7QUFDM0Msa0NBQWtDLFdBQVcsVUFBVTtBQUN2RCx5Q0FBeUMsY0FBYztBQUN2RDtBQUNBLDZHQUE2RyxPQUFPLFVBQVU7QUFDOUgsZ0ZBQWdGLGlCQUFpQixPQUFPO0FBQ3hHLHdEQUF3RCxnQkFBZ0IsUUFBUSxPQUFPO0FBQ3ZGLDhDQUE4QyxnQkFBZ0IsZ0JBQWdCLE9BQU87QUFDckY7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLFNBQVMsWUFBWSxhQUFhLE9BQU8sRUFBRSxVQUFVLFdBQVc7QUFDaEUsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixNQUFNLGdCQUFnQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixzQkFBc0I7QUFDdkM7QUFDQTtBQUNBOztBQUVPO0FBQ1AsNEJBQTRCLHNCQUFzQjtBQUNsRDtBQUNBO0FBQ0E7O0FBRU87QUFDUCxpREFBaUQsUUFBUTtBQUN6RCx3Q0FBd0MsUUFBUTtBQUNoRCx3REFBd0QsUUFBUTtBQUNoRTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBLGlCQUFpQixzRkFBc0YsYUFBYSxFQUFFO0FBQ3RILHNCQUFzQixnQ0FBZ0MscUNBQXFDLDBDQUEwQyxFQUFFLEVBQUUsR0FBRztBQUM1SSwyQkFBMkIsTUFBTSxlQUFlLEVBQUUsWUFBWSxvQkFBb0IsRUFBRTtBQUNwRixzQkFBc0Isb0dBQW9HO0FBQzFILDZCQUE2Qix1QkFBdUI7QUFDcEQsNEJBQTRCLHdCQUF3QjtBQUNwRCwyQkFBMkIseURBQXlEO0FBQ3BGOztBQUVPO0FBQ1A7QUFDQSxpQkFBaUIsNENBQTRDLFNBQVMsRUFBRSxxREFBcUQsYUFBYSxFQUFFO0FBQzVJLHlCQUF5Qiw2QkFBNkIsb0JBQW9CLGdEQUFnRCxnQkFBZ0IsRUFBRSxLQUFLO0FBQ2pKOztBQUVPO0FBQ1A7QUFDQTtBQUNBLDJHQUEyRyxzRkFBc0YsYUFBYSxFQUFFO0FBQ2hOLHNCQUFzQiw4QkFBOEIsZ0RBQWdELHVEQUF1RCxFQUFFLEVBQUUsR0FBRztBQUNsSyw0Q0FBNEMsc0NBQXNDLFVBQVUsb0JBQW9CLEVBQUUsRUFBRSxVQUFVO0FBQzlIOztBQUVPO0FBQ1AsZ0NBQWdDLHVDQUF1QyxhQUFhLEVBQUUsRUFBRSxPQUFPLGtCQUFrQjtBQUNqSDtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsNENBQTRDO0FBQzVDOzs7Ozs7O0FDbk1BLGdEOzs7Ozs7Ozs7Ozs7QUNBZ0U7QUFFaEU7SUFDQyxxQ0FBcUIsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7SUFFL0MsQ0FBQztJQUVELCtDQUFTLEdBQVQsVUFBVyxRQUFhO1FBQ3ZCLE9BQU8sSUFBSSx1Q0FBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRixrQ0FBQztBQUFELENBQUM7Ozs7QUNWK0M7QUFHaEQ7SUFFQztJQUNBLENBQUM7SUFFRCw2Q0FBUyxHQUFULFVBQ0MsV0FBNkI7UUFFN0IsT0FBTyxJQUFJLHFDQUFrQixDQUM1QixXQUFXLENBQ1gsQ0FBQztJQUNILENBQUM7SUFDRixnQ0FBQztBQUFELENBQUM7Ozs7QUNmNEM7QUFJN0M7SUFFQyxnQ0FDUyxtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtJQUVqRCxDQUFDO0lBRU0sMENBQVMsR0FBaEIsVUFDQyxXQUEwQjtRQUUxQixPQUFPLElBQUksa0NBQWUsQ0FDekIsSUFBSSxDQUFDLG1CQUFtQixFQUN4QixXQUFXLENBQ1gsQ0FBQztJQUNILENBQUM7SUFFRiw2QkFBQztBQUFELENBQUM7Ozs7Ozs7QUNuQnFHO0FBSXRHO0lBRUMsZ0NBQ1Msc0JBQThDLEVBQzlDLGdCQUFrQyxFQUNsQyxVQUFzQjtRQUZ0QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUUvQixDQUFDO0lBRUQsMENBQVMsR0FBVCxVQUNDLFFBQXNCLEVBQ3RCLE9BQXdDO1FBRXhDLE9BQU8sSUFBSSxpQ0FBZSxDQUN6QixJQUFJLENBQUMsc0JBQXNCLEVBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsSUFBSSxDQUFDLFVBQVUsRUFDZixRQUFRLEVBQ1IsSUFBSSx3Q0FBc0IsQ0FBQyxPQUFPLENBQUMsQ0FDbkMsQ0FBQztJQUNILENBQUM7SUFDRiw2QkFBQztBQUFELENBQUM7Ozs7QUMxQjZFO0FBSzlFO0lBRUMsa0NBQ1MsbUJBQXdDO1FBQXhDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7SUFFakQsQ0FBQztJQUVNLDRDQUFTLEdBQWhCLFVBQ0MsV0FBMkMsRUFDM0Msb0JBQXFIO1FBRXJILE9BQU8sSUFBSSxvQ0FBaUIsQ0FDM0IsSUFBSSxDQUFDLG1CQUFtQixFQUN4QixXQUFXLEVBQ1gsb0JBQW9CLENBQ3BCLENBQUM7SUFDSCxDQUFDO0lBQ0YsK0JBQUM7QUFBRCxDQUFDOzs7O0FDZGtCO0FBSW5CO0lBRUMsbUNBQ1EsWUFBbUMsRUFDbkMsZ0JBQTJDLEVBQzNDLFVBQXNCLEVBQ3RCLGNBQXVDLEVBQ3ZDLG1CQUF3QyxFQUN4QyxnQkFBa0M7UUFMbEMsaUJBQVksR0FBWixZQUFZLENBQXVCO1FBQ25DLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMkI7UUFDM0MsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7UUFDdkMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBRTFDLENBQUM7SUFFTSw2Q0FBUyxHQUFoQixVQUNDLGVBQThDLEVBQzlDLE9BQXlELEVBQ3pELFdBQTZCO1FBRTdCLE9BQU8sSUFBSSxvQ0FBa0IsQ0FDNUIsSUFBSSxFQUNKLGVBQWUsRUFDZixJQUFJLDJDQUF5QixDQUFDLE9BQU8sQ0FBQyxFQUN0QyxXQUFXLENBQ1gsQ0FBQztJQUNILENBQUM7SUFDRixnQ0FBQztBQUFELENBQUM7Ozs7QUNwQzRDO0FBSTdDO0lBQ0MsZ0NBQ1MsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFHN0MsQ0FBQztJQUVELDBDQUFTLEdBQVQsVUFDQyxRQUFzQixFQUN0QixjQUFpQyxFQUNqQyxlQUEwQztRQUUxQyxPQUFPLElBQUksa0NBQWUsQ0FDekIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixRQUFRLEVBQ1IsY0FBYyxFQUNkLGVBQWUsQ0FDZixDQUFDO0lBQ0gsQ0FBQztJQUNGLDZCQUFDO0FBQUQsQ0FBQzs7OztBQ3ZCdUM7QUFHeEM7SUFDQztJQUFnQixDQUFDO0lBRWpCLHFDQUFTLEdBQVQsVUFDQyxTQUF5QixFQUN6QixNQUF1QztRQUV2QyxPQUFPLElBQUksNkJBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGdEQUFvQixHQUFwQixVQUNDLGFBQTRCLEVBQzVCLE1BQThDO1FBQTlDLHNDQUE4QztRQUU5QyxJQUFNLE1BQU0sR0FBb0MsRUFBRSxDQUFDO1FBRW5ELEtBQUssSUFBTSxRQUFRLElBQUksYUFBYSxFQUFFO1lBQ3JDLElBQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQyxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFlLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDbEYsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFlLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFbEcsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzFCLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFckUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN4QjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUNGLHdCQUFDO0FBQUQsQ0FBQzs7OztBQ2hDNEY7QUFXN0Y7SUFDQywwQkFDUyxhQUE0QixFQUM1QixVQUFzQixFQUN0QixpQkFBb0M7UUFGcEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBRTdDLENBQUM7SUFFRCx3Q0FBYSxHQUFiLFVBQ0MsUUFBc0IsRUFDdEIsY0FBaUM7UUFFakMsSUFBTSxTQUFTLEdBQUcsSUFBSSw0QkFBUyxDQUM5QixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksRUFDSixRQUFRLENBQ1IsQ0FBQztRQUVGLFNBQVMsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO1FBQ25DLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxjQUFjLEtBQUssSUFBSSxDQUFDO1FBRXZELE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFFTSxzQ0FBVyxHQUFsQixVQUNDLFNBQW9CLEVBQ3BCLGVBQTBDLEVBQzFDLGFBQTZCLEVBQzdCLGVBQStCO1FBRC9CLG9EQUE2QjtRQUM3Qix3REFBK0I7UUFFL0IsT0FBTyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsc0JBQXNCLENBQzFCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsYUFBYSxDQUNiLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxxQkFBcUIsQ0FDekIsU0FBUyxFQUNULGVBQWUsRUFDZixhQUFhLEVBQ2IsZUFBZSxDQUNmLENBQUM7SUFDSixDQUFDO0lBRU0sb0NBQVMsR0FBaEIsVUFDQyxRQUFzQixFQUN0QixjQUFpQyxFQUNqQyxlQUEwQyxFQUMxQyxhQUF1QixFQUN2QixlQUF5QjtRQUV6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQ3RCLElBQUksQ0FBQyxhQUFhLENBQ2pCLFFBQVEsRUFDUixjQUFjLENBQ2QsRUFDRCxlQUFlLEVBQ2YsYUFBYSxFQUNiLGVBQWUsQ0FDZixDQUFDO0lBQ0gsQ0FBQztJQUVNLGdEQUFxQixHQUE1QixVQUNDLFFBQWtCLEVBQ2xCLGVBQTBDLEVBQzFDLGFBQTZCO1FBQTdCLG9EQUE2QjtRQUU3QixJQUFNLFNBQVMsR0FBRyxJQUFJLDRCQUFTLENBQzlCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxFQUNKLFFBQVEsQ0FDUixDQUFDO1FBRUYsU0FBUyxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUVyQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FDakMsU0FBUyxFQUNULGVBQWUsRUFDZixhQUFhLENBQ2IsQ0FBQztJQUNILENBQUM7SUFFTyxpREFBc0IsR0FBOUIsVUFDQyxTQUFvQixFQUNwQixlQUEwQyxFQUMxQyxhQUFzQjtRQUV0QixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ3BDLElBQU0sYUFBYSxHQUFrQixFQUFFLENBQUM7UUFDeEMsSUFBTSxvQkFBb0IsR0FBeUIsRUFBRSxDQUFDO1FBRXRELFNBQVMsQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDO1FBRXJDLElBQUksQ0FBQyxzQ0FBc0MsQ0FDMUMsUUFBUSxFQUNSLGVBQWUsRUFDZixhQUFhLEVBQ2IsYUFBYSxFQUNiLG9CQUFvQixDQUNwQixDQUFDO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixDQUNyQixTQUFTLEVBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUMxRCxRQUFRLENBQ1IsQ0FBQztRQUVGLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWpGLE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFFTyxtRUFBd0MsR0FBaEQsVUFDQyxhQUE0Qjs7UUFFNUIsSUFBTSxNQUFNLEdBQXVCLEVBQUUsQ0FBQztRQUV0QyxLQUFLLElBQU0sUUFBUSxJQUFJLGFBQWEsRUFBRTtZQUNyQyxJQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdEMsSUFBSSx5Q0FBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbEMsTUFBTSxDQUFDLElBQUk7b0JBQ1YsR0FBQyxRQUFRLElBQUcsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7d0JBQ3hFLENBQUM7YUFDSDtpQkFBTTtnQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RCO1NBQ0Q7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTyxpRUFBc0MsR0FBOUMsVUFDQyxRQUFrQixFQUNsQixlQUEwQyxFQUMxQyxhQUE0QixFQUM1QixhQUFzQixFQUN0QixvQkFBMEM7UUFFMUMsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDNUMsT0FBTztTQUNQO1FBRUQsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRXRDLEtBQUssSUFBTSxRQUFRLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2pELElBQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUzRCxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLFNBQVM7YUFDVDtZQUVELElBQUksYUFBYSxFQUFFO2dCQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FDM0IsUUFBUSxFQUNSLGNBQWMsQ0FDZCxDQUFDO2FBQ0Y7WUFFRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQzFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRztvQkFDekIsU0FBUyxFQUFFLGNBQWM7b0JBQ3pCLFFBQVEsRUFBRSxFQUFFO2lCQUNaLENBQUM7YUFDRjtZQUVELElBQ0MsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FDNUIsY0FBYyxFQUNkLEtBQUssQ0FDTCxFQUNBO2dCQUNELFNBQVM7YUFDVDtZQUVELElBQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFMUQsSUFDQyxRQUFRLEtBQUssU0FBUzttQkFDbkIsQ0FBQyx5Q0FBYSxDQUFDLFFBQVEsQ0FBQyxFQUMxQjtnQkFDRCxTQUFTO2FBQ1Q7WUFFRCxJQUFJLENBQUMsc0NBQXNDLENBQzFDLGNBQWMsQ0FBQyxRQUFRLEVBQ3ZCLGVBQWUsRUFDZixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUNoQyxhQUFhLEVBQ2Isb0JBQW9CLENBQ3BCLENBQUM7U0FDRjtJQUNGLENBQUM7SUFFRCwwR0FBMEc7SUFDbEcsZ0RBQXFCLEdBQTdCLFVBQ0MsU0FBb0IsRUFDcEIsZUFBMEMsRUFDMUMsYUFBc0IsRUFDdEIsZUFBd0I7UUFFeEIsSUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFNLGFBQWEsR0FBa0IsRUFBRSxDQUFDO1FBRXhDLElBQUksQ0FBQyxtQkFBbUIsQ0FDdkIsU0FBUyxDQUFDLE9BQTZCLEVBQUUsZ0RBQWdEO1FBQ3pGLFFBQVEsRUFDUixlQUFlLEVBQ2YsYUFBYSxFQUNiLGFBQWEsQ0FDYixDQUFDO1FBRUYsSUFBSSxlQUFlLEVBQUU7WUFDcEIsSUFBSSxDQUFDLG1CQUFtQixDQUN2QixDQUFDLElBQUksQ0FBQyxFQUNOLFFBQVEsRUFDUixlQUFlLEVBQ2YsYUFBYSxFQUNiLGFBQWEsQ0FDYixDQUFDO1NBQ0Y7UUFFRCxTQUFTLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsaUJBQWlCLENBQ3JCLFNBQVMsRUFDVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLEVBQzFELFFBQVEsQ0FDUixDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVPLDRDQUFpQixHQUF6QixVQUNDLFNBQW9CLEVBQ3BCLGlCQUErQixFQUMvQixRQUFrQjtRQUVsQixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBRXBDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNyQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsS0FBeUIsVUFBaUIsRUFBakIsdUNBQWlCLEVBQWpCLCtCQUFpQixFQUFqQixJQUFpQixFQUFFO1lBQXZDLElBQU0sVUFBVTtZQUNwQixRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDekQsU0FBUyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUV0QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUNyQixTQUFTLEVBQ1QsVUFBVSxDQUFDLFFBQVEsRUFDbkIsVUFBVSxDQUFDLFFBQVEsQ0FDbkIsQ0FBQzthQUNGO1NBQ0Q7SUFDRixDQUFDO0lBRU8sOENBQW1CLEdBQTNCLFVBQ0MsY0FBa0MsRUFDbEMsUUFBa0IsRUFDbEIsZUFBMEMsRUFDMUMsYUFBNEIsRUFDNUIsYUFBc0I7UUFFdEIsS0FBNEIsVUFBYyxFQUFkLGlDQUFjLEVBQWQsNEJBQWMsRUFBZCxJQUFjLEVBQUU7WUFBdkMsSUFBTSxhQUFhO1lBQ2pCLDBEQUE0RSxFQUEzRSxnQkFBWSxFQUFFLHNCQUE2RCxDQUFDO1lBRW5GLElBQUksY0FBYyxVQUFDO1lBRW5CLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDNUMsY0FBYyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyRDtZQUVELElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtnQkFDakMsT0FBTyxDQUFDLElBQUksQ0FDWCxrQ0FBa0MsRUFDbEMsUUFBUSxFQUNSLGNBQWMsRUFDZCxRQUFRLENBQ1IsQ0FBQztnQkFFRixTQUFTO2FBQ1Q7WUFFRCxJQUFJLGFBQWEsRUFBRTtnQkFDbEIsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUM1QyxRQUFRLEVBQ1IsY0FBYyxDQUNkLENBQUM7YUFDRjtZQUVELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDMUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHO29CQUN6QixTQUFTLEVBQUUsY0FBYztvQkFDekIsUUFBUSxFQUFFLEVBQUU7aUJBQ1osQ0FBQzthQUNGO1lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDMUIsU0FBUzthQUNUO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUN2QixRQUFRLEVBQ1IsY0FBYyxDQUFDLFFBQVEsRUFDdkIsZUFBZSxFQUNmLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQ2hDLGFBQWEsQ0FDYixDQUFDO1NBQ0Y7SUFDRixDQUFDO0lBQ0YsdUJBQUM7QUFBRCxDQUFDOzs7O0FDblU4QztBQUcvQztJQUNDO0lBQWdCLENBQUM7SUFFakIsNENBQVMsR0FBVCxVQUEwQyxjQUFpQztRQUMxRSxPQUFPLElBQUksb0NBQWlCLENBQWUsY0FBYyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNGLCtCQUFDO0FBQUQsQ0FBQzs7OztBQ1R1RjtBQUt4RjtJQUVDLDhCQUNTLFlBQTBCLEVBQzFCLFVBQXNCLEVBQ3RCLDZCQUE0RDtRQUY1RCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBK0I7SUFHckUsQ0FBQztJQUVELHdDQUFTLEdBQVQsVUFDQyxXQUE4QixFQUM5QixXQUE2QixFQUM3QixlQUF5QjtRQUV6QixPQUFPLElBQUksZ0NBQWEsQ0FDdkIsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsNkJBQTZCLEVBQ2xDLFdBQVcsRUFDWCxXQUFXLEVBQ1gsZUFBZSxDQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0YsMkJBQUM7QUFBRCxDQUFDOzs7O0FDN0JzQztBQUl2QztJQUVDLDBCQUNTLG1CQUF3QztRQUF4Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO0lBRWpELENBQUM7SUFFTSxvQ0FBUyxHQUFoQixVQUNDLFdBQTBCO1FBRTFCLE9BQU8sSUFBSSw0QkFBUyxDQUNuQixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLFdBQVcsQ0FDWCxDQUFDO0lBQ0gsQ0FBQztJQUVGLHVCQUFDO0FBQUQsQ0FBQzs7OztBQ2pCcUM7QUFHdEM7SUFFQywwQkFDUSxZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsZ0JBQTJDLEVBQzNDLGdCQUFrQyxFQUNsQyxVQUFzQixFQUN0QixjQUF1QztRQUx2QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMkI7UUFDM0MscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtJQUUvQyxDQUFDO0lBRU0sb0NBQVMsR0FBaEIsVUFDQyxNQUFjLEVBQ2QsVUFBbUM7UUFFbkMsT0FBTyxJQUFJLDJCQUFTLENBQ25CLElBQUksRUFDSixVQUFVLENBQUMsUUFBUSxFQUNuQixNQUFNLEVBQ04sVUFBVSxDQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0YsdUJBQUM7QUFBRCxDQUFDOzs7O0FDMUJtRDtBQUdwRDtJQUVDLDZCQUNRLFlBQTBCLEVBQzFCLFlBQW1DLEVBQ25DLGNBQXVDLEVBQ3ZDLGdCQUEyQyxFQUMzQyxVQUFzQjtRQUp0QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMkI7UUFDM0MsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUU5QixDQUFDO0lBRU0sdUNBQVMsR0FBaEIsVUFDQyxTQUFrQyxFQUNsQyxXQUE2QixFQUM3QixLQUFzQjtRQUF0QixxQ0FBc0I7UUFFdEIsT0FBTyxJQUFJLDhCQUFZLENBQ3RCLElBQUksRUFDSixTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsQ0FDWCxDQUFDO0lBQ0gsQ0FBQztJQUNGLDBCQUFDO0FBQUQsQ0FBQzs7OztBQzdCdUY7QUFJeEY7SUFJQyxpQ0FDUyxZQUE0QyxFQUM1QyxJQUFZO1FBRFosaUJBQVksR0FBWixZQUFZLENBQWdDO1FBQzVDLFNBQUksR0FBSixJQUFJLENBQVE7UUFFcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLDhCQUFXLENBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxJQUFJLENBQ1QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLHlDQUFPLEdBQWQsVUFBZ0IsRUFBVTtRQUN6QixJQUFNLFNBQVMsR0FBRyxVQUFDLFFBQTRCO1lBQzlDLEtBQTBCLFVBQVEsRUFBUixxQkFBUSxFQUFSLHNCQUFRLEVBQVIsSUFBUSxFQUFFO2dCQUEvQixJQUFNLFdBQVc7Z0JBQ3JCLElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQzFCLE9BQU8sV0FBVyxDQUFDO2lCQUNuQjtnQkFFRCxJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUVwRCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7b0JBQzlCLE9BQU8sV0FBVyxDQUFDO2lCQUNuQjthQUNEO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbEIsQ0FBQyxDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sMkNBQVMsR0FBaEIsVUFDQyxFQUFXLEVBQ1gsZ0JBQThDO1FBRTlDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQ2xDLEVBQUUsRUFDRixnQkFBZ0IsQ0FDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO0lBQ04sZ0RBQWMsR0FBckI7UUFDQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDekIsQ0FBQztJQUNGLDhCQUFDO0FBQUQsQ0FBQzs7OztBQ3ZEcUQ7QUFHdEQ7SUFBQTtJQU9BLENBQUM7SUFMQSxtREFBUyxHQUFULFVBQ0MsV0FBNkI7UUFFN0IsT0FBTyxJQUFJLDJDQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRixzQ0FBQztBQUFELENBQUM7Ozs7QUNWdUQ7QUFHeEQ7SUFDQyw2QkFDUyxZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUduQyxDQUFDO0lBRUQsdUNBQVMsR0FBVCxVQUFXLFFBQWtCLEVBQUUsTUFBZ0IsRUFBRSxNQUF1QjtRQUN2RSxPQUFPLElBQUksK0JBQVksQ0FDdEIsSUFBSSxDQUFDLFlBQVksRUFDakIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLENBQ04sQ0FBQztJQUNILENBQUM7SUFDRiwwQkFBQztBQUFELENBQUM7Ozs7QUNsQndDO0FBR3pDO0lBQ0M7SUFDQSxDQUFDO0lBRUQsc0NBQVMsR0FBVCxVQUFXLEtBQWUsRUFBRSxVQUFnQjtRQUMzQyxPQUFPLElBQUksOEJBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNGLHlCQUFDO0FBQUQsQ0FBQzs7OztBQ1YrRDtBQUVoRTtJQUNDLHVDQUNTLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFFL0IsQ0FBQztJQUVELGlEQUFTLEdBQVQ7UUFDQyxPQUFPLElBQUkseUNBQXNCLENBQ2hDLElBQUksQ0FBQyxVQUFVLENBQ2YsQ0FBQztJQUNILENBQUM7SUFDRixvQ0FBQztBQUFELENBQUM7Ozs7QUNYb0M7QUFHckM7SUFDQyx5QkFDUSxnQkFBa0MsRUFDbEMsVUFBc0I7UUFEdEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO0lBRTlCLENBQUM7SUFFRCxtQ0FBUyxHQUFULFVBQ0MsUUFBc0IsRUFDdEIsUUFBcUIsRUFDckIsd0JBQTZDLEVBQzdDLHlCQUFvRDtRQUVwRCxPQUFPLElBQUksMEJBQVEsQ0FDbEIsSUFBSSxFQUNKLFFBQVEsRUFDUixRQUFRLEVBQ1Isd0JBQXdCLEVBQ3hCLHlCQUF5QixDQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUNGLHNCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7OztBQzFCRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4QztBQUNGO0FBQ0g7QUFDQTtBQUNFO0FBQ0M7QUFDSDtBQUNMO0FBQ0Q7QUFDUTtBQUNKO0FBQ0o7QUFDQTtBQUNHO0FBQ0k7QUFDUTtBQUNaO0FBQ0Q7QUFDVztBQUNkO0FBQ0k7QUFDSTs7Ozs7Ozs7QUNyQjFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFzQztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDT0k7QUFFdkM7SUFZQyx1QkFDUyxVQUFzQixFQUN0QixjQUF1QyxFQUN2QyxhQUE0QixFQUM1QixlQUFnQyxFQUNoQyxZQUFtQyxFQUNuQyw2QkFBNEQsRUFDNUQsaUJBQW9DO1FBTnBDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsa0NBQTZCLEdBQTdCLDZCQUE2QixDQUErQjtRQUM1RCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBakJyQyw2QkFBd0IsR0FJNUIsRUFBRSxDQUFDO1FBRUEsY0FBUyxHQUVaLEVBQUUsQ0FBQztJQVlQLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Q0c7SUFDSSxxQ0FBYSxHQUFwQixVQUNDLFFBQXNCLEVBQ3RCLE1BQWUsRUFDZixlQUF5QixFQUN6QixlQUF5QixFQUN6QiwyQkFBOEQ7UUFML0QsaUJBNkZDO1FBMUZBLHNEQUF5QjtRQUN6QixzREFBeUI7UUFDekIsZ0ZBQThEO1FBRTlELElBQU0sa0JBQWtCLEdBQUcscUNBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxRCxJQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUU5RSxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDNUMsc0JBQXNCLENBQUMsd0JBQXdCLENBQzlDLFFBQVEsRUFDUixlQUFlLENBQUMsUUFBUSxDQUFDLENBQ3pCLENBQUM7U0FDRjtRQUVELHNCQUFzQixDQUFDLHdCQUF3QixDQUM5QyxRQUFRLEVBQ1I7WUFDQyxFQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFDO1lBQzFCLFNBQVM7WUFDVCxhQUFhO1NBQ2IsQ0FDRCxDQUFDO1FBRUYsSUFBSSwyQkFBMkIsS0FBSyxJQUFJLEVBQUU7WUFDekMsc0JBQXNCLENBQUMsd0JBQXdCLENBQzlDLFFBQVEsRUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUNqQyxDQUFDLE9BQU8sMkJBQTJCLEtBQUssUUFBUSxDQUFDO2dCQUNoRCxDQUFDLENBQUMsMkJBQTJCO2dCQUM3QixDQUFDLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUN2QyxRQUFRLENBQ1IsQ0FDRCxDQUFDO1NBQ0Y7UUFFRCxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3hCLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFaEQsSUFDQyxjQUFjLEtBQUssU0FBUzttQkFDekIsQ0FDRixRQUFRLEtBQUssSUFBSTt1QkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUMxQyxRQUFRLEVBQ1IsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUN6QixjQUFjLENBQUMsZUFBZSxDQUM5QixDQUNELEVBQ0E7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUF3QyxDQUFDLENBQUM7YUFDMUU7U0FDRDtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDeEIsR0FBRyxDQUNIO1lBQ0MsUUFBUSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FDL0IsUUFBUSxFQUNSLE1BQU0sRUFDTixlQUFlLENBQ2Y7WUFDRCxpQkFBaUIsRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUztnQkFDekQsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUN6QixRQUFRLEVBQ1IsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUN6QjtTQUNGLENBQ0Q7YUFDQSxJQUFJLENBQ0osa0JBQVE7WUFDUCxJQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFFM0MsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQzlDLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFFBQVEsQ0FBQyxpQkFBaUIsQ0FDMUIsQ0FBQztZQUVGLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3RELEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQ3BDO1lBRUQsT0FBTyxRQUFRLENBQUM7UUFDakIsQ0FBQyxFQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVPLHlDQUFpQixHQUF6QixVQUNDLFFBQWtCLEVBQ2xCLE1BQWlDLEVBQ2pDLGVBQXFCO1FBRHJCLHlDQUFpQztRQUdqQyxJQUNDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTO2VBQ2xELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLEVBQy9EO1lBQ0QsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQ2xDLFFBQVEsRUFDUixNQUFNLEVBQ04sZUFBZSxDQUNmLENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTywrQ0FBdUIsR0FBL0IsVUFDQyxRQUFrQixFQUNsQixNQUF1QixFQUN2QixlQUFxQjtRQUh0QixpQkEwQkM7UUFyQkEsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzFELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDN0M7UUFFRCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCO2FBQzdFLFFBQVEsQ0FDUixRQUFRLEVBQ1IsZUFBZSxDQUNmO2FBQ0EsSUFBSSxDQUNKLGtCQUFRO1lBQ1AsT0FBTyxLQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdkQsT0FBTyxRQUFRLENBQUM7UUFDakIsQ0FBQyxFQUNEO1lBQ0MsT0FBTyxLQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdkQsT0FBTyxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FDRCxDQUFDO0lBQ0osQ0FBQztJQUNGLG9CQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ3pORDtBQUFBO0FBQUE7QUFjbUI7QUFDNkM7QUFDTTtBQUNkO0FBc0JuQztBQUNpRDtBQUNRO0FBVTlFO0lBMENDLGdCQUNDLGtCQUE4QyxFQUM5QyxhQUE0QixFQUM1QixZQUFtQyxFQUNuQyxnQkFBMkMsRUFDM0MsY0FBdUMsRUFDdkMsZUFBeUM7UUEvQzFDLFlBQU8sR0FBVyxPQUFPLENBQUM7UUFDMUIsU0FBSSxHQUFHLElBQUksQ0FBQztRQWdEWCxxR0FBcUc7UUFDckcsbUJBQW1CO1FBQ25CLElBQU0sVUFBVSxHQUFHLElBQUksNkJBQVUsRUFBRSxDQUFDO1FBQ3BDLElBQU0sWUFBWSxHQUFHLElBQUksK0JBQVksRUFBRSxDQUFDO1FBQ3hDLElBQU0sbUJBQW1CLEdBQUcsSUFBSSx3Q0FBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRSxJQUFNLGtCQUFrQixHQUFHLElBQUksdUNBQWtCLEVBQUUsQ0FBQztRQUNwRCxJQUFNLFlBQVksR0FBRyxJQUFJLCtCQUFZLEVBQUUsQ0FBQztRQUN4QyxJQUFNLHlCQUF5QixHQUFHLElBQUksNENBQXlCLEVBQUUsQ0FBQztRQUVsRSxJQUFNLFVBQVUsR0FBRyxJQUFJLDZCQUFVLENBQ2hDLGVBQWUsQ0FDZixDQUFDO1FBRUYsSUFBTSx3QkFBd0IsR0FBRyxJQUFJLDZDQUF3QixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkYsSUFBTSw2QkFBNkIsR0FBRyxJQUFJLGtEQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBGLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxtQ0FBZ0IsQ0FDNUMsYUFBYSxFQUNiLGVBQWUsQ0FDZixDQUFDO1FBRUYsSUFBTSwyQkFBMkIsR0FBRyxJQUFJLGdEQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xGLElBQU0saUJBQWlCLEdBQUcsSUFBSSxvQ0FBaUIsQ0FDOUMsa0JBQWtCLEVBQ2xCLDJCQUEyQixDQUMzQixDQUFDO1FBRUYsSUFBTSxXQUFXLEdBQUcsSUFBSSw4QkFBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQU0sYUFBYSxHQUFHLElBQUksZ0NBQWEsQ0FDdEMsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixjQUFjLEVBQ2QsV0FBVyxFQUNYLFVBQVUsQ0FDVixDQUFDO1FBQ0YsSUFBTSxpQkFBaUIsR0FBRyxJQUFJLHNDQUFpQixFQUFFLENBQUM7UUFDbEQsSUFBTSxzQkFBc0IsR0FBRyxJQUFJLDJDQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFN0UsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLHFDQUFnQixDQUM1QyxhQUFhLEVBQ2IsVUFBVSxFQUNWLGlCQUFpQixDQUNqQixDQUFDO1FBQ0YsSUFBTSx3QkFBd0IsR0FBRyxJQUFJLDZDQUF3QixFQUFFLENBQUM7UUFFaEUsSUFBTSxXQUFXLEdBQUcsSUFBSSw4QkFBVyxDQUNsQyxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFVBQVUsRUFDVixjQUFjLENBQ2QsQ0FBQztRQUNGLElBQU0sZUFBZSxHQUFHLElBQUksb0NBQWUsQ0FDMUMsZ0JBQWdCLEVBQ2hCLFVBQVUsQ0FDVixDQUFDO1FBQ0YsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLHFDQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsSUFBTSxtQkFBbUIsR0FBRyxJQUFJLHdDQUFtQixDQUNsRCxZQUFZLEVBQ1osWUFBWSxFQUNaLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsVUFBVSxDQUNWLENBQUM7UUFFRixJQUFNLGFBQWEsR0FBRyxJQUFJLDJCQUFhLENBQ3RDLFVBQVUsRUFDVixjQUFjLEVBQ2QsYUFBYSxFQUNiLGVBQWUsRUFDZixZQUFZLEVBQ1osNkJBQTZCLEVBQzdCLGlCQUFpQixDQUNqQixDQUFDO1FBRUYsSUFBTSxvQkFBb0IsR0FBRyxJQUFJLHVDQUFvQixDQUNwRCxVQUFVLENBQ1YsQ0FBQztRQUVGLElBQU0saUJBQWlCLEdBQUcsSUFBSSw4Q0FBaUIsQ0FDOUMsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osVUFBVSxFQUNWLGNBQWMsRUFDZCxhQUFhLENBQ2IsQ0FBQztRQUVGLElBQU0sbUJBQW1CLEdBQUcsSUFBSSxrREFBbUIsQ0FDbEQsZ0JBQWdCLEVBQ2hCLGlCQUFpQixDQUNqQixDQUFDO1FBRUYsSUFBTSxvQkFBb0IsR0FBRyxJQUFJLG9EQUFvQixDQUNwRCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLDZCQUE2QixFQUM3QixVQUFVLEVBQ1YsbUJBQW1CLENBQ25CLENBQUM7UUFFRixJQUFNLHlCQUF5QixHQUFHLElBQUksOENBQXlCLENBQzlELFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsZ0JBQWdCLENBQ2hCLENBQUM7UUFFRixJQUFNLGdCQUFnQixHQUFHLElBQUkscUNBQWdCLENBQzVDLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsY0FBYyxDQUNkLENBQUM7UUFFRixJQUFNLHNCQUFzQixHQUFHLElBQUkseUNBQXNCLENBQ3hELGtCQUFrQixFQUNsQixZQUFZLENBQ1osQ0FBQztRQUVGLElBQU0sc0JBQXNCLEdBQUcsSUFBSSwyQ0FBc0IsQ0FDeEQsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixVQUFVLENBQ1YsQ0FBQztRQUVGLElBQU0sc0JBQXNCLEdBQUcsSUFBSSwyQ0FBc0IsQ0FDeEQsbUJBQW1CLENBQ25CLENBQUM7UUFFRixJQUFNLG9CQUFvQixHQUFHLElBQUkseUNBQW9CLENBQ3BELFlBQVksRUFDWixVQUFVLEVBQ1YsNkJBQTZCLENBQzdCLENBQUM7UUFFRixJQUFNLHlCQUF5QixHQUFHLElBQUksOENBQXlCLEVBQUUsQ0FBQztRQUVsRSxJQUFNLHVCQUF1QixHQUFHLElBQUksMERBQXVCLENBQzFELG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsWUFBWSxFQUNaLGNBQWMsRUFDZCw2QkFBNkIsRUFDN0Isc0JBQXNCLEVBQ3RCLGdCQUFnQixDQUNoQixDQUFDO1FBRUYsSUFBTSwrQkFBK0IsR0FBRyxJQUFJLG9EQUErQixFQUFFLENBQUM7UUFFOUUsSUFBTSx1QkFBdUIsR0FBRyxJQUFJLDRDQUF1QixDQUMxRDtZQUNDLFlBQVk7WUFDWixpQkFBaUI7WUFDakIsYUFBYTtZQUNiLG1CQUFtQjtZQUNuQix1QkFBdUI7WUFDdkIsc0JBQXNCO1lBQ3RCLHNCQUFzQjtZQUN0QixzQkFBc0I7WUFDdEIsd0JBQXdCO1lBQ3hCLHlCQUF5QjtZQUN6QixXQUFXO1lBQ1gsc0JBQXNCO1lBQ3RCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsd0JBQXdCO1lBQ3hCLFVBQVU7WUFDVixvQkFBb0I7WUFDcEIsWUFBWTtZQUNaLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsbUJBQW1CO1lBQ25CLFVBQVU7WUFDVixlQUFlO1lBQ2YsV0FBVztZQUNYLCtCQUErQjtZQUMvQixjQUFjLEVBQUUsY0FBYztZQUM5QixtQkFBbUI7WUFDbkIsa0JBQWtCO1lBQ2xCLFlBQVk7WUFDWixvQkFBb0I7WUFDcEIsNkJBQTZCO1lBQzdCLGFBQWE7U0FDYixFQUNELElBQUksQ0FDSixDQUFDO1FBRUYsb0JBQW9CLENBQUMsY0FBYyxDQUNsQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsQ0FDeEMsQ0FBQztRQUVGLElBQU0sb0JBQW9CLEdBQUcsSUFBSSx1Q0FBb0IsQ0FDcEQsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixZQUFZLEVBQ1osWUFBWSxFQUNaLHVCQUF1QixFQUN2QixjQUFjLEVBQ2QsNkJBQTZCLEVBQzdCLGlCQUFpQixDQUNqQixDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQywyQkFBMkIsR0FBRywyQkFBMkIsQ0FBQztRQUMvRCxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7UUFDM0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyx1QkFBdUIsR0FBRyx1QkFBdUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUM7UUFDckQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDO1FBQ3JELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7UUFDekQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO1FBQzNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyx5QkFBeUIsQ0FBQztRQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUM7UUFDckQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBQ2pELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQywrQkFBK0IsR0FBRywrQkFBK0IsQ0FBQztRQUN2RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyw2QkFBNkIsQ0FBQztRQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7UUFDakQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLHVCQUF1QixDQUFDO0lBQ3hELENBQUM7SUFDRixhQUFDO0FBQUQsQ0FBQzs7QUFFTSxTQUFTLElBQUk7QUFDcEIsQ0FBQztBQUVNLFNBQVMsUUFBUSxDQUFFLEtBQUs7SUFDOUIsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDOzs7Ozs7OztBQ3RXRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXVCO0FBQ0s7QUFDSDtBQUNJO0FBQ0g7QUFDRTtBQUNKOzs7Ozs7OztBQ0h4QjtBQUFBO0FBQXVDO0FBdUJ2QztJQW1CQywwQkFDVyxnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWxCdEMsWUFBTyxHQUVWLEVBQUUsQ0FBQztRQUVBLFlBQU8sR0FFVixFQUFFLENBQUM7UUFFUDs7V0FFRztRQUNJLGtCQUFhLEdBSWhCLEVBQUUsQ0FBQztJQU1QLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQ0FBZSxHQUF0QixVQUNDLFFBQWtCLEVBQ2xCLFdBQW1CLEVBQ25CLE9BQWlCO1FBRWpCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDbEM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUNyRCxDQUFDO0lBRU0seUNBQWMsR0FBckIsVUFDQyxLQUFvQixFQUNwQixNQUEyQyxFQUMzQyxxQkFBcUYsRUFDckYsTUFBOEI7UUFEOUIsb0VBQXFGO1FBQ3JGLHNDQUE4QjtRQUU5QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRztnQkFDeEIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osT0FBTyxFQUFFO29CQUNSLE1BQU0sRUFBRSxFQUFFO29CQUNWLGVBQWUsRUFBRSxJQUFJO29CQUNyQixNQUFNLEVBQUUsTUFBTTtpQkFDZDthQUNELENBQUM7U0FDRjtRQUVELElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNwQixJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQy9ELE1BQU0sRUFDTixLQUFLLENBQUMsUUFBUSxDQUNkLENBQUM7WUFFRixLQUFLLElBQU0sUUFBUSxJQUFJLFlBQVksRUFBRTtnQkFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMxQztTQUNEO1FBRUQsS0FBSyxJQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDM0IsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUMzQyxNQUFNLEVBQ04sS0FBSyxDQUNMLENBQUM7WUFFRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3ZCLE1BQU0sQ0FBQyxjQUFjLENBQ3BCLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUMzQixLQUFLLEVBQ0wsSUFBSSxDQUNKLENBQUM7YUFDRjtpQkFBTTtnQkFDTixZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkQ7U0FDRDtRQUVELElBQUkscUJBQXFCLEtBQUssSUFBSSxFQUFFO1lBQ25DLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDO1NBQzdEO0lBQ0YsQ0FBQztJQUVNLHlDQUFjLEdBQXJCLFVBQ0MsT0FBa0I7UUFFbEIsSUFBSSxDQUFDLGVBQWUsQ0FDbkIsQ0FBQyxPQUFPLENBQUMsQ0FDVCxDQUFDO0lBQ0gsQ0FBQztJQUVNLDBDQUFlLEdBQXRCLFVBQ0MsT0FBb0I7UUFFcEIsS0FBd0IsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBNUIsSUFBTSxTQUFTO1lBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDdEM7WUFFRCx3RkFBd0Y7WUFDeEYsZ0VBQWdFO1lBQ2hFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUM3RCxTQUFTO2FBQ1Q7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDakQ7SUFDRixDQUFDO0lBRU0sa0NBQU8sR0FBZDtRQUNDLE9BQU8sQ0FBQyxtRUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7ZUFDL0IsQ0FBQyxtRUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0YsdUJBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3RKcUQ7QUFFTTtBQUk1RDs7Ozs7Ozs7OztHQVVHO0FBQ0g7SUFDUyxzRkFBZ0I7SUFJeEIsc0JBQ1MsaUJBQW9DLEVBQzVDLGdCQUFrQztRQUZuQyxZQUlDLGtCQUNDLGdCQUFnQixDQUNoQixTQUNEO1FBTlEsdUJBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUh0QyxhQUFPLEdBQXdCLElBQUksZ0ZBQW1CLEVBQUUsQ0FBQzs7SUFTaEUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxxQ0FBYyxHQUFyQixVQUNDLFFBQXNCLEVBQ3RCLE1BQThCO1FBRTlCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUNsRCxJQUFJLEVBQ0osUUFBUSxFQUNSO1lBQ0MsTUFBTTtTQUNOLENBQ0QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksc0NBQWUsR0FBdEIsVUFDQyxRQUFzQixFQUN0QixXQUEwQztRQUUxQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FDbEQsSUFBSSxFQUNKLFFBQVEsRUFDUixXQUFXLENBQ1gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksc0NBQWUsR0FBdEIsVUFDQyxNQUFjLEVBQ2QsTUFBOEIsRUFDOUIsT0FBZ0MsRUFDaEMsTUFBOEI7UUFBOUIsc0NBQThCO1FBRTlCLElBQUksWUFBWSxHQUFvQyxFQUFFLENBQUM7UUFFdkQsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3BCLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQ3pELE1BQU0sRUFDTixPQUFPLENBQUMsUUFBUSxDQUNoQixDQUFDO1lBRUYsS0FBSyxJQUFNLFFBQVEsSUFBSSxZQUFZLEVBQUU7Z0JBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDMUM7U0FDRDtRQUVELG1EQUFtRDtRQUNuRCxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUVwRSxLQUFLLElBQU0sUUFBUSxJQUFJLGFBQWEsRUFBRTtZQUNyQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ2YsTUFBTSxFQUNOLE1BQU0sRUFDTixPQUFPLENBQ1AsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxtQ0FBWSxHQUFuQixVQUNDLEtBQWdCLEVBQ2hCLEVBQWU7UUFFZixJQUFJLENBQUMsY0FBYyxDQUNsQixLQUFLLEVBQ0wsRUFBRSxFQUNGLElBQUksRUFDSixFQUFFLENBQ0YsQ0FBQztJQUNILENBQUM7SUFFTSw4QkFBTyxHQUFkO1FBQ0MsT0FBTyxpQkFBTSxPQUFPLFdBQUU7ZUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ0YsbUJBQUM7QUFBRCxDQUFDLENBckhRLDBFQUFnQixHQXFIeEI7Ozs7Ozs7OztBQ3ZJRDtBQUFBO0FBQXVDO0FBUXZDO0lBTUM7UUFKUSxXQUFNLEdBRVYsRUFBRSxDQUFDO0lBR1AsQ0FBQztJQUVNLGlDQUFHLEdBQVYsVUFDQyxNQUFjLEVBQ2QsTUFBOEIsRUFDOUIsT0FBZ0M7UUFFaEMsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzNCO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3pCO1lBQ0MsTUFBTSxFQUFFLE1BQU07WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxPQUFPO1NBQ2hCLENBQ0QsQ0FBQztJQUNILENBQUM7SUFFTSxxQ0FBTyxHQUFkO1FBQ0MsT0FBTyxDQUFDLG1FQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxxQ0FBTyxHQUFkLFVBQ0MsUUFJUztRQUVULEtBQUssSUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1QyxRQUFRLENBQ1AsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUNkLFFBQVEsRUFDUixDQUFDLENBQ0QsQ0FBQzthQUNGO1NBQ0Q7SUFDRixDQUFDO0lBRU0sc0NBQVEsR0FBZixVQUNDLFFBQWtCO1FBRWxCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQUNGLDBCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUNsRXFEO0FBRWY7QUFPdkM7Ozs7Ozs7Ozs7R0FVRztBQUNIO0lBQ1MsOEZBQWdCO0lBZXhCLDhCQUNDLGdCQUFrQztRQURuQyxZQUdDLGtCQUNDLGdCQUFnQixDQUNoQixTQUNEO1FBbkJNLGFBQU8sR0FFVixFQUFFLENBQUM7UUFFQSxXQUFLLEdBS1IsRUFBRSxDQUFDO1FBRUEseUJBQW1CLEdBQXdCLEVBQUUsQ0FBQzs7SUFRckQsQ0FBQztJQUVNLDZDQUFjLEdBQXJCLFVBQ0MsU0FBa0MsRUFDbEMsTUFBOEI7UUFFOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUc7WUFDNUIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsTUFBTSxFQUFFLE1BQU07U0FDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDJDQUFZLEdBQW5CLFVBQ0MsS0FBZ0IsRUFDaEIsRUFBZTtRQUVmLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHO1lBQ3RCLEtBQUssRUFBRSxLQUFLO1lBQ1osRUFBRSxFQUFFLEVBQUU7U0FDTixDQUFDO0lBQ0gsQ0FBQztJQUVNLHNDQUFPLEdBQWQ7UUFDQyxPQUFPLGlCQUFNLE9BQU8sV0FBRTtlQUNsQixDQUFDLG1FQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRiwyQkFBQztBQUFELENBQUMsQ0FuRFEsMEVBQWdCLEdBbUR4Qjs7Ozs7Ozs7O0FDcEVEO0FBQUE7QUFBdUU7QUFFdkUsSUFBTSx1QkFBdUIsR0FBVyxHQUFHLENBQUM7QUFFNUM7SUFPQyw4QkFDUyxjQUF1QyxFQUN2QyxpQkFBb0MsRUFDcEMsNkJBQTRELEVBQzVELFVBQXNCLEVBQ3RCLG1CQUF3QztRQUp4QyxtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7UUFDdkMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxrQ0FBNkIsR0FBN0IsNkJBQTZCLENBQStCO1FBQzVELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVZ6QyxxQkFBZ0IsR0FBd0MsRUFBRSxDQUFDO1FBQzNELHlCQUFvQixHQUF3QyxFQUFFLENBQUM7SUFZdkUsQ0FBQztJQUVNLDZDQUFjLEdBQXJCLFVBQXVCLFdBQXdCO1FBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2hDLENBQUM7SUFFTSx5Q0FBVSxHQUFqQixVQUNDLFFBQWtCLEVBQ2xCLE9BQWlCLEVBQ2pCLGNBQWlDO1FBRWpDLEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFO1lBQXpCLElBQU0sTUFBTTtZQUNoQixJQUFJLENBQUMsU0FBUyxDQUNiLFFBQVEsRUFDUixNQUFNLEVBQ04sY0FBYyxDQUNkLENBQUM7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSx3Q0FBUyxHQUFoQixVQUNDLFFBQWtCLEVBQ2xCLE1BQWMsRUFDZCxjQUFpQztRQUVqQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUlBQWlJLENBQUMsQ0FBQztTQUNuSjtRQUVELElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzVCLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFN0MsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FDNUIsUUFBUSxFQUNSLElBQUksQ0FBQyxvQkFBb0IsQ0FDekIsQ0FBQzthQUNGO2lCQUFNO2dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTBDLFFBQVEsWUFBTyxXQUFXLENBQUMsR0FBRyxFQUFFLFdBQVEsQ0FBQyxDQUFDO2FBQ2hHO1NBQ0Q7YUFBTTtZQUNOLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFekMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN4QztpQkFBTTtnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUEwQixRQUFRLFlBQU8sV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFRLENBQUMsQ0FBQzthQUNoRjtTQUNEO1FBRUQsTUFBTSxDQUFDLGFBQWEsQ0FDbkIsTUFBTSxFQUNOLGNBQWMsQ0FDZCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLDJDQUFZLEdBQW5CLFVBQ0MsUUFBa0IsRUFDbEIsS0FBdUIsRUFBRSxxQkFBcUI7SUFDOUMsY0FBaUM7UUFFakMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QzthQUFNO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBMEIsUUFBUSxZQUFPLFdBQVcsQ0FBQyxHQUFHLEVBQUUsZ0JBQWEsQ0FBQyxDQUFDO1NBQ3JGO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FDZCxLQUFLLEVBQ0wsY0FBYyxDQUNkLENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sOENBQWUsR0FBdkIsVUFDQyxRQUFrQixFQUNsQixHQUEyQjtRQUEzQiw0QkFBTSxJQUFJLENBQUMsZ0JBQWdCO1FBRTNCLElBQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLG9FQUFhLENBQy9DLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLDZCQUE2QixFQUNsQyxJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLFFBQVEsQ0FDUixDQUFDO1FBRUYsTUFBTSxDQUFDLFVBQVUsQ0FDaEI7WUFDQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFZixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QixDQUFDLEVBQ0QsdUJBQXVCLENBQ3ZCLENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRiwyQkFBQztBQUFELENBQUM7Ozs7Ozs7OztBQzNIRDtBQUFBO0lBT0MsdUJBQ1MsY0FBdUMsRUFDdkMsaUJBQW9DLEVBQ3BDLDZCQUE0RCxFQUM1RCxtQkFBd0MsRUFDeEMsV0FBd0IsRUFDeEIsUUFBa0I7UUFMbEIsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsa0NBQTZCLEdBQTdCLDZCQUE2QixDQUErQjtRQUM1RCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFYbkIsYUFBUSxHQUFvQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hFLDJCQUFzQixHQUEyQixJQUFJLENBQUMsNkJBQTZCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEcsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDN0IsWUFBTyxHQUFzQyxFQUFFLENBQUM7SUFXeEQsQ0FBQztJQUVNLGtDQUFVLEdBQWpCLFVBQ0MsTUFBYztRQUVkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLHFDQUFhLEdBQXBCLFVBQ0MsV0FBbUI7UUFFbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVMsQ0FBQztJQUNoRCxDQUFDO0lBRU0scUNBQWEsR0FBcEIsVUFDQyxNQUFjLEVBQ2QsY0FBaUM7UUFFakMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHdCQUF3QixDQUNuRCxJQUFJLENBQUMsUUFBUSxFQUNiLGNBQWMsQ0FDZCxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNoQztRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxnQ0FBUSxHQUFmLFVBQ0MsS0FBdUIsRUFDdkIsY0FBaUM7UUFFakMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHdCQUF3QixDQUNuRCxJQUFJLENBQUMsUUFBUSxFQUNiLGNBQWMsQ0FDZCxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQztRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSw2QkFBSyxHQUFaO1FBQUEsaUJBdUVDO1FBdEVBLElBQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNsQyxVQUFVLENBQUMsSUFBSSxDQUNkO2dCQUNDLEdBQUcsRUFBRSxJQUFJO2dCQUNULFVBQVUsRUFBRSxJQUFJO2dCQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDekIsQ0FDRCxDQUFDO1NBQ0Y7UUFFRCxLQUFLLElBQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDdkMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztTQUNqRjtRQUVELElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV6RCxJQUFJLFFBQThCLENBQUM7UUFFbkMsSUFBSSxDQUFDLGlCQUFpQjthQUNwQixLQUFLLENBQ0wsSUFBSSxDQUFDLFFBQVEsRUFDYjtZQUNDLFVBQVUsRUFBRSxVQUFVO1lBQ3RCLFFBQVEsRUFBRSxJQUFJO1NBQ2QsRUFDRCxjQUFjLENBQ2Q7YUFDQSxJQUFJLENBQ0osbUJBQVM7WUFDUixRQUFRLEdBQUcsU0FBUyxDQUFDO1lBRXJCLElBQU0sWUFBWSxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUUxRCxJQUNDLEtBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUM7bUJBQzVCLENBQUMsS0FBSSxDQUFDLGtCQUFrQixFQUFFLEVBQzVCO2dCQUNELElBQU0sV0FBVyxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUUvQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7b0JBQzlCLFlBQVksQ0FBQyxlQUFlLENBQzNCLEtBQUksQ0FBQyxRQUFRLEVBQ2IsV0FBVyxFQUNYLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUM3QixDQUFDO2lCQUNGO2FBQ0Q7WUFFRCxPQUFPLEtBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUN0QyxRQUFRLEVBQ1IsY0FBYyxFQUNkLEtBQUssRUFDTCxLQUFLLEVBQ0wsWUFBWSxDQUNaLENBQUM7UUFDSCxDQUFDLEVBQ0QsZUFBSyxJQUFJLFlBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUEzQixDQUEyQixDQUNwQzthQUNBLElBQUksQ0FDSixjQUFNLFlBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUEvQixDQUErQixFQUNyQyxlQUFLLElBQUksWUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQTNCLENBQTJCLENBQ3BDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sa0NBQVUsR0FBakI7UUFDQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFFTywwQ0FBa0IsR0FBMUI7UUFDQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFFakIsS0FBSyxJQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1gsT0FBTyxJQUFJLENBQUM7YUFDWjtZQUVELEtBQUssR0FBRyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVPLDJDQUFtQixHQUEzQjtRQUNDLEtBQUssSUFBTSxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2QyxPQUFPLFdBQVcsQ0FBQztTQUNuQjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFDRixvQkFBQztBQUFELENBQUM7Ozs7Ozs7OztBQ3ZKRDtBQUFBO0lBRUMsMkJBQ1MsZ0JBQWtDLEVBQ2xDLG9CQUEwQyxFQUMxQyxZQUFtQyxFQUNuQyxVQUFzQixFQUN0QixjQUF1QyxFQUN2QyxhQUE0QjtRQUw1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsaUJBQVksR0FBWixZQUFZLENBQXVCO1FBQ25DLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBR3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxpREFBcUIsR0FBNUIsVUFDQyxZQUEwQixFQUMxQixRQUFzQixFQUN0QixXQUEwQyxFQUMxQyxNQUE4QjtRQUovQixpQkErREM7UUEzREEsc0NBQThCO1FBRTlCLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xDO1FBRUQsSUFBTSxRQUFRLEdBQVUsRUFBRSxDQUFDO2dDQUVoQixNQUFNOztZQUNoQixJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDekMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNYLENBQUMsQ0FBQyxPQUFLLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUVoQyxRQUFRLENBQUMsSUFBSSxDQUNaLE9BQUssYUFBYTtpQkFDaEIsYUFBYSxDQUNiLFFBQVEsRUFDUixNQUFNLEVBQ04sRUFBRTtnQkFFRCxtREFBbUQ7Z0JBQ25ELEdBQUMsUUFBUSxJQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUV4QyxNQUFNLENBQ047aUJBQ0EsSUFBSSxDQUNKLFVBQUMsUUFBZ0M7Z0JBQ2hDLEtBQUksQ0FBQyxlQUFlLENBQ25CLFlBQVksRUFDWixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsY0FBTSxXQUFJLEVBQUosQ0FBSSxFQUNWLFVBQ0MsU0FBbUIsRUFDbkIsTUFBTTtvQkFFTixJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUU7d0JBQzNCLE9BQU87cUJBQ1A7b0JBRUQsS0FBSyxJQUFNLFFBQVEsSUFBSSxNQUFNLEVBQUU7d0JBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ3BDO2dCQUNGLENBQUMsQ0FDRCxDQUFDO1lBQ0gsQ0FBQyxFQUNELE9BQUssWUFBWSxDQUFDLE1BQU0sQ0FDeEIsQ0FDRixDQUFDOzs7UUExQ0gsS0FBcUIsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXO1lBQTNCLElBQU0sTUFBTTtvQkFBTixNQUFNO1NBMkNoQjtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWM7YUFDeEIsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUNiLElBQUksQ0FDSjtRQUNBLENBQUMsQ0FDRCxDQUFDO0lBQ0osQ0FBQztJQUVNLDJDQUFlLEdBQXRCLFVBQ0MsWUFBMEIsRUFDMUIsUUFBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQXVCLEVBQ3ZCLFFBQWdDLEVBQ2hDLHVCQUE2RCxFQUM3RCxvQkFBMkM7UUFEM0Msa0ZBQXlELFdBQUksRUFBSixDQUFJO1FBRzdELElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHdCQUF3QixDQUMxRSxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDSixRQUFRLENBQUMsUUFBUSxDQUNqQixDQUFDO1FBRUYsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXBDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FDekMsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFDckIsZ0JBQWdCLEVBQ2hCLE1BQU0sQ0FDTixDQUFDO1FBRUYsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7WUFDdkMsb0JBQW9CLENBQ25CLFFBQVEsRUFDUixNQUFNLEVBQ04sZ0JBQWdCLENBQ2hCLENBQUM7U0FDRjtRQUVELFlBQVksQ0FBQyxlQUFlLENBQzNCLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxDQUFDLE9BQU8sRUFDaEIsTUFBTSxDQUNOLENBQUM7UUFFRixJQUFJLENBQUMsd0JBQXdCLENBQzVCLFlBQVksRUFDWixRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixDQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVNLG9EQUF3QixHQUEvQixVQUNDLFlBQTBCLEVBQzFCLFVBQTBCLEVBQzFCLGFBQXFCLEVBQ3JCLFFBQWtDLEVBQ2xDLGdCQUFxQyxFQUNyQyx1QkFBNkQsRUFDN0Qsb0JBQTJDO1FBUDVDLGlCQTJGQztRQXJGQSxrRkFBeUQsV0FBSSxFQUFKLENBQUk7UUFHN0QsSUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFNLFlBQVksR0FBOEMsRUFBRSxDQUFDO1FBRW5FLElBQU0sYUFBYSxHQUFHLFVBQ3JCLFdBQXFCLEVBQ3JCLGNBQXNCLEVBQ3RCLFdBQW1CO1lBRW5CLElBQU0sTUFBTSxHQUFHO2dCQUNkLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsY0FBYzthQUN0QixDQUFDO1lBRUYsSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFaEUsS0FBSyxJQUFNLFFBQVEsSUFBSSxLQUFLLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNwQyxTQUFTO2lCQUNUO2dCQUVELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFBRTtvQkFDekMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQ3ZELFFBQVEsRUFDUixJQUFJLEVBQ0osUUFBUSxDQUFDLGVBQWUsQ0FDeEIsQ0FBQztpQkFDRjtnQkFFRCxLQUF3QixVQUFlLEVBQWYsVUFBSyxDQUFDLFFBQVEsQ0FBQyxFQUFmLGNBQWUsRUFBZixJQUFlLEVBQUU7b0JBQXBDLElBQU0sU0FBUztvQkFDbkIsSUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FDckMsUUFBUSxFQUNSLFNBQVMsQ0FDUixDQUFDO29CQUVILElBQ0MsQ0FBQyx1QkFBdUIsQ0FDdkIsUUFBUSxFQUNSLE1BQU0sQ0FDTixFQUNBO3dCQUNELFNBQVM7cUJBQ1Q7b0JBRUQsSUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBRTFELEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FDekMsTUFBTSxFQUNOLE1BQU0sRUFDTixZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUMzQixnQkFBZ0IsRUFDaEIsTUFBTSxDQUNOLENBQUM7b0JBRUYsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7d0JBQ3ZDLG9CQUFvQixDQUNuQixRQUFRLEVBQ1IsTUFBTSxFQUNOLGdCQUFnQixDQUNoQixDQUFDO3FCQUNGO29CQUVELFlBQVksQ0FBQyxlQUFlLENBQzNCLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUN0QixNQUFNLENBQ04sQ0FBQztvQkFFRixhQUFhLENBQ1osUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLENBQ1QsQ0FBQztpQkFDRjthQUNEO1FBQ0YsQ0FBQyxDQUFDO1FBRUYsYUFBYSxDQUNaLFVBQVUsRUFDVixhQUFhLEVBQ2IsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDaEMsQ0FBQztJQUNILENBQUM7SUFDRix3QkFBQztBQUFELENBQUM7Ozs7Ozs7OztBQ3BQRDtBQUFBO0FBQUE7QUFBdUQ7QUFDZ0I7QUFHdkU7SUFFQyw2QkFDUyxnQkFBa0MsRUFDbEMsaUJBQW9DO1FBRHBDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtJQUc3QyxDQUFDO0lBRU0sdUNBQVMsR0FBaEI7UUFDQyxPQUFPLElBQUksMEVBQVksQ0FDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUNOLG9EQUFzQixHQUE3QjtRQUNDLE9BQU8sSUFBSSwwRkFBb0IsQ0FDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVGLDBCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7O0FDNUJEO0FBQUE7QUFNb0I7QUFTcEI7SUFFQyxpQ0FDUyxtQkFBd0MsRUFDeEMsaUJBQW9DLEVBQ3BDLHlCQUFvRCxFQUNwRCxzQkFBOEMsRUFDOUMsb0JBQTBDLEVBQzFDLFlBQW1DLEVBQ25DLGNBQXVDLEVBQ3ZDLDZCQUE0RCxFQUM1RCxzQkFBOEMsRUFDOUMsZ0JBQWtDO1FBVGxDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3BELDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBK0I7UUFDNUQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBRzNDLENBQUM7SUFFTSwyQ0FBUyxHQUFoQixVQUNDLFdBQTZCLEVBQzdCLGVBQXlCLEVBQ3pCLHFCQUE2QztRQUU3QyxPQUFPLElBQUksaUVBQWdCLENBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMseUJBQXlCLEVBQzlCLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsNkJBQTZCLEVBQ2xDLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixXQUFXLEVBQ1gsZUFBZSxFQUNmLHFCQUFxQixDQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUNGLDhCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7O0FDWkQ7QUFBQTtBQUFBLElBQVksWUFHWDtBQUhELFdBQVksWUFBWTtJQUN2QiwyQkFBVztJQUNYLHVDQUF1QjtBQUN4QixDQUFDLEVBSFcsWUFBWSxLQUFaLFlBQVksUUFHdkI7QUFrUUQsa0RBQWtEO0FBRWxELElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUMxQiwwQ0FBdUI7SUFDdkIsb0NBQWlCO0FBQ2xCLENBQUMsRUFIVyxlQUFlLEtBQWYsZUFBZSxRQUcxQjs7Ozs7Ozs7Ozs7Ozs7QUNuVEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMEM7QUFDRjtBQUNJO0FBQ1o7QUFDYTtBQUNKO0FBQ0U7QUFDUTtBQUNTO0FBQ007QUFDakIiLCJmaWxlIjoicm0tY29yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIm1vbWVudFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJtb21lbnRcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUm1Db3JlXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibW9tZW50XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJSbUNvcmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJtb21lbnRcIl0pO1xufSkod2luZG93LCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181X18pIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gOSk7XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgY29weSwgZXF1YWxzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIEFwaUZvcm1hdHRlciB7XG5cblx0TU9NRU5UX0lOVkFMSUQgPSAnSW52YWxpZCBkYXRlJztcblx0U0VSVkVSX0RBVEVUSU1FX0ZPUk1BVCA9ICdZWVlZLU1NLUREW1RdSEg6bW06c3NaJztcblx0U0VSVkVSX1RJTUVfRk9STUFUID0gJ0hIOm1tOnNzJztcblx0U0VSVkVSX0RBVEVfRk9STUFUID0gJ1lZWVktTU0tREQnO1xuXG5cdGNvbnN0cnVjdG9yICgpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIGlmIGEgY29sdW1uIHR5cGUgaXMgYW4gJ2V4cGVuc2l2ZScgdHlwZSwgbWVhbmluZyB0aGF0IHRoZSBhY3Rpb24gdG8gZm9ybWF0IHRoZSBmaWVsZCB0YWtlcyBzaWduaWZpY2FudCBDUFUgdGltZVxuXHQgKlxuXHQgKiAtLS0tXG5cdCAqIEByZW1hcmtzXG5cdCAqIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIE1vbWVudCBvYmplY3RzXG5cdCAqL1xuXHRwdWJsaWMgaXNFeHBlbnNpdmVGb3JtYXQgKGNvbHVtblR5cGU6IHN0cmluZykge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogT3ZlcndyaXRlcyB0aGUgdmFsdWVzIGluICdjaGFuZ2VzJyBpZiB0aGUgdmFsdWVzIGluICdpbml0aWFsJyBhbmQgJ2NoYW5nZXMnIGFyZSB0aGUgc2FtZSAobGVhdmluZyB1c2VyIGNoYW5nZXMgaW50YWN0KVxuXHQgKi9cblx0cHVibGljIG1lcmdlQ29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRuZXdJbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW4ucGF0aDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRuZXdJbml0aWFsW2NvbHVtblBhdGhdICE9PSB1bmRlZmluZWRcblx0XHRcdFx0JiYgKFxuXHRcdFx0XHRcdGNvbHVtblBhdGggPT09ICdpZCcgfHxcblx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0XHR0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdLFxuXHRcdFx0XHRcdFx0aW5pdGlhbFtjb2x1bW5QYXRoXSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdID0gdGhpcy5jbG9uZShcblx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0bmV3SW5pdGlhbFtjb2x1bW5QYXRoXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlcztcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblx0XHRcdGNvbnN0IGNvbHVtblR5cGUgPSBhcGlDb2x1bW4udHlwZTtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdGNvbHVtblR5cGUsXG5cdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRtb2RpZmllZFtjb2x1bW5JZF0sXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSB0aGlzLmZvcm1hdFJlcXVlc3RWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3RMb2NhbDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuZm9ybWF0UmVxdWVzdFZhbHVlKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBoYXNDaGFuZ2VzIChcblx0XHRpbml0aWFsOiBGaWVsZE1hcCxcblx0XHRtb2RpZmllZDogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0XHRpbmNsdWRlUmVhZE9ubHlDb2x1bW5zOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblxuXHRcdFx0Ly8gUGFyZW50IGNvbHVtbnMgYXJlbid0IHdyaXRhYmxlIGN1cnJlbnRseSBiZWNhdXNlIHdlIHVzZSBMaW5rVG8gcmVxdWVzdHNcblx0XHRcdC8vIGJ1dCBpbiB0aGUgY29yZSB0aGV5J3JlIGFscmVhZHkgdHJlYXRlZCBhcyBub3JtYWwgZmllbGRzXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFwaUNvbHVtbi50eXBlICE9PSAnbGluaydcblx0XHRcdFx0JiYgYXBpQ29sdW1uLnR5cGUgIT09ICdwYXJlbnR0eXBlJ1xuXHRcdFx0XHQmJiBhcGlDb2x1bW4udHlwZSAhPT0gJ3BhcmVudGlkJ1xuXHRcdFx0XHQmJiAoIWluY2x1ZGVSZWFkT25seUNvbHVtbnMgJiYgYXBpQ29sdW1uLnJlYWRPbmx5KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRcdG1vZGlmaWVkLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBtb21lbnQgZ2V0dGVyIGhhc24ndCBiZWVuIHRyaWdnZXJlZCBvciBvdmVyd3JpdHRlbiB5ZXQsIHdlIGNhbiBhc3N1bWUgdGhlcmUgYXJlIG5vIGNoYW5nZXNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGRlc2MgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MudmFsdWUgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IG9iamVjdFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdGlmIChhcGlDb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0aW5pdGlhbFtjb2x1bW5JZF0sXG5cdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0b2xkVmFsdWU6IGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdFx0bmV3VmFsdWU6IG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0XHRcdGNvbHVtbjogY29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHNvdXJjZTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5QYXRoKVxuXHRcdFx0XHR8fCAoXG5cdFx0XHRcdFx0Ly8gcHJldmVudCB0cmlnZ2VyaW5nIGdldHRlciBmb3IgZXhwZW5zaXZlIGZvcm1hdHNcblx0XHRcdFx0XHQhdGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpXG5cdFx0XHRcdFx0JiYgc291cmNlW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWRcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5QYXRoXSA9IHRoaXMuY2xvbmUoXG5cdFx0XHRcdGNvbHVtbi5hcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0c291cmNlW2NvbHVtblBhdGhdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2hhbGxvd0NvcHlGaWVsZHMgKFxuXHRcdHNoYWxsb3dTb3VyY2U6IEZpZWxkTWFwLFxuXHRcdGRlZXBTb3VyY2U6IEZpZWxkTWFwLFxuXHRcdGRlc3RpbmF0aW9uOiBGaWVsZE1hcCxcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcCB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbi5wYXRoO1xuXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5QYXRoXSA9IHNoYWxsb3dTb3VyY2VbY29sdW1uUGF0aF0gIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHNoYWxsb3dTb3VyY2VbY29sdW1uUGF0aF0gOlxuXHRcdFx0XHR0aGlzLmNsb25lKFxuXHRcdFx0XHRcdGNvbHVtbi5hcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkZWVwU291cmNlW2NvbHVtblBhdGhdLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZXN0aW5hdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBzZXREZWZhdWx0VmFsdWVzIChcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXAge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbi5pZF0gPSB0aGlzLmdldERlZmF1bHRWYWx1ZShjb2x1bW4uYXBpQ29sdW1uLnR5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZXN0aW5hdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ29tcGFyZXMgdGhlIGdpdmVuIGZpZWxkcywgcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZmllbGRzIGFyZSBlcXVhbFxuXHQgKi9cblx0cHVibGljIGNvbXBhcmVGaWVsZHMgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHRmaXJzdD86IGFueSxcblx0XHRzZWNvbmQ/OiBhbnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gc2Vjb25kID09PSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHNlY29uZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlTW9tZW50T2JqZWN0cyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbXBhcmVEdXJhdGlvbnMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnaWQnOiAvLyBpZCB0eXBlc1xuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRyZXR1cm4gZmlyc3QgPT0gc2Vjb25kOyAvLyB1c2Ugbm9uLXN0cmljdCBjb21wYXJpc29uXG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdkaXN0YW5jZSc6XG5cdFx0XHRjYXNlICdkb3VibGUnOiAvLyBmbG9hdGluZyBwb2ludCB0eXBlc1xuXHRcdFx0Y2FzZSAnZmlsZXNpemUnOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ3Bvd2VyJzpcblx0XHRcdGNhc2UgJ3F1YW50aXR5Jzpcblx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAnY29vcmRpbmF0ZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZUZsb2F0cyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdpbnQnOiAvLyBpbnRlZ2VyIHR5cGVzXG5cdFx0XHRjYXNlICdib29sJzogLy8gYm9vbGVhbiB0eXBlc1xuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRjYXNlICdlbWFpbCc6IC8vIHN0cmluZyB0eXBlc1xuXHRcdFx0Y2FzZSAncGhvbmUnOlxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0XHRyZXR1cm4gZmlyc3QgPT09IHNlY29uZDtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBlcXVhbHMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlRmxvYXRzIChcblx0XHRhOiBudW1iZXIsXG5cdFx0YjogbnVtYmVyLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBhYnNBID0gTWF0aC5hYnMoYSk7XG5cdFx0Y29uc3QgYWJzQiA9IE1hdGguYWJzKGIpO1xuXHRcdGNvbnN0IGRpZmYgPSBNYXRoLmFicyhhIC0gYik7XG5cblx0XHRjb25zdCBFUFNJTE9OID0gMS4xOWUtMDc7XG5cblx0XHQvLyBzaG9ydGN1dCwgaGFuZGxlcyBpbmZpbml0aWVzXG5cdFx0aWYgKGEgPT09IGIpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoYSA9PT0gMCB8fCBiID09PSAwIHx8IGRpZmYgPCBOdW1iZXIuTUlOX1ZBTFVFKSB7XG5cdFx0XHQvLyBhIG9yIGIgaXMgemVybyBvciBib3RoIGFyZSBleHRyZW1lbHkgY2xvc2UgdG8gaXRcblx0XHRcdC8vIHJlbGF0aXZlIGVycm9yIGlzIGxlc3MgbWVhbmluZ2Z1bCBoZXJlXG5cdFx0XHRyZXR1cm4gZGlmZiA8IChFUFNJTE9OICogTnVtYmVyLk1JTl9WQUxVRSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHVzZSByZWxhdGl2ZSBlcnJvclxuXHRcdFx0cmV0dXJuIGRpZmYgLyBNYXRoLm1pbihcblx0XHRcdFx0KGFic0EgKyBhYnNCKSxcblx0XHRcdFx0TnVtYmVyLk1BWF9WQUxVRSxcblx0XHRcdCkgPCBFUFNJTE9OO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlTW9tZW50T2JqZWN0cyAoXG5cdFx0Zmlyc3Q6IG1vbWVudC5Nb21lbnQsXG5cdFx0c2Vjb25kOiBtb21lbnQuTW9tZW50LFxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAoIWZpcnN0LmlzVmFsaWQoKSkge1xuXHRcdFx0cmV0dXJuICFzZWNvbmQuaXNWYWxpZCgpO1xuXHRcdH1cblxuXHRcdGlmICghc2Vjb25kLmlzVmFsaWQoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gLy8gZmlyc3QgSVMgdmFsaWRcblxuXHRcdHJldHVybiBmaXJzdC5pc1NhbWUoc2Vjb25kKTtcblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlRHVyYXRpb25zIChcblx0XHRmaXJzdDogbW9tZW50LkR1cmF0aW9uLFxuXHRcdHNlY29uZDogbW9tZW50LkR1cmF0aW9uLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmlyc3QuYXNNaWxsaXNlY29uZHMoKSA9PT0gc2Vjb25kLmFzTWlsbGlzZWNvbmRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlRGF0ZSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlQ29sb3IodmFsdWUpO1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXNwb25zZUR1cmF0aW9uKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlO1xuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSAwID8gbnVsbCA6IHZhbHVlO1xuXHRcdFx0Y2FzZSAnZmlsZXNpemUnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgLyAxMDAwMDAwO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0VmFsdWUgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHQpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdERhdGVUaW1lKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXF1ZXN0RGF0ZSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3RDb2xvcih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3REdXJhdGlvbih2YWx1ZSk7XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IDAgPyBudWxsIDogdmFsdWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlc3BvbnNlRGF0ZSAodmFsdWU6IG51bGwgfCBhbnkpOiBtb21lbnQuTW9tZW50IHtcblx0XHRyZXR1cm4gdmFsdWUgPT09IG51bGwgPyBtb21lbnQuaW52YWxpZCgpIDogbW9tZW50KHZhbHVlKTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZUR1cmF0aW9uICh2YWx1ZTogbnVsbCB8IG51bWJlcik6IG1vbWVudC5EdXJhdGlvbiB7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihcblx0XHRcdHZhbHVlID09PSBudWxsID8gMCA6IHZhbHVlLFxuXHRcdFx0J3NlY29uZHMnLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VDb2xvciAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHZhbHVlLmNoYXJBdCgwKSA9PT0gJyMnID8gdmFsdWUgOiAnIycgKyB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RGF0ZVRpbWUgKHZhbHVlOiBtb21lbnQuTW9tZW50KTogc3RyaW5nIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlLmZvcm1hdCh0aGlzLlNFUlZFUl9EQVRFVElNRV9GT1JNQVQpIDogbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RGF0ZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdmFsdWUuaXNWYWxpZCgpID8gdmFsdWUuZm9ybWF0KHRoaXMuU0VSVkVSX0RBVEVfRk9STUFUKSA6IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdER1cmF0aW9uICh2YWx1ZTogbW9tZW50LkR1cmF0aW9uKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdmFsdWUuYXNTZWNvbmRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdENvbG9yICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdmFsdWUuY2hhckF0KDApID09PSAnIycgPyB2YWx1ZS5zdWJzdHJpbmcoMSkgOiB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXREZWZhdWx0VmFsdWUgKGNvbHVtblR5cGU6IHN0cmluZyk6IGFueSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdpbnQnOlxuXHRcdFx0Y2FzZSAnZG91YmxlJzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdGNhc2UgJ2l0ZW0nOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRjYXNlICdjaGlsZCc6XG5cdFx0XHRjYXNlICdzaWJsaW5nJzpcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRcdHJldHVybiAnMCc7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0XHRyZXR1cm4gbW9tZW50LmludmFsaWQoKTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbigpO1xuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdFx0cmV0dXJuICcjMDAwMDAwJztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdC8vIFx0XHRcdFx0XHRlbWFpbFxuXHRcdFx0Ly8gXHRcdFx0XHRcdHVybFxuXHRcdFx0Ly8gXHRcdFx0XHRcdGh0bWxcblx0XHRcdC8vIFx0XHRcdFx0XHRqc29uXG5cdFx0XHQvLyBcdFx0XHRcdFx0ZGF0YVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0dmFsdWUsXG5cdFx0XHR0aGlzLmdldERlZmF1bHRWYWx1ZShjb2x1bW5UeXBlKSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsb25lIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KTogYW55IHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xvbmVEdXJhdGlvbih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIG1vbWVudCh2YWx1ZSk7XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdFx0cmV0dXJuIGNvcHkodmFsdWUpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBnZXRDbG9uZUZ1bmN0aW9uIChjb2x1bW5UeXBlOiBzdHJpbmcpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xvbmVEdXJhdGlvbjtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jbG9uZURhdGU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVEdXJhdGlvbiAoZHVyYXRpb246IG1vbWVudC5EdXJhdGlvbikge1xuXHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24oZHVyYXRpb24pO1xuXHR9XG5cblx0cHVibGljIGNsb25lRGF0ZSAoZGF0ZTogbW9tZW50Lk1vbWVudCk6IG1vbWVudC5Nb21lbnQge1xuXHRcdHJldHVybiBkYXRlLmNsb25lKCk7XG5cdH1cblxuXHRwdWJsaWMgaWRlbnRpdHk8VD4gKGlucHV0OiBUKTogVCB7XG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXF1ZXN0SXRlbU1hcCwgQXBpUmVxdWVzdExpbWl0LCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEFwaVJlcXVlc3RTZXJ2aWNlIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeVxuXHQpIHtcblxuXHR9XG5cblx0dGVtcGxhdGUgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgcGFyYW1zOiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS50ZW1wbGF0ZShpdGVtVHlwZSwgcGFyYW1zKSk7XG5cdH1cblxuXHRjcmVhdGUgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgaXRlbUlkOiBJdGVtSWQsIHZhbHVlczogYW55LCBwYXJlbnRUeXBlPzogSXRlbVR5cGUsIHBhcmVudElkPzogSXRlbUlkKTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuY3JlYXRlKGl0ZW1UeXBlLCBpdGVtSWQsIHZhbHVlcywgcGFyZW50VHlwZSwgcGFyZW50SWQpKTtcblx0fVxuXG5cdGRlbGV0ZSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBpdGVtSWRzOiBJdGVtSWRbXSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLmRlbGV0ZShpdGVtVHlwZSwgaXRlbUlkcykpO1xuXHR9XG5cblx0dXBkYXRlSXRlbXMgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgaXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwLCBjb2x1bW5zOiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS51cGRhdGVJdGVtcyhpdGVtVHlwZSwgaXRlbXMsIGNvbHVtbnMpKTtcblx0fVxuXG5cdHJlcXVlc3RTa2VsZXRvbiAocGFyYW1zOiBhbnksIHJlcXVlc3RDYW5jZWxlcj86IFByb21pc2VJbnRlcmZhY2U8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihwYXJhbXMsIHJlcXVlc3RDYW5jZWxlcikpO1xuXHR9XG5cblx0bW92ZUl0ZW1zIChwYXJlbnRUeXBlOiBJdGVtVHlwZSwgcGFyZW50SWQ6IEl0ZW1JZCwgaXRlbXM6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdfSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLm1vdmVJdGVtcyhwYXJlbnRUeXBlLCBwYXJlbnRJZCwgaXRlbXMpKTtcblx0fVxuXG5cdGNvbHVtbnMgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgY29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCwgcGFyYW1zPzogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuY29sdW1ucyhpdGVtVHlwZSwgY29sdW1ucywgcGFyYW1zKSk7XG5cdH1cblxuXHRxdWVyeSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBxdWVyeTogYW55LCBjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBsaW1pdD86IEFwaVJlcXVlc3RMaW1pdCk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnF1ZXJ5KGl0ZW1UeXBlLCBxdWVyeSwgY29sdW1ucywgbGltaXQpKTtcblx0fVxuXG5cdHByb2Nlc3NSZXNwb25zZSAocmVxdWVzdDogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiByZXF1ZXN0LnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHRoaXMuYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5LmNvbnN0cnVjdChyZXNwb25zZSkpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlLCBJdGVtVHlwZU1hcCwgUmVzcG9uc2VDb2x1bW4gfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vIHRvZG9bY2FjaGVdIGV4dGVuZCBiYXNlIGNsYXNzIHBlciByZXF1ZXN0IChkZWxldGUgaGFzIGRpZmZlcmVudCBzdHJ1Y3R1cmUpXG5leHBvcnQgY2xhc3MgQXBpUmVzcG9uc2VQcm9jZXNzb3Ige1xuXG5cdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGU7XG5cblx0Y29sdW1uczogSXRlbVR5cGVNYXA8UmVzcG9uc2VDb2x1bW5bXT47XG5cdGxpbmtzOiBJdGVtVHlwZU1hcDxJdGVtSWRbXT47XG5cdGNhY2hlYWJsZTogYm9vbGVhbjtcblx0bWFwOiBhbnk7XG5cblx0aXRlbXM6IGFueTtcblxuXHRjb2x1bW5JbmRleE1hcDoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0W2NvbHVtbklkOiBzdHJpbmddOiBudW1iZXJcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRjb2x1bW5NYXA6IGFueSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIHJlc3BvbnNlOiBhbnksXG5cdCkge1xuXHRcdHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnM7XG5cdFx0dGhpcy5pdGVtcyA9IHJlc3BvbnNlLml0ZW1zO1xuXHRcdHRoaXMubGlua3MgPSByZXNwb25zZS5saW5rcztcblx0XHR0aGlzLmNhY2hlYWJsZSA9IHJlc3BvbnNlLmNhY2hlYWJsZTtcblx0XHR0aGlzLm1hcCA9IHJlc3BvbnNlLm1hcDtcblx0XHR0aGlzLml0ZW1UeXBlID0gcmVzcG9uc2UuaXRlbVR5cGU7XG5cblx0XHR0aGlzLmNyZWF0ZUNvbHVtbk1hcHMoKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbHVtbk9iamVjdCAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUmVzcG9uc2VDb2x1bW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV07XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hWYWx1ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdCkge1xuXHRcdGlmICh0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdW2NvbHVtbklkXTtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY29sdW1uSW5kZXhNYXBbaXRlbVR5cGVdW2NvbHVtbklkXTtcblxuXHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHR0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdLmRhdGFbaW5kZXhdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2x1bW5BcnJheSAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUmVzcG9uc2VDb2x1bW5bXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGFwaUNvbHVtbiBvZiB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdKSB7XG5cdFx0XHRyZXN1bHQucHVzaChhcGlDb2x1bW4pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hEZXJpdmVkT2JqZWN0IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0cm9vdENvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2Ygcm9vdENvbHVtbnMpIHtcblx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHR0aGlzLmZldGNoVmFsdWUoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdFx0KSxcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hEZXJpdmVkVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IGFueSxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdGxldCBjaGlsZFZhbHVlO1xuXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0Y2hpbGRWYWx1ZSA9IG51bGw7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NoaWxkQ29sdW1uLnBhdGhdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZ2V0RGVmYXVsdFZhbHVlKGNoaWxkQ29sdW1uLmFwaUNvbHVtbi50eXBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNoaWxkVmFsdWUgPSB0aGlzLmZldGNoVmFsdWUoXG5cdFx0XHRcdFx0Y29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdGNoaWxkQ29sdW1uLmlkLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjaGlsZENvbHVtbi5wYXRoXSA9IGNoaWxkVmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGlsZENvbHVtbi5pc0xlYWYpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHRjaGlsZFZhbHVlLFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmZXRjaE9iamVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBzdHJpbmcgfCBJdGVtSWQsXG5cdFx0aW5jbHVkZUxpbmtzOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4gfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLml0ZW1zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0aWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBkYXRhID0gdGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXS5kYXRhO1xuXHRcdGNvbnN0IHJlc3VsdDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdW2ldO1xuXG5cdFx0XHRpZiAodGhpcy5hcGlGb3JtYXR0ZXIuaXNFeHBlbnNpdmVGb3JtYXQoY29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdHRoaXMuYWRkTGF6eUZvcm1hdHRpbmdGdW5jdGlvbjxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkYXRhW2ldLFxuXHRcdFx0XHRcdHJlc3VsdCxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW4uaWRdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVzcG9uc2VWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkYXRhW2ldLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbmNsdWRlTGlua3MpIHtcblx0XHRcdGNvbnN0IGxpbmtzID0gdGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXS5saW5rcztcblx0XHRcdHJlc3VsdC5fX2xpbmtzID0ge307XG5cblx0XHRcdGZvciAoY29uc3QgbGlua1R5cGUgaW4gbGlua3MpIHtcblx0XHRcdFx0cmVzdWx0Ll9fbGlua3NbbGlua1R5cGVdID1cblx0XHRcdFx0XHR0aGlzLmZldGNoT2JqZWN0QXJyYXkoXG5cdFx0XHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdFx0XHRcdGxpbmtzW2xpbmtUeXBlXSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hPYmplY3RBcnJheTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aW5jbHVkZUxpbmtzPzogYm9vbGVhbixcblx0XHRpZEFycmF5PzogSXRlbUlkW10gfCBudWxsLFxuXHQpOiBBcnJheTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG5cdFx0aWYgKGlkQXJyYXkgPT09IG51bGwpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIHRoaXMuaXRlbXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdFx0KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0aWYgKGlkQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWRBcnJheSA9IHRoaXMubGlua3NbaXRlbVR5cGVdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGlkQXJyYXkpIHtcblx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2x1bW5zT2JqZWN0ICgpOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtbn0ge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbk1hcDtcblx0fVxuXG5cdHByaXZhdGUgYWRkTGF6eUZvcm1hdHRpbmdGdW5jdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdGluaXRpYWxWYWx1ZTogYW55LFxuXHRcdGRlc3RpbmF0aW9uOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdGNvbHVtbklkLFxuXHRcdFx0e1xuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdHNldDpcblx0XHRcdFx0XHR2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHRkZWxldGUgZGVzdGluYXRpb25bY29sdW1uSWRdO1xuXG5cdFx0XHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JZF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgZGVzdGluYXRpb25bY29sdW1uSWRdO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRcdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0XHRcdFx0aW5pdGlhbFZhbHVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbHVtbk1hcHMgKCkge1xuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5jb2x1bW5zKSB7XG5cdFx0XHR0aGlzLmNvbHVtbkluZGV4TWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0dGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdID0ge307XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdW2ldO1xuXG5cdFx0XHRcdHRoaXMuY29sdW1uSW5kZXhNYXBbaXRlbVR5cGVdW2NvbHVtbi5pZF0gPSBpO1xuXHRcdFx0XHR0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV1bY29sdW1uLmlkXSA9IGNvbHVtbjtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudCwgSXRlbUVudHJ5TWFwLCBJdGVtTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDcmVhdGVEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5pbXBvcnQgeyBjcmVhdGVQYXRoIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgQ3JlYXRlQ29tcGlsYXRpb24gPSB7XG5cdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0W3BhcmVudElkOiBudW1iZXJdOiBJdGVtTWFwPEludGVybmFsQ3JlYXRlRGVsdGE+XG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIERlbGV0ZUNvbXBpbGF0aW9uID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZT4+XG59O1xuXG5leHBvcnQgdHlwZSBVcGRhdGVDb21waWxhdGlvbiA9IEl0ZW1FbnRyeU1hcDxJdGVtVHlwZT47XG5cbmV4cG9ydCB0eXBlIE1vdmVDb21waWxhdGlvbiA9IHtcblx0W3BhcmVudFR5cGU6IHN0cmluZ106IHtcblx0XHRbcGFyZW50SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVtdXG5cdH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzQ29tcGlsYXRpb24ge1xuXG5cdGNvbXBpbGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBDcmVhdGVDb21waWxhdGlvbixcblx0XHRkZWxldGU6IERlbGV0ZUNvbXBpbGF0aW9uLFxuXHRcdHVwZGF0ZTogVXBkYXRlQ29tcGlsYXRpb24sXG5cdFx0bW92ZTogTW92ZUNvbXBpbGF0aW9uXG5cdH0gPSB7XG5cdFx0Y3JlYXRlOiB7fSxcblx0XHRkZWxldGU6IHt9LFxuXHRcdHVwZGF0ZToge30sXG5cdFx0bW92ZToge30sXG5cdH07XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHRoaXMucHJvY2Vzc0RlbHRhKCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NEZWx0YSAoKTogdm9pZCB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5nZXREZWx0YSgpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0Y29uc3QgZW50cmllc1RvQmVEZWxldGVkID0gY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBlbnRyaWVzVG9CZURlbGV0ZWQpIHtcblx0XHRcdFx0aWYgKGl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYWRkRGVsZXRlRW50cnkoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLmNyZWF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLmFkZENyZWF0ZUVudHJ5KHR1cGxlKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRVcGRhdGVFbnRyeSh0dXBsZS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLm1vdmVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRNb3ZlRW50cnkoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS50byxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXREZWZhdWx0UGFyZW50ICgpOiBFbnRyeVBhcmVudCB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGl0ZW1UeXBlOiAnVm9pZCcsXG5cdFx0XHRpdGVtSWQ6IDAsXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgYWRkTW92ZUVudHJ5IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoPEl0ZW1FbnRyeVtdPihcblx0XHRcdHRoaXMuY29tcGlsYXRpb24ubW92ZSxcblx0XHRcdFtcblx0XHRcdFx0bmV3UGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRuZXdQYXJlbnQuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdFtdLFxuXHRcdFx0XSxcblx0XHQpXG5cdFx0XHQucHVzaChpdGVtRW50cnkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGREZWxldGVFbnRyeSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoPEl0ZW1FbnRyeVtdPihcblx0XHRcdHRoaXMuY29tcGlsYXRpb24uZGVsZXRlLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHRbXSxcblx0XHRcdF0sXG5cdFx0KVxuXHRcdFx0LnB1c2goXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFkZFVwZGF0ZUVudHJ5IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZT4pOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi51cGRhdGUsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRdLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFkZENyZWF0ZUVudHJ5IChjcmVhdGVEZWx0YTogSW50ZXJuYWxDcmVhdGVEZWx0YSk6IHZvaWQge1xuXHRcdGxldCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChjcmVhdGVEZWx0YS5lbnRyeSk7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRwYXJlbnQgPSB0aGlzLmdldERlZmF1bHRQYXJlbnQoKTtcblx0XHR9XG5cblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi5jcmVhdGUsXG5cdFx0XHRbXG5cdFx0XHRcdHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0cGFyZW50Lml0ZW1JZCxcblx0XHRcdFx0Y3JlYXRlRGVsdGEuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGNyZWF0ZURlbHRhLmVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGNyZWF0ZURlbHRhLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7XG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDaGFuZ2VzQ29tcGlsYXRpb24sXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbHVtbkluZm8sXG5cdERlbGV0ZUNvbXBpbGF0aW9uLFxuXHRoYXNQcm9wZXJ0aWVzLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRNb3ZlQ29tcGlsYXRpb24sXG5cdFNlcnZlckNhY2hlLFxuXHRVcGRhdGVDb21waWxhdGlvbixcbn0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQge1xuXHRDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RNb3ZlSXRlbXMsXG5cdEFwaVJlc3BvbnNlLFxuXHRDcmVhdGVSZXF1ZXN0RW50cnksXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgZ2V0UGF0aCwgaW5BcnJheSB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayA9IChjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwKSA9PiB2b2lkO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgdGhlIGNoYW5nZXMgZnJvbSBhIHNwZWNpZmljIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufSBhbmQgcmV0dXJucyBhIHtAbGluayBDaGFuZ2VzRGVsdGEgQ2hhbmdlc0RlbHRhfVxuICovXG5leHBvcnQgY2xhc3MgQ2hhbmdlc1Byb2Nlc3NvciB7XG5cblx0cHJpdmF0ZSBpdGVtSWRDb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge307XG5cdHByaXZhdGUgc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbi5nZXRTZXJ2ZXJDYWNoZSgpO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRwcml2YXRlIGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0cHJpdmF0ZSBvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCkge1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFeGVjdXRlcyB0aGUgcmVxdWVzdHMgaW4gdGhlIG9yZGVyIG9mOlxuXHQgKiAxLiBjcmVhdGVcblx0ICogMi4gbW92ZVxuXHQgKiAzLiBkZWxldGVcblx0ICogNC4gdXBkYXRlXG5cdCAqL1xuXHRwdWJsaWMgZXhlY3V0ZSAoKTogUHJvbWlzZUludGVyZmFjZTxJdGVtSWRDb252ZXJzaW9uTWFwPiB7XG5cdFx0Y29uc3QgY2hhbmdlc0NvbXBpbGF0aW9uID0gdGhpcy5jaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbXBpbGF0aW9uID0gY2hhbmdlc0NvbXBpbGF0aW9uLmNvbXBpbGF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5leGVjdXRlQ3JlYXRlUmVxdWVzdHMoY2hhbmdlc0NvbXBpbGF0aW9uKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZU1vdmVSZXF1ZXN0cyhjb21waWxhdGlvbi5tb3ZlKSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZVVwZGF0ZVJlcXVlc3RzKGNvbXBpbGF0aW9uLnVwZGF0ZSksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLmV4ZWN1dGVEZWxldGVSZXF1ZXN0cyhjb21waWxhdGlvbi5kZWxldGUpLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZE1vdmVSZXF1ZXN0IChjb21waWxhdGlvbkVudHJpZXM6IEl0ZW1FbnRyeVtdKTogQXBpUmVxdWVzdE1vdmVJdGVtcyB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0TW92ZUl0ZW1zID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBjb21waWxhdGlvbkVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0XHRpZiAocmVzdWx0W2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdFtpdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGdldE1hcFZhbHVlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0bWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0gdGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBJdGVtSWQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChtYXAgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAobWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVDcmVhdGVSZXF1ZXN0cyAoXG5cdFx0Y2hhbmdlc0NvbXBpbGF0aW9uOiBDaGFuZ2VzQ29tcGlsYXRpb24sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8YW55W10+IHtcblx0XHRjb25zdCByZXF1ZXN0cyA9IHRoaXMuY3JlYXRlUmVxdWVzdEZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdGNoYW5nZXNDb21waWxhdGlvbi5jb21waWxhdGlvbi5jcmVhdGUsXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0XHRcdHRoaXMuYnJlYWtVcEJ5UGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnJ1bigpO1xuXG5cdFx0Y29uc3QgcmVzcG9uc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcblx0XHRcdHJlc3BvbnNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzXG5cdFx0XHRcdFx0LmV4ZWN1dGVDcmVhdGVSZXF1ZXN0KHJlcXVlc3QpXG5cdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRyZXN1bHQgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5vbkFmdGVyQ3JlYXRlQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMub25BZnRlckNyZWF0ZUNhbGxiYWNrKHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVzcG9uc2VzKTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIHRlc3QgY3JlYXRlIHJlcXVlc3RzXG5cdHByaXZhdGUgZXhlY3V0ZUNyZWF0ZVJlcXVlc3QgKFxuXHRcdHJlcXVlc3RSZXNvdXJjZTogQ3JlYXRlUmVxdWVzdEVudHJ5PGFueT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VNYXAgPSByZXNwb25zZS5tYXA7XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gcmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCk7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXMgPSByZXF1ZXN0UmVzb3VyY2UuaXRlbXM7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLnJlcXVlc3QuY29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1FbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cmllc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3SXRlbUlkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRwYXJzZUludChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0XHRcdDEwLFxuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VNYXAsXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG5ld0l0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdFx0J0NyZWF0ZSBmYWlsZWQhJyxcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB3ZSdyZSBzdXJlIHRoZSBlbnRyeSBleGlzdHMsIGJlY2F1c2Ugb3RoZXJ3aXNlIHlvdSBjb3VsZG4ndCBzYXZlIGl0IGluIHRoZSBmaXJzdCBwbGFjZVxuXHRcdFx0XHRcdFx0XHRjb25zdCBsb2NhbEl0ZW1FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdFx0XHRsb2NhbEl0ZW1FbnRyeS5pdGVtSWQgPSBuZXdJdGVtSWQ7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tsb2NhbEl0ZW1FbnRyeS5pZF0gPSB0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmNvcHlUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tsb2NhbEl0ZW1FbnRyeS5pZF0sXG5cdFx0XHRcdFx0XHRcdFx0bG9jYWxJdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmFkZChsb2NhbEl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyQnlJdGVtSWQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZCksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbUVudHJ5Lml0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtRW50cnkuaXRlbVR5cGVdW25ld0l0ZW1JZF0gPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZpZWxkQ2hhbmdlQ2FsbGJhY2tzW2l0ZW1FbnRyeS5pdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtRW50cnkuaXRlbVR5cGVdW2l0ZW1JZF07XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdE51bWJlcihuZXdJdGVtSWQpLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBleHRlbmQgY29udmVyc2lvbiBtYXBcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHJlc3BvbnNlTWFwKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gcmVzcG9uc2VNYXBbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV1baXRlbUlkXSA9IHJlc3BvbnNlTWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLnRvQXJyYXkoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwYXJlbnQgPSBjb2xsZWN0aW9uRW50cnkucGFyZW50O1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Lml0ZW1JZCxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAobmV3UGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHBhcmVudC5pdGVtSWQgPSBuZXdQYXJlbnRJZDtcblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25DaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5nZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkub3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbGxlY3Rpb25DaGFuZ2VzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuc2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkNoYW5nZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCB1cGRhdGVkQ29sdW1uczoge1tjb2x1bW5JZDogc3RyaW5nXTogQ29sdW1uSW5mbzxhbnk+fSA9XG5cdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5nZXRVcGRhdGVkSXRlbUNvbHVtbnModGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwKTtcblxuXHRcdFx0XHRcdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHVwZGF0ZWRDb2x1bW5zKSkge1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHVwZGF0ZWRDb2x1bW5zLmlkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5vbkl0ZW1FbnRyaWVzQ3JlYXRlZChcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZVVwZGF0ZVJlcXVlc3RzIChcblx0XHRjb21waWxhdGlvbjogVXBkYXRlQ29tcGlsYXRpb24sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3RzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdHJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZVVwZGF0ZVJlcXVlc3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29tcGlsYXRpb25baXRlbVR5cGVdLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVxdWVzdHMpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlVXBkYXRlUmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IHtbaXRlbUlkOiBudW1iZXJdOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPn0sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3Q6IHtbaXRlbVR5cGU6IHN0cmluZ106IHtbaXRlbUlkOiBudW1iZXJdOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+fX0gPSB7fTtcblx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB2ZXJpZnkgaWYgd2Ugc2hvdWxkIGNhbGwgZ2V0Q29sbGVjdGlvbk1hdGNoZXIgb24gU2VydmVyQ2FjaGUgb3IgVHJhbnNhY3Rpb25DYWNoZVxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5nZXRDb2xsZWN0aW9uTWF0Y2hlcigpO1xuXG5cdFx0cmVxdWVzdFtpdGVtVHlwZV0gPSB7fTtcblxuXHRcdC8vIHdlIG5lZWQgdG8gZG8gdGhlIGZvcm1hdFJlcXVlc3QgY2FsbCBoZXJlIChmaWVsZHMgbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQpXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyaWVzW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBpdGVtUmVxdWVzdDogYW55ID0gcmVxdWVzdFtpdGVtVHlwZV1baXRlbUlkXSA9IHt9O1xuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhdGgoXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24udGFiUmVxdWVzdFBhcmFtZXRlcnMsXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdF0sXG5cdFx0XHQpO1xuXG5cdFx0XHRpdGVtUmVxdWVzdC52YWx1ZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZvcm1hdFJlcXVlc3QoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpdGVtUmVxdWVzdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdENvbHVtbnMuZXhwYW5kKGl0ZW1FbnRyeS5jb2x1bW5zKTtcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gdGVzdFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXIuZXhwYW5kKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMgPSBjb2xsZWN0aW9uTWF0Y2hlci5nZXRDb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbiBvZiBjb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5zLmV4cGFuZChjb2xsZWN0aW9uLmNvbHVtbnMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFwaVJlcXVlc3RDb2x1bW5zID0gcmVxdWVzdENvbHVtbnMuZ2V0KCk7XG5cblx0XHRyZXR1cm4gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnVwZGF0ZUl0ZW1zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdCxcblx0XHRcdFx0YXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4gdGhpcy5zZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0YXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0KSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZURlbGV0ZVJlcXVlc3RzIChcblx0XHRjb21waWxhdGlvbjogRGVsZXRlQ29tcGlsYXRpb24sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3RzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPHZvaWQ+PiA9IFtdO1xuXG5cdFx0Ly8gY2xlYXJpbmcgbm90IG5lY2Vzc2FyeVxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdHJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZURlbGV0ZVJlcXVlc3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29tcGlsYXRpb25baXRlbVR5cGVdLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVxdWVzdHMpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlRGVsZXRlUmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cmllcy5tYXAoXG5cdFx0XHRcdFx0ZW50cnkgPT4gZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VJZEFycmF5ID0gcmVzcG9uc2UuaXRlbXM7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXNUb0JlRGVsZXRlZDogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdCFpbkFycmF5KFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VJZEFycmF5LFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdCdEZWxldGUgZmFpbGVkIScsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpdGVtRW50cmllc1RvQmVEZWxldGVkLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbXNEZWxldGVkKGl0ZW1FbnRyaWVzVG9CZURlbGV0ZWQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZU1vdmVSZXF1ZXN0cyAoXG5cdFx0Y29tcGlsYXRpb246IE1vdmVDb21waWxhdGlvbixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdHM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8dm9pZD4+ID0gW107XG5cblx0XHRjb25zdCBleGVjdXRlTW92ZVJlcXVlc3QgPSAoXG5cdFx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0KSA9PiB7XG5cdFx0XHQvLyBvbmx5IHRoZSBwYXJlbnQgaWQgY291bGQgaGF2ZSBiZWVuIHVwZGF0ZWRcblx0XHRcdGNvbnN0IGNvbXBpbGF0aW9uRW50cmllcyA9IGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdW3BhcmVudElkXTtcblx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXF1ZXN0cy5wdXNoKFxuXHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHRcdFx0Lm1vdmVJdGVtcyhcblx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRuZXdQYXJlbnRJZCAhPT0gdW5kZWZpbmVkID8gbmV3UGFyZW50SWQgOiBwYXJlbnRJZCxcblx0XHRcdFx0XHRcdHRoaXMuYnVpbGRNb3ZlUmVxdWVzdChjb21waWxhdGlvbkVudHJpZXMpLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdFx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSB3aHkgZG9uJ3Qgd2UgdXNlIHRoZSByZXNwb25zZSA/XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNvbXBpbGF0aW9uRW50cmllcykge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZTogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtSWQ6IG5ld1BhcmVudElkICE9PSB1bmRlZmluZWQgPyBuZXdQYXJlbnRJZCA6IHBhcmVudElkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRUeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdKSB7XG5cdFx0XHRcdGV4ZWN1dGVNb3ZlUmVxdWVzdChcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdCtwYXJlbnRJZCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVxdWVzdHMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtQ2FjaGVGYWN0b3J5LCBJdGVtRW50cnlGYWN0b3J5LCBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL0FwaUZvcm1hdHRlcic7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlLCBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9Db2x1bW5JbmZvJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSB9IGZyb20gJy4uL0NyZWF0ZWRDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUNhY2hlIH0gZnJvbSAnLi4vSXRlbUNhY2hlJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcyB9IGZyb20gJy4vc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyB9IGZyb20gJy4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25JdGVtSGFuZGxlcic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJdGVtSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyByZWFkb25seSBlbnRyaWVzOiBJdGVtQ2FjaGU7XG5cdHB1YmxpYyBhYnN0cmFjdCBpdGVtQ2hhbmdlczogU2VydmVySXRlbUVudHJ5Q2hhbmdlcyB8IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcztcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcm90ZWN0ZWQgaXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmVudHJpZXMgPSBpdGVtQ2FjaGVGYWN0b3J5LmNvbnN0cnVjdCh0aGlzLnRyYW5zYWN0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ29waWVzIHRoZSBwYXNzZWQgSXRlbUVudHJ5Q2hhbmdlcyBpbnRvIGEgZm9ybWF0IHRoZSBpbXBsZW1lbnRpbmcgSXRlbUhhbmRsZXIgY2FuIHB1dCBpbiBoaXMgSXRlbUNoYW5nZXNcblx0ICogQHBhcmFtIGl0ZW1FbnRyeUNoYW5nZXNcblx0ICogQHBhcmFtIGVudHJ5XG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdCk7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBJdGVtRW50cmllcyBmb3IgdGhlIGdpdmVuIHF1ZXJ5LCBkb2VzIG5vdCBsb29rIGluIHRoZSBjYWNoZSwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBJdGVtSWRzIGJlbG9uZyB0byB0aGUgcXVlcnkgIVxuXHQgKlxuXHQgKiB0b2RvOiBXZSBjb3VsZCBzdG9yZSBjb2xsZWN0aW9ucyBieSB0aGVpciBxdWVyeSBzdHJpbmcsIGFuZCB0aGVuIHNlZSBpZiB0aGUgcXVlcnkgaXMgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgSXRlbUVudHJpZXMgZm9yIHRoZSBnaXZlbiBJdGVtSWRzXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbiBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gaXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUHJvY2Vzc2VzIHRoZSBwYXNzZWQge0BsaW5rIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSB1cGRhdGUgZGVsdGF9IG9uIHRoZSB0cmFuc2FjdGlvbiwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlc1R1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEsXG5cdFx0Zm9yY2VPdmVyd3JpdGU6IGJvb2xlYW4sXG5cdFx0dXBkYXRlSW5pdGlhbDogYm9vbGVhbixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHRcdGNyZWF0ZUl0ZW1DaGFuZ2VzSWZOb25lRXhpc3Q6IGJvb2xlYW4sXG5cdCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBUcmF2ZXJzZXMgdGhlIGNvbHVtbiBwYXRoIGFuZCByZXR1cm5zIHRoZSBmaWVsZHMgb2YgdGhlIGRlcml2ZWQgaXRlbSwgcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGl0ZW0gaXNuJ3QgZm91bmRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgZGVyaXZlZCBpdGVtJ3MgdmFsdWVzIGFyZSBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZXMgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdLFxuXHQpOiBSZWFkb25seTxGaWVsZE1hcD4gfCB1bmRlZmluZWQge1xuXHRcdGxldCBkZXJpdmVkSXRlbUVudHJ5OiBJdGVtRW50cnkgfCB1bmRlZmluZWQgPSBpdGVtRW50cnk7XG5cdFx0bGV0IGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBvZiBjb2x1bW5QYXRoKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSBkZXJpdmVkSXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbZGVyaXZlZEl0ZW1FbnRyeS5pdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJyR7Y29sdW1uSWR9JyBub3QgZm91bmQgb24gZW50cnkgaW4gSXRlbVJlc291cmNlLmdldERlcml2ZWRWYWx1ZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29sdW1uLml0ZW1UeXBlID09PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke2NvbHVtbklkfScgZG9lc24ndCBoYXZlIGNoaWxkcmVuIGluIEl0ZW1SZXNvdXJjZS5nZXREZXJpdmVkVmFsdWVgKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaXRlbUlkID0gZmllbGRzW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGl0ZW1JZCA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXJpdmVkSXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkKFxuXHRcdFx0XHRjb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChkZXJpdmVkSXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBEZXJpdmVkIGl0ZW1FbnRyeSAke2NvbHVtbi5pdGVtVHlwZX06JHtpdGVtSWR9IGNvdWxkbid0IGJlIGZvdW5kYCk7XG5cdFx0XHR9XG5cblx0XHRcdGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0ZGVyaXZlZEl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaWVsZHM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW5QYXRoLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcGF0aCBjb3VsZG4ndCBiZSB0cmF2ZXJzZWRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgcm9vdCBlbnRyeSB0byBzdGFydCB0aGUgcGF0aCBmcm9tXG5cdCAqIEBwYXJhbSBjb2x1bW5QYXRoIENhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgY29sdW1uSWRzIChbJ2NvbHVtbicsICdjb2x1bW4yJ10pIG9yIGEgY29uZmlnIGNvbHVtbiBzdHJpbmcgKCdjb2x1bW4+Y29sdW1uMicpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlPFQgZXh0ZW5kcyBhbnkgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRjb2x1bW5QYXRoOiBzdHJpbmdbXSB8IHN0cmluZyxcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHR5cGVvZiBjb2x1bW5QYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y29sdW1uUGF0aCA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZUNvbmZpZ0NvbHVtbihjb2x1bW5QYXRoKTtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZHMgPSB0aGlzLmdldERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLnNsaWNlKFxuXHRcdFx0XHQwLFxuXHRcdFx0XHQtMSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmllbGRzW2NvbHVtblBhdGhbY29sdW1uUGF0aC5sZW5ndGggLSAxXV07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENsZWFycyB0aGUgZW50cnkgZnJvbSB0aGlzIHRyYW5zYWN0aW9uLCByZW1vdmluZyBpdCBmcm9tIHRoZSB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX0gYW5kIHJlbW92aW5nIGFsbCBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtRW50cnkgKGVudHJ5OiBJdGVtRW50cnkpOiB2b2lkIHtcblx0XHR0aGlzLmVudHJpZXMuY2xlYXIoZW50cnkpO1xuXHRcdGRlbGV0ZSB0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVjdXJzaXZlbHkgZmV0Y2hlcyBkZXJpdmVkIHZhbHVlcyBhcyBzZXBhcmF0ZSByZXF1ZXN0cywgaW5zdGVhZCBvZiBhcyBjb2x1bW5zIG9mIGEgcHJpbWFyeSBpdGVtXG5cdCAqIENhbiBiZSB1c2VkIHdoZW4gZGVyaXZlZCB2YWx1ZXMgb2YgYSBsb2NhbCBpdGVtIGhhdmUgdG8gYmUgZmV0Y2hlZCwgc2luY2UgYSBsb2NhbCBpdGVtIGNhbid0IGJlIHVzZWQgYXMgcm9vdCBpdGVtIG9mIGEgcXVlcnlcblx0ICovXG5cdHB1YmxpYyBmZXRjaERlcml2ZWRWYWx1ZXNCeUNvbHVtbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cm9vdENvbHVtbjogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+LFxuXHRcdGNoYW5nZXNEZWx0YT86IENoYW5nZXNEZWx0YUJhc2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZCB8IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGNoaWxkQ29sdW1ucyA9IHJvb3RDb2x1bW4uY2hpbGRyZW47XG5cblx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpcnN0Q2hpbGQgPSBjaGlsZENvbHVtbnNbMF07XG5cblx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiBmaXJzdENoaWxkLmFwaUNvbHVtbi50eXBlID09PSAnaWQnKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFlvdSBzaG91bGQgdXNlIGZpZWxkc1tjb2x1bW5JZF0gaW5zdGVhZCBvZiBkZXJpdmVkWydjb2x1bW5JZD5pZCddIHRvIGdldCB0aGUgaWQgb2YgYSBkZXJpdmVkIGl0ZW1gKTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtSWRNYXA6IHtbaXRlbUlkOiBzdHJpbmddOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWRCeUNvbHVtbihcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRyb290Q29sdW1uLFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoaXRlbUlkID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbUlkTWFwW2l0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpdGVtSWRNYXBbaXRlbUlkXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRpdGVtSWRNYXBbaXRlbUlkXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKGl0ZW1JZE1hcCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtSWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbUlkTWFwKSB7XG5cdFx0XHRpdGVtSWRzLnB1c2goK2l0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY2hpbGRDb2x1bW5zKSB7XG5cdFx0XHRjb2x1bW5JZHMucHVzaChjb2x1bW4uaWQpO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIHdlIGhhdmUgdGhlc2UgdmFsdWVzIGNhY2hlZCBhbHJlYWR5XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoSXRlbUVudHJpZXMoXG5cdFx0XHRcdHJvb3RDb2x1bW4uaXRlbVR5cGUhLFxuXHRcdFx0XHRpdGVtSWRzLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyh7Y29sdW1uczogY29sdW1uSWRzfSksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0XHRjaGlsZENvbHVtbnMsXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlRGVyaXZlZFZhbHVlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pixcblx0XHRjaGFuZ2VzRGVsdGE/OiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLmZldGNoRGVyaXZlZFZhbHVlc0J5Q29sdW1uKFxuXHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdGNvbHVtbixcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiBpdGVtRW50cmllcyxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gZnJvbSB0aGUgcGFzc2VkIHtAbGluayBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhfSBhbmQgc3RvcmVzIGl0IGluIHRoaXMgdHJhbnNhY3Rpb24ncyB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX1cblx0ICovXG5cdHByb3RlY3RlZCBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtRW50cnlGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGNyZWF0ZVR1cGxlLml0ZW1JZCxcblx0XHRcdGNyZWF0ZVR1cGxlLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZW50cmllcy5hZGQoaXRlbUVudHJ5KTtcblxuXHRcdHJldHVybiBpdGVtRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4sIHdpbGwgbG9vayBpbnRvIHRoZSBjdXJyZW50IGRlbHRhIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXRlbUNoYW5nZXNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRJdGVtSWRCeUNvbHVtbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlc0RlbHRhPzogQ2hhbmdlc0RlbHRhQmFzZSxcblx0KTogSXRlbUlkIHtcblx0XHRpZiAoY29sdW1uLmxldmVsID09PSAwKSB7XG5cdFx0XHRpZiAoY2hhbmdlc0RlbHRhICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdLmNoYW5nZXMuZmllbGRzW2NvbHVtbi5wYXRoXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShpdGVtRW50cnkuaWQpW2NvbHVtbi5wYXRoXTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB2YWxpZGF0ZSBpZiB0aGlzIGFsc28gd29ya3MgZm9yIGRlZXBlciBsZXZlbHNcblx0XHQvLyBXZSBjb3VsZCBhbHNvIGNhbGwgZ2V0RGVyaXZlZFZhbHVlIGFuZCB1cGRhdGUgdGhhdCBmdW5jdGlvbiB0byBhY2NlcHQgYSBDaGFuZ2VzRGVsdGEgd2hpY2ggaGFzIHByZWNlZGVuY2Ugb3ZlciAnZmllbGRzJ1xuXG5cdFx0Y29uc3QgcGFyZW50SXRlbUlkID0gdGhpcy5nZXRJdGVtSWRCeUNvbHVtbihcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGNvbHVtbi5wYXJlbnQhLFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwYXJlbnRJdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQoXG5cdFx0XHRjb2x1bW4ucGFyZW50IS5pdGVtVHlwZSEsXG5cdFx0XHRwYXJlbnRJdGVtSWQsXG5cdFx0KSE7XG5cblx0XHRpZiAoY2hhbmdlc0RlbHRhICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbcGFyZW50SXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbcGFyZW50SXRlbUVudHJ5LmlkXS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkocGFyZW50SXRlbUVudHJ5LmlkKVtjb2x1bW4uaWRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIGV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1ucz86IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1ucyB7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkQ29sbGVjdGlvbkNvbHVtbnMgPSAodHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUpID0+IHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMucXVlcnlDb2x1bW5zLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGNhbiByZW1vdmUgdGhpcyB3aGVuIHdlIHJlZmFjdG9yIHRoZSBmZXRjaGluZyBvZiByZXF1aXJlZCBjb2xsZXRpb24gY29sdW1ucyBBRlRFUiB0aGUgbWF0Y2hpbmdcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgYWRkVHJhbnNhY3Rpb25DaGlsZHJlbkNvbGxlY3Rpb25Db2x1bW5zID0gKGNoaWxkcmVuOiBBYnN0cmFjdENhY2hlW10pID0+IHtcblx0XHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgY2hpbGRyZW4pIHtcblx0XHRcdFx0YWRkQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24pO1xuXHRcdFx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24uY2hpbGRyZW4pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCB0cmFuc2FjdGlvbkNoYWluID0gdGhpcy50cmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkNoYWluKCk7XG5cblx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIHRyYW5zYWN0aW9uQ2hhaW4pIHtcblx0XHRcdGFkZENvbGxlY3Rpb25Db2x1bW5zKHRyYW5zYWN0aW9uKTtcblx0XHR9XG5cblx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModGhpcy50cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXJEZXBlbmRlbmN5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2x1bW5FeHBhbnNpb25SZXN1bHQsXG5cdERlcmVnRnVuY3Rpb24sXG5cdEZpZWxkQ2hhbmdlQ2FsbGJhY2ssXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlLCBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEsIENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHtcblx0Q2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHRDb2x1bW5JbmZvLFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Y3JlYXRlUGF0aCxcblx0aGFzUHJvcGVydGllcyxcblx0U2VydmVyQ2FjaGUsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEl0ZW1IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0l0ZW1IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVmFsaWRhdG9yIH0gZnJvbSAnLi9UcmFuc2FjdGlvblZhbGlkYXRvcic7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbiBhIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9ufSBvbmx5IGxvY2FsIGl0ZW1zIGNhbiBiZSBzdG9yZWQsIHNvIGFsbCBlbnRyaWVzIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgdGhpcy5lbnRyaWVzfSBhcmUgbG9jYWxcbiAqIElmIGEgbm9uLWxvY2FsIGVudHJ5IGlzIHJlcXVlc3RlZCBpdCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIgU2VydmVySXRlbUhhbmRsZXJ9IHdoaWNoIHdpbGwgZmV0Y2hDb2xsZWN0aW9uRW50cnkgdGhlIGVudHJ5IGZyb20gdGhlIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRleHRlbmRzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHRoaXMgYmUge1tpdGVtVHlwZTogc3RyaW5nXToge1tpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5fX0gZm9yIHF1aWNrIGxvb2t1cCA/XG5cdHB1YmxpYyBkZWxldGVkSXRlbXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdHB1YmxpYyBpdGVtQ2hhbmdlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgZmllbGRDaGFuZ2VDYWxsYmFja3M6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFtpdGVtSWQ6IHN0cmluZ106IEZpZWxkQ2hhbmdlQ2FsbGJhY2tbXVxuXHRcdH1cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGRlcGVuZGVuY2llczogVHJhbnNhY3Rpb25JdGVtSGFuZGxlckRlcGVuZGVuY3lJbnRlcmZhY2UsXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdHByaXZhdGUgdmFsaWRhdG9yPzogVHJhbnNhY3Rpb25WYWxpZGF0b3IsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbHVtblV0aWwsXG5cdFx0XHRkZXBlbmRlbmNpZXMuYXBpRm9ybWF0dGVyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLml0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRkZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyRmllbGRDaGFuZ2VDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y2FsbGJhY2s6IEZpZWxkQ2hhbmdlQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPixcblx0KTogRGVyZWdGdW5jdGlvbiB7XG5cdFx0Y3JlYXRlUGF0aChcblx0XHRcdHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3MsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0W10sXG5cdFx0XHRdLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkQ2hhbmdlQ2FsbGJhY2tzW2l0ZW1UeXBlXVtpdGVtSWRdLnB1c2goY2FsbGJhY2spO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtVHlwZV1baXRlbUlkXS5pbmRleE9mKGNhbGxiYWNrKTtcblxuXHRcdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbVR5cGVdW2l0ZW1JZF0uc3BsaWNlKFxuXHRcdFx0XHRpbmRleCxcblx0XHRcdFx0MSxcblx0XHRcdCk7XG5cblx0XHRcdGlmICh0aGlzLmZpZWxkQ2hhbmdlQ2FsbGJhY2tzW2l0ZW1UeXBlXVtpdGVtSWRdLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbVR5cGVdKSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5maWVsZENoYW5nZUNhbGxiYWNrc1tpdGVtVHlwZV07XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBjb3B5VHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzIChcblx0XHRpdGVtRW50cnlDaGFuZ2VzOiBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0KTogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aW5pdGlhbDogdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdFx0aXRlbUVudHJ5Q2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0ZW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0KSxcblx0XHRcdGNoYW5nZXM6IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGl0ZW1FbnRyeUNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCksXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gc3VwZXIuY3JlYXRlSXRlbUVudHJ5KGNyZWF0ZVR1cGxlKTtcblx0XHRjb25zdCBkZWZhdWx0TG9jYWxDaGFuZ2VzID0gdGhpcy5kZXBlbmRlbmNpZXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdExvY2FsQ2hhbmdlcykge1xuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRMb2NhbENoYW5nZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0e30sXG5cdFx0XHRjcmVhdGVUdXBsZS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdGluaXRpYWw6IGNyZWF0ZVR1cGxlLmZpZWxkcyxcblx0XHRcdGNoYW5nZXM6IGNoYW5nZXMsXG5cdFx0fTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5pbml0aWFsLmlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcy5pZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy52YWxpZGF0b3IudmFsaWRhdGVJdGVtKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGNyZWF0ZVR1cGxlLmZpZWxkcyxcblx0XHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBsb2NhbCB7QGxpbmsgRmllbGRNYXAgY2hhbmdlc30gb2YgdGhlIHtAbGluayBJdGVtRW50cnkgZW50cnl9IG9uIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn0gaW4gYSBmb3JtYXR0ZWQgd2F5IHRoZSBBUEkgYWNjZXB0c1xuXHQgKi9cblx0cHVibGljIGZvcm1hdFJlcXVlc3Q8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHQpOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3QgbWFpbkNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLm1haW47XG5cblx0XHRpZiAoZW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVxdWVzdExvY2FsKFxuXHRcdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0XHRtYWluQ29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlcXVlc3QoXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5pbml0aWFsLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcyxcblx0XHRcdG1haW5Db2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGV0ZWN0Q2hhbmdlcyAoKTogYm9vbGVhbiB7XG5cdFx0Ly8gaWYgYW4gZW50cnkgaXMgaW4gdGhpcyB0cmFuc2FjdGlvbidzIGNhY2hlIGl0J3MgYSBsb2NhbCBvbmUsIHdoaWNoIGNvdW50cyBhcyBhIGNoYW5nZVxuXHRcdGZvciAoY29uc3QgX2l0ZW1FbnRyeUlkIGluIHRoaXMuZW50cmllcy5lbnRyaWVzQnlFbnRyeUlkKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHRoaXMuZGVsZXRlZEl0ZW1zKSB7XG5cdFx0XHRpZiAodGhpcy5kZWxldGVkSXRlbXNbaXRlbVR5cGVdLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiB0aGlzLml0ZW1DaGFuZ2VzKSB7XG5cdFx0XHRjb25zdCBoYXNDaGFuZ2VzID0gdGhpcy5kZXRlY3RFbnRyeUNoYW5nZXMoTnVtYmVyKGl0ZW1FbnRyeUlkKSk7XG5cblx0XHRcdGlmIChoYXNDaGFuZ2VzKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgY2hhbmdlcyBmb3IgdGhlIHBhc3NlZCB7QGxpbmsgSXRlbUVudHJ5LmlkIEl0ZW1FbnRyeUlkfVxuXHQgKlxuXHQgKiAtLS0tLVxuXHQgKiBAcmVtYXJrc1xuXHQgKiBDb21wYXJlcyBldmVyeSBmaWVsZCAob2YgdGhlIGVudHJ5KSBpbiB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5pdGVtQ2hhbmdlcyBpdGVtQ2hhbmdlc30gd2l0aCB0aGUgaW5pdGlhbCBmaWVsZHMsIGJlY2F1c2UgZmllbGRzIGFyZSBjb3BpZWQgb3ZlciB3aGVuIGNyZWF0aW5nIGEgcmVzb3VyY2UgaGF2aW5nIHNvbWV0aGluZyBpbiBpdGVtQ2hhbmdlcyBkb2Vzbid0IGFjdHVhbGx5IG1lYW4gdGhhdCB0aGVyZSBhcmUgY2hhbmdlcyAoanVzdCB0aGF0IGEgcmVzb3VyY2UgaGFzIGJlZW4gbWFkZSlcblx0ICovXG5cdHB1YmxpYyBkZXRlY3RFbnRyeUNoYW5nZXMgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pOiBib29sZWFuIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKSE7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRjaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRjaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFByb2Nlc3NlcyBvbiBhIGNhY2hlZCBlbnRyeSwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQsIHVubGVzcyBmb3JjZU92ZXJ3cml0ZSBpcyBzZXRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeUNoYW5nZXNUdXBsZSBUaGUgY2hhbmdlcyB0dXBsZVxuXHQgKiBAcGFyYW0gZm9yY2VPdmVyd3JpdGUgSW5zdGVhZCBvZiBjYWxsaW5nIHtAbGluayBBcGlGb3JtYXR0ZXIubWVyZ2VDb3B5RmllbGRzIG1lcmdlQ29weUZpZWxkc30sIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBjb3B5RmllbGRzfSB3aWxsIGJlIHVzZWQgKGJlY2F1c2UgQVBJIHZhbHVlcyBhcmUgYWx3YXlzIHJpZ2h0KVxuXHQgKiBAcGFyYW0gdXBkYXRlSW5pdGlhbCBTaG91bGQgYmUgYHRydWVgIGlmIGNhbGxlZCBieSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG5cdCAqIEBwYXJhbSBpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlIEluZGljYXRlcyB0aGF0IHRoZSBjaGFuZ2UgaXMgZG9uZSBieSBhIGRpZmZlcmVudCB1c2VyXG5cdCAqIEBwYXJhbSBjcmVhdGVJdGVtQ2hhbmdlc0lmTm9uZUV4aXN0IElzIGB0cnVlYCB3aGVuIGNhbGxlZCBmcm9tIGBhcHBseUNoYW5nZXNEZWx0YWAsIHdlIGNhbiBhc3N1bWUgdGhhdCB3aGVuIHlvdSBjYWxsIGBhcHBseUNoYW5nZXNEZWx0YWAgd2l0aCB1cGRhdGVzIHRoYXQgYXJlbid0IG9uIHRoZSB0cmFuc2FjdGlvbiB5ZXQgeW91IHdhbnQgdG8gYWRkIHRob3NlXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIFRoZSBwcmV2aW91cyBjaGFuZ2VzIHtAbGluayBGaWVsZE1hcCBGaWVsZE1hcH1cblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXNUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Zm9yY2VPdmVyd3JpdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHR1cGRhdGVJbml0aWFsOiBib29sZWFuID0gZmFsc2UsXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGNyZWF0ZUl0ZW1DaGFuZ2VzSWZOb25lRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHQvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZXNlIGl0ZW1zIGNhY2hlZCAgd2UgZG9uJ3QgbmVlZCB0byBtZXJnZS9jb3B5IGFueXRoaW5nXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIWNyZWF0ZUl0ZW1DaGFuZ2VzSWZOb25lRXhpc3QpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdFx0aW5pdGlhbDogdGhpcy50cmFuc2FjdGlvbi5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KGl0ZW1FbnRyeS5pZCksXG5cdFx0XHRcdGNoYW5nZXM6IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShpdGVtRW50cnkuaWQpLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgIT09IG51bGwpIHtcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zID0gY2hhbmdlcy5leHBhbmRlZENvbHVtbnMubWVyZ2VkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdGNvbnN0IHByZXZpb3VzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0e30sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNVcGRhdGVkRmllbGRzID0gdGhpcy5hcGlGb3JtYXR0ZXIuaGFzQ2hhbmdlcyhcblx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXG5cdFx0aWYgKGZvcmNlT3ZlcndyaXRlKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5tZXJnZUNvcHlGaWVsZHMoXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0Y2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICh1cGRhdGVJbml0aWFsKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzLmZpZWxkcy5kaXNwbGF5bmFtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuZXdEaXNwbGF5TmFtZSA9IHRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0RGlzcGxheU5hbWUoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAobmV3RGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5kaXNwbGF5bmFtZSA9IG5ld0Rpc3BsYXlOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNVcGRhdGVkRmllbGRzKSB7XG5cdFx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUl0ZW0oXG5cdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvbkNoYW5nZUNhbGxiYWNrcyA9IHRoaXMuZmllbGRDaGFuZ2VDYWxsYmFja3NbaXRlbUVudHJ5Lml0ZW1UeXBlXT8uW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXG5cdFx0XHRpZiAob25DaGFuZ2VDYWxsYmFja3MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIG9uQ2hhbmdlQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdGNvbHVtbklkID0+IHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbaXRlbUVudHJ5Lml0ZW1UeXBlXVtjb2x1bW5JZF0udHlwZSxcblx0XHRcdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlc1tjb2x1bW5JZF0sXG5cdFx0XHRcdFx0XHRcdFx0cHJldmlvdXNbY29sdW1uSWRdLFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcHJldmlvdXM7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IEl0ZW1JZFtdIHtcblx0XHQvLyB0aGUgdGhlIGl0ZW1zIG1pZ2h0IHJlZmVyZW5jZSBlYWNoIG90aGVyLCBzbyB1cGRhdGUgdGhlIGNvbnZlcnNpb24gbWFwIGZpcnN0XG5cdFx0dGhpcy5kZXBlbmRlbmNpZXMuY29udmVyc2lvbk1hcFNlcnZpY2UuYmF0Y2hFeHBhbmRDb252ZXJzaW9uTWFwKFxuXHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXN1bHQ6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0dGhpcy5jbG9uZUl0ZW1FbnRyeShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGNsb25lSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0c291cmNlRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fSxcblx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjaz86IE1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHQpOiBJdGVtSWQge1xuXHRcdGNvbnN0IHNvdXJjZUVudHJ5Q2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdHNvdXJjZUVudHJ5LmlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCBuZXdJdGVtSWQgPSB0aGlzLmRlcGVuZGVuY2llcy5jb252ZXJzaW9uTWFwU2VydmljZS5leHBhbmRDb252ZXJzaW9uTWFwKFxuXHRcdFx0c291cmNlRW50cnksXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRjb25zdCBmaWVsZHNDb3B5ID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHNvdXJjZUVudHJ5Q2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0c291cmNlRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHR0aGlzLmRlcGVuZGVuY2llcy5jb252ZXJzaW9uTWFwU2VydmljZS51cGRhdGVJdGVtVmFsdWVzKFxuXHRcdFx0ZmllbGRzQ29weSxcblx0XHRcdGZpZWxkc0NvcHksXG5cdFx0XHRzb3VyY2VFbnRyeS5jb2x1bW5zLml0ZW0sXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdHNvdXJjZUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRmaWVsZHNDb3B5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuX3NldEl0ZW1DcmVhdGVkKFxuXHRcdFx0bmV3SXRlbUlkLFxuXHRcdFx0ZmllbGRzQ29weSxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiBuZXdJdGVtSWQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKCF0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdFx0LmZldGNoSXRlbUVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoY2FjaGVkRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdoZW4gZXhwYW5kaW5nIGl0ZW1zIHdpdGggbmV3IGRhdGEgKHdoaWNoIGFyZW4ndCB0ZWNobmljYWxseSBjaGFuZ2VzKSBpdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdHJhbnNhY3Rpb24gdGhlIGl0ZW0gbGl2ZXMgb25cblx0XHRcdC8vIFdlIGRvIHRoZSBzYW1lIChidXQgZmFzdGVyKSBieSBza2lwcGluZyBzdHJhaWdodCB0byB0aGUgc2VydmVyIGNhY2hlIGZvciByZW1vdGUgaXRlbXNcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLnBhcmVudC5pdGVtSGFuZGxlci5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b3B0aW9ucy5jb2x1bW5zID0gdGhpcy5leHBhbmRDb2x1bW5zV2l0aENvbGxlY3Rpb25Db2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoTG9jYWxJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4gaXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgdGVtcGxhdGUgYW5kIGNyZWF0ZXMgYSBuZXcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9LCB3aWxsIGVycm9yIGlmIHRoZSBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gSXRlbUlkIGFscmVhZHkgZXhpc3RzXG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hOZXdJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCkgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVFeGlzdGluZ0xvY2FsSXRlbUVycm9yKGl0ZW1UeXBlKSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0bGV0IGNoYW5nZXNEZWx0YVJlc3VsdDogQ2hhbmdlc0RlbHRhUmVzdWx0O1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnRlbXBsYXRlQ2FjaGVcblx0XHRcdC5mZXRjaFRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRvcHRpb25zLnRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdFx0e1tpdGVtVHlwZV06IG9wdGlvbnMuY29sdW1uc30sXG5cdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRlbXBsYXRlID0+IHtcblx0XHRcdFx0XHQvLyBJdCBjb3VsZCBiZSB0aGF0IGZvciB3aGF0ZXZlciByZWFzb24gJ2ZldGNoTmV3SXRlbScgaXMgY2FsbGVkIGEgc2Vjb25kIHRpbWUgd2hpbGUgbG9hZGluZ1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5pdGVtQ3JlYXRlU2VydmljZS5wcm9jZXNzVGVtcGxhdGUoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0XHRcdFx0dGVtcGxhdGUsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfY2hhbmdlc0RlbHRhUmVzdWx0ID0+IHtcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGFSZXN1bHQgPSBfY2hhbmdlc0RlbHRhUmVzdWx0O1xuXG5cdFx0XHRcdFx0Y29uc3QgY3JlYXRlZEVudHJpZXNCeUl0ZW1UeXBlID0gY2hhbmdlc0RlbHRhUmVzdWx0LmNyZWF0ZWQucmVkdWNlKFxuXHRcdFx0XHRcdFx0KFxuXHRcdFx0XHRcdFx0XHRtYXA6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0XHRcdFx0XHQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKCFtYXAuaGFzT3duUHJvcGVydHkoaXRlbUVudHJ5Lml0ZW1UeXBlKSkge1xuXHRcdFx0XHRcdFx0XHRcdG1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID0gW107XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRtYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVDaGFuZ2VzRGVsdGEoKTtcblx0XHRcdFx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxhbnk+PiA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBtYXBJdGVtVHlwZSBpbiBjcmVhdGVkRW50cmllc0J5SXRlbVR5cGUpIHtcblx0XHRcdFx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlZEVudHJpZXNCeUl0ZW1UeXBlW21hcEl0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVkRW50cmllc0J5SXRlbVR5cGVbbWFwSXRlbVR5cGVdWzBdLmNvbHVtbnMucm9vdCxcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcyk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBjaGFuZ2VzRGVsdGFSZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgcmVtb3RlSXRlbUlkczogSXRlbUlkW10gPSBbXTtcblx0XHRjb25zdCBsb2NhbEl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpdGVtSWRzKSB7XG5cdFx0XHRpZiAodGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKSkge1xuXHRcdFx0XHRsb2NhbEl0ZW1JZHMucHVzaChpdGVtSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVtb3RlSXRlbUlkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwoe1xuXHRcdFx0XHRyZW1vdGU6IHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHRcdC5pdGVtSGFuZGxlclxuXHRcdFx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRyZW1vdGVJdGVtSWRzLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRsb2NhbDogdGhpcy5mZXRjaExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0bG9jYWxJdGVtSWRzLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCksXG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdC5yZW1vdGUuY29uY2F0KHJlc3VsdC5sb2NhbCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gbW92ZSB0byBUcmFuc2FjdGlvbkNhY2hlID9cblx0cHVibGljIGZldGNoVGl0bGUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxzdHJpbmc+IHtcblx0XHRjb25zdCB0aXRsZUZpZWxkID0gdGhpcy5kZXBlbmRlbmNpZXMuaXRlbUVudHJ5U2VydmljZS5nZXRUaXRsZUZpZWxkKGl0ZW1UeXBlKTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKHtcblx0XHRcdFx0XHRjb2x1bW5zOiBbdGl0bGVGaWVsZF0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gY2hhbmdlc1t0aXRsZUZpZWxkXTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlTG9jYWxJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoY29sdW1uU3Vic2V0Q2FjaGUucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbkRpZmZlcmVuY2UgPSB0aGlzLmdldENvbHVtbkRpZmZlcmVuY2UoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5IYW5kbGVyXG5cdFx0XHQuZmV0Y2goXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uRGlmZmVyZW5jZSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRbaXRlbUVudHJ5XSxcblx0XHRcdFx0XHRcdGNvbHVtbkRpZmZlcmVuY2UsXG5cdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IGl0ZW1FbnRyeSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRMb2NhbEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGlmIChpdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oaXRlbUVudHJpZXMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuZGVwZW5kZW5jaWVzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGNvbHVtbkV4cGFuc2lvbi5ydW4oaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHRpZiAoZXhwYW5zaW9uUmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJ5KFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZXhwYW5zaW9uUmVzdWx0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlRGVyaXZlZFZhbHVlcyhcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uLmFnZ3JlZ2F0ZVJvb3RDb2x1bW5zKCksXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgZGF0YSBmb3IgdGhlIHBhc3NlZCBJdGVtVHlwZS9JdGVtSWQvY29sdW1ucywgaXMgYWJsZSB0byBmZXRjaENvbGxlY3Rpb25FbnRyeSBub24tbG9jYWwgZGVyaXZlZCB2YWx1ZXMuXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgdGhlIEl0ZW1FbnRyeSB3aXRoIHRoZSBnaXZlbiBJdGVtVHlwZS1JdGVtSWQgaXMgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBmZXRjaExvY2FsSXRlbUVudHJ5RGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KSB7XG5cdFx0Y29uc3QgY2FjaGVkRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlc29sdmVMb2NhbEl0ZW1FbnRyeShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGNhY2hlZEVudHJ5LFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5kZXBlbmRlbmNpZXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRjb25zdCBpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbjogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlVW5mb3VuZExvY2FsSXRlbUVycm9yKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2hlbiBleHBhbmRpbmcgaXRlbXMgd2l0aCBuZXcgZGF0YSAod2hpY2ggYXJlbid0IHRlY2huaWNhbGx5IGNoYW5nZXMpIGl0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSB0cmFuc2FjdGlvbiB0aGUgaXRlbSBsaXZlcyBvblxuXHRcdFx0XHQvLyBXZSBkbyB0aGUgc2FtZSAoYnV0IGZhc3RlcikgYnkgc2tpcHBpbmcgc3RyYWlnaHQgdG8gdGhlIHNlcnZlciBjYWNoZSBmb3IgcmVtb3RlIGl0ZW1zXG5cdFx0XHRcdGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5mZXRjaExvY2FsSXRlbUVudHJ5RGF0YShcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAodGhpcy50cmFuc2FjdGlvbi5wYXJlbnQgaW5zdGFuY2VvZiBTZXJ2ZXJDYWNoZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIGxvb2tpbmcgZm9yIGxvY2FsIGVudHJpZXMgb24gdGhlIHNlcnZlckNhY2hlJyk7XG5cdFx0XHR9XG5cblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdCh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBhcyBUcmFuc2FjdGlvbkNhY2hlKS5pdGVtSGFuZGxlci5mZXRjaExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkc09uUGFyZW50VHJhbnNhY3Rpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IGl0ZW1JZHMubWFwKFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCA9PiB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQoXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0XHQpISxcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Q29sdW1uRGlmZmVyZW5jZSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5zIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5yZXF1ZXN0LFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KS5kaWZmZXJlbmNlO1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRMb2NhbEl0ZW1FbnRyeTxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdDogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBtYWluQ29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdC5kaWZmZXJlbmNlLm1haW47XG5cblx0XHRlbnRyeS5jb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uUmVzdWx0Lm1lcmdlZDtcblxuXHRcdGlmIChtYWluQ29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldExvY2FsVmFsdWVzKFxuXHRcdFx0ZW50cnksXG5cdFx0XHRtYWluQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHZhbHVlcykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRlbnRyeSxcblx0XHRcdHZhbHVlcyxcblx0XHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdCxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRMb2NhbFZhbHVlczxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChlbnRyeSk7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXSk7XG5cdFx0Y29uc3QgcmVzdWx0OiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cblx0XHRcdC8vIHBhcmVudCBjb2x1bW5zIG1pZ2h0IGFsc28gYmUgaW5jbHVkZWQgaW4gdGhlIGRpZmZlcmVuY2Vcblx0XHRcdGlmIChjaGFuZ2VzW2NvbHVtbklkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmFwaUNvbHVtbi50eXBlO1xuXG5cdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gY29sdW1uVHlwZSA9PT0gJ2xpbmsnICYmIHBhcmVudCAhPT0gbnVsbCA/XG5cdFx0XHRcdHBhcmVudC5pdGVtSWQgOlxuXHRcdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5nZXREZWZhdWx0VmFsdWUoY29sdW1uVHlwZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufVxuIiwiaW1wb3J0IHsgUm1Db3JlIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbUlkQ29udmVyc2lvbk1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2sgfSBmcm9tICcuLi9DaGFuZ2VzUHJvY2Vzc29yJztcbmltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IEl0ZW1DYWNoZSB9IGZyb20gJy4uL0l0ZW1DYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLCBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25WYWxpZGF0b3InO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDYWNoZSB7XG5cblx0cHVibGljIGNoaWxkcmVuOiBUcmFuc2FjdGlvbkNhY2hlW10gPSBbXTtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIgfCBTZXJ2ZXJJdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyIHwgU2VydmVyQ29sbGVjdGlvbkhhbmRsZXI7XG5cblx0cHVibGljIHBhcmVudDogQWJzdHJhY3RDYWNoZSB8IG51bGw7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgZGVwZW5kZW5jaWVzOiBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSxcblx0XHRwdWJsaWMgY29yZTogUm1Db3JlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDaGlsZCAoXG5cdFx0aWQ/OiBzdHJpbmcsXG5cdFx0dmFsaWRhdG9yRmFjdG9yeT86IFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSxcblx0KTogVHJhbnNhY3Rpb25DYWNoZSB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25DYWNoZShcblx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLFxuXHRcdFx0dGhpcy5jb3JlLFxuXHRcdFx0dGhpcyxcblx0XHRcdGlkLFxuXHRcdFx0dmFsaWRhdG9yRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKHRyYW5zYWN0aW9uKTtcblxuXHRcdHJldHVybiB0cmFuc2FjdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBvbkNoaWxkRGVzdHJveSAoY2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihjYWNoZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZShcblx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdDEsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbENvbGxlY3Rpb25FbnRyeUJ5UXVlcnlTdHJpbmcgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZml0IHRoZSBjb2xsZWN0aW9uJ3MgcXVlcnksIGNvcGllcyBvdmVyIHRoZSBjb2xsZWN0aW9uQ2hhbmdlcyBvbiBhbGwgdHJhbnNhY3Rpb25zIGluIHRoZSBjaGFpbi5cblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRDb2xsZWN0aW9uQ2hhbmdlc1JlY3Vyc2l2ZWx5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogSXRlbUVudHJ5W107XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoaXMgdHJhbnNhY3Rpb24gYW5kIGFsbCBwYXJlbnRzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNhY3Rpb25DaGFpbiAoKTogQWJzdHJhY3RDYWNoZVtdIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbnM6IEFic3RyYWN0Q2FjaGVbXSA9IFtdO1xuXHRcdGxldCB0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSA9IHRoaXM7XG5cblx0XHRkbyB7XG5cdFx0XHR0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG5cblx0XHRcdC8vIEB0cy1pZ25vcmUgd2hpbGUgbG9vcCB3aWxsIGJyZWFrXG5cdFx0XHR0cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uLnBhcmVudDtcblx0XHR9IHdoaWxlICh0cmFuc2FjdGlvbiAhPT0gbnVsbCk7XG5cblx0XHRyZXR1cm4gdHJhbnNhY3Rpb25zO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzIENvbGxlY3Rpb25DYWNoZX0gb2YgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudENvbGxlY3Rpb25FbnRyeUNhY2hlICgpOiBDb2xsZWN0aW9uQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgSXRlbUNhY2hlfSBvZiB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50SXRlbUVudHJ5Q2FjaGUgKCk6IEl0ZW1DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcztcblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGU7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsSXRlbUVudHJ5IChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtRW50cnlbJ2l0ZW1JZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQXBwbGllcyBjaGFuZ2VzIGZyb20gYSBjaGlsZCB0cmFuc2FjdGlvbiB0byBhIHBhcmVudFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUlkQ29udmVyc2lvbk1hcD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYSBwYXJlbnQgdHJhbnNhY3Rpb24sIHByb3BhZ2F0ZXMgY2hhbmdlcyBkb3dud2FyZHMgdG8gYWxsIGNoaWxkIGNhY2hlc1xuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIGNvcmVcblx0ICpcblx0ICogdG9kb1tjYWNoZV0gU2hvdWxkIHdlIHJlZmV0Y2ggZGVyaXZlZCB2YWx1ZXMganVzdCBsaWtlIGluIGFwcGx5Q2hhbmdlc0RlbHRhID9cblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCAoXG5cdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGE6IEludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlOiBib29sZWFuLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4sXG5cdCk6IHZvaWQ7XG5cblx0cHVibGljIGFic3RyYWN0IGdldFBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZnJvbUluaXRpYWw/OiBib29sZWFuLFxuXHRcdHByb3ZpZGVkRmllbGRzPzogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogRW50cnlQYXJlbnROdWxsO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvcHlGaWVsZHM/OiBib29sZWFuLFxuXHQpOiBGaWVsZE1hcDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQmVjYXVzZSB0aGUgYGl0ZW1DaGFuZ2VzYCBvYmplY3QgZGlmZmVycyBiZXR3ZWVuIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgU2VydmVySXRlbUhhbmRsZXJ9IGFuZCB0aGUge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgVHJhbnNhY3Rpb25JdGVtSGFuZGxlcn0gd2UgbmVlZCBhIGZ1bmN0aW9uIHRvIG5vcm1hbGlzZSB0aG9zZSB2YWx1ZXNcblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBTaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBjb3JlXG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4gfCBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD47XG5cblx0cHJvdGVjdGVkIGdldFBhcmVudEZyb21GaWVsZHM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogRW50cnlQYXJlbnROdWxsIHtcblx0XHRpZiAoZmllbGRzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtRW50cnkuY29sdW1ucy5saW5rICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpdGVtVHlwZTogaXRlbUVudHJ5LmNvbHVtbnMubGluay5hcGlDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogZmllbGRzW2l0ZW1FbnRyeS5jb2x1bW5zLmxpbmsuaWRdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSBpdGVtRW50cnkuY29sdW1ucy5yZXNwb25zZVtpdGVtRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0aWYgKFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLml0ZW10eXBlICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIHJlc3BvbnNlQ29sdW1ucy5pdGVtICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGl0ZW1UeXBlOiBmaWVsZHMuaXRlbXR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogZmllbGRzLml0ZW0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYXBwbHlDaGFuZ2VzRGVsdGEgZnJvbSBTZXJ2ZXJDYWNoZSBhbmQgVHJhbnNhY3Rpb25DYWNoZS4gQXBwbGllcyBjcmVhdGVzLCB1cGRhdGVzIGFuZCBtb3ZlcywgZG9lc24ndCBhcHBseSBkZWxldGVzXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgX2FwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KToge1xuXHRcdHJlc3VsdDogQ2hhbmdlc0RlbHRhUmVzdWx0LFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRyb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPixcblx0fSB7XG5cdFx0Ly8gV2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBDaGFuZ2VzRGVsdGEgdG8gYW4gSW50ZXJuYWxDaGFuZ2VzRGVsdGEgaW4gb3JkZXIgdG8gcGFzcyBpdCB0byB0aGUgQ29sbGVjdGlvbk1hdGNoZXIgYW5kIGNoaWxkIFRyYW5zYWN0aW9uc1xuXHRcdGNvbnN0IGludGVybmFsQ2hhbmdlc0RlbHRhID0gdGhpcy5kZXBlbmRlbmNpZXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNoYW5nZXNEZWx0YS5fcXVlcnlSZXN1bHRzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHF1ZXJ5U3RyaW5nIGluIGNoYW5nZXNEZWx0YS5fcXVlcnlSZXN1bHRzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5fc2V0UXVlcnlSZXN1bHQoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cXVlcnlTdHJpbmcsXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLl9xdWVyeVJlc3VsdHNbaXRlbVR5cGVdW3F1ZXJ5U3RyaW5nXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjcmVhdGVkRW50cmllczogQ2hhbmdlc0RlbHRhUmVzdWx0WydjcmVhdGVkJ10gPSBbXTtcblx0XHRjb25zdCByb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPiA9IFtdO1xuXG5cdFx0Ly8gV2Ugb25seSBjcmVhdGUgbmV3IGVudHJpZXMgb24gdGhlIGRpcmVjdCB0cmFuc2FjdGlvbiwgbm90IG9uIHRoZSBjaGlsZHJlblxuXHRcdGNoYW5nZXNEZWx0YS5jcmVhdGVkLmZvckVhY2goXG5cdFx0XHR0dXBsZSA9PiB7XG5cdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuY3JlYXRlSXRlbUVudHJ5KHR1cGxlKTtcblxuXHRcdFx0XHRjcmVhdGVkRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdHRoaXMuZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiByb2xsYmFja0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSksXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHR0dXBsZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0KTtcblxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0dHVwbGUuY2hhbmdlcy5leHBhbmRlZENvbHVtbnMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAocHJldmlvdXMgIT09IG51bGwpIHtcblx0XHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0dXBsZS5jaGFuZ2VzLnBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5wYXJlbnQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdoZW4gcm9sbGluZyBiYWNrIGEgZGVsdGEgd2UgY2FsbCBgc2V0SXRlbVVwZGF0ZWRgIHRvIHJlc3RvcmUgZGVsZXRpb25zXG5cdFx0XHRpZiAodGhpcy5pdGVtSGFuZGxlciBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIpIHtcblx0XHRcdFx0Y29uc3QgZGVsZXRlZEVudHJpZXMgPSB0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1t0dXBsZS5lbnRyeS5pdGVtVHlwZV07XG5cblx0XHRcdFx0aWYgKGRlbGV0ZWRFbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gZGVsZXRlZEVudHJpZXMuaW5kZXhPZih0dXBsZS5lbnRyeSk7XG5cblx0XHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0XHRkZWxldGVkRW50cmllcy5zcGxpY2UoXG5cdFx0XHRcdFx0XHRpbmRleCxcblx0XHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZXN1bHQ6IHtcblx0XHRcdFx0Y3JlYXRlZDogY3JlYXRlZEVudHJpZXMsXG5cdFx0XHRcdHJvbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgcm9sbGJhY2tEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZuIG9mIHJvbGxiYWNrRnVuY3Rpb25zKSB7XG5cdFx0XHRcdFx0XHRmbihyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEVuc3VyZXMgdGhhdCBmb3IgYWxsIHVwZGF0ZWQgaXRlbXMgaW4gdGhlIGRlbHRhIHRoZSByZXF1aXJlZCBkZXJpdmVkIHZhbHVlcyBhcmUgcHJlc2VudFxuXHQgKi9cblx0cHJvdGVjdGVkIGZldGNoVXBkYXRlZERlcml2ZWRWYWx1ZXNGcm9tRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdW10+IHtcblx0XHRjb25zdCBkZXJpdmVkUHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W10+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cdFx0XHRjb25zdCBjaGFuZ2VkUm9vdENvbHVtbnM6IENvbHVtbkluZm9bXSA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiB0dXBsZS5lbnRyeS5jb2x1bW5zLnJvb3QpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuZmllbGRzLmhhc093blByb3BlcnR5KGNvbHVtbi5pZClcblx0XHRcdFx0XHQmJiB0dXBsZS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdICE9PSB0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF0pW2NvbHVtbi5pZF1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y2hhbmdlZFJvb3RDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZFJvb3RDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVyaXZlZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0W3R1cGxlLmVudHJ5XSxcblx0XHRcdFx0XHRjaGFuZ2VkUm9vdENvbHVtbnMsXG5cdFx0XHRcdFx0Ly8gV2UgcGFzcyB0aGUgZGVsdGEgc28gdGhlIG5ldyByb290Q29sdW1uJ3MgdmFsdWVzIGFyZSByZWFkXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgbmV3IGRlcml2ZWQgdmFsdWVzIGV4aXN0IGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlLCBzaW5jZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gbWlnaHQgdXNlIHRoZSBuZXcgdmFsdWVzXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlLmFsbChkZXJpdmVkUHJvbWlzZXMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBYnN0cmFjdENhY2hlLCBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi8nO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcy8nO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gSXRlbVR5cGU+ID0ge1xuXHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0aXRlbTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0aXNNYXRjaDogYm9vbGVhbiB8ICdtYXliZSdcblx0fVxufTtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0cHJvdGVjdGVkIG1hcDoge1xuXHRcdFtjb2xsZWN0aW9uRW50cnlJZDogbnVtYmVyXToge1xuXHRcdFx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkVudHJ5XG5cdFx0XHRtYXRjaGVzOiBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXNcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdHByaXZhdGUgZ2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmQ8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5VHlwZSxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBxdWVyeU1hdGNoZXIgPSB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2V4cGFuZChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9PiBxdWVyeU1hdGNoZXIubWF0Y2hRdWVyeShjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0KSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NEZWx0YSAoaW50ZXJuYWxDaGFuZ2VzRGVsdGE6IEludGVybmFsQ2hhbmdlc0RlbHRhKTogdGhpcyB7XG5cdFx0Ly8gd2UgZG8gZGVsZXRpbmcgZmlyc3QgYmVjYXVzZSBpdCdzIHRoZSBsZWFzdCBleHBlbnNpdmUgb3BlcmF0aW9uXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzVG9CZURlbGV0ZWQgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXTtcblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZW50cmllc1RvQmVEZWxldGVkKSB7XG5cdFx0XHRcdHRoaXMuX2V4cGFuZChcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0Ly8gQ29sbGVjdGlvbnMgY2FuIG5ldmVyIGNvbnRhaW4gZGVsZXRlZCBpdGVtcyB0byB0aGV5J3JlIGFsd2F5cyBub3QgZml0dGluZ1xuXHRcdFx0XHRcdCgpID0+IGZhbHNlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdHR1cGxlLmZpZWxkcyxcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQodHVwbGUuZW50cnkpLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy5fZXhwYW5kKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHtcblx0XHRcdFx0XHRjb25zdCBtYXRjaGVySGludHMgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5fcXVlcnlSZXN1bHRzW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV07XG5cblx0XHRcdFx0XHRpZiAobWF0Y2hlckhpbnRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG1hdGNoZXJIaW50ID0gbWF0Y2hlckhpbnRzW2NvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmddO1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG1hdGNoZXJIaW50ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRcdFx0IXR1cGxlLmVudHJ5LmlzTG9jYWwoKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBtYXRjaGVySGludC5pbmRleE9mKHR1cGxlLmVudHJ5Lml0ZW1JZCkgIT09IC0xO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBxdWVyeU1hdGNoZXIubWF0Y2hRdWVyeShjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0KTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZCkge1xuXHRcdFx0Y29uc3QgbW92ZWQgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuX2V4cGFuZChcblx0XHRcdFx0bW92ZWQuZW50cnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9PiBjb2xsZWN0aW9uRW50cnkubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdFx0bW92ZWQudG8uaXRlbVR5cGUsXG5cdFx0XHRcdFx0bW92ZWQudG8uaXRlbUlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdGNvbnN0IGNoYW5nZXMgPSB7fTtcblx0XHRcdGNvbnN0IGNhY2hlZENoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdE51bWJlcihpdGVtRW50cnlJZCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgY29weUNoYW5nZSA9IChcblx0XHRcdFx0ZmllbGRzOiBGaWVsZE1hcCxcblx0XHRcdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcblx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKGRlc2MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0XHRcdGNoYW5nZXMsXG5cdFx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0XHRcdGRlc2MsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtbklkXSA9IGZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY2FjaGVkQ2hhbmdlcykge1xuXHRcdFx0XHRjb3B5Q2hhbmdlKFxuXHRcdFx0XHRcdGNhY2hlZENoYW5nZXMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdHVwbGUuY2hhbmdlcy5maWVsZHMpIHtcblx0XHRcdFx0Y29weUNoYW5nZShcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGNoYW5nZXMsXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KHR1cGxlLmVudHJ5KSxcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMuX2V4cGFuZChcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbWF0Y2hlckhpbnRzID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuX3F1ZXJ5UmVzdWx0c1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdFx0aWYgKG1hdGNoZXJIaW50cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtYXRjaGVySGludCA9IG1hdGNoZXJIaW50c1tjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nXTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVySGludCAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0XHRcdCF0dXBsZS5lbnRyeS5pc0xvY2FsKClcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlckhpbnQuaW5kZXhPZih0dXBsZS5lbnRyeS5pdGVtSWQpICE9PSAtMTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhc0ZpdHRpbmdJdGVtcyAobWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0aWYgKG1hdGNoZXNbaXRlbUlkXS5pc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByb3RlY3RlZCBfZXhwYW5kIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRtYXRjaEZ1bmN0aW9uOiAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4gfCAnbWF5YmUnLFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBtYXAgPSB0aGlzLm1hcDtcblx0XHRjb25zdCBpdGVtSWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLmdldENvbGxlY3Rpb25FbnRyaWVzKGl0ZW1FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5SWQgPSBjb2xsZWN0aW9uRW50cnkuaWQ7XG5cdFx0XHRsZXQgbWF0Y2hlcztcblxuXHRcdFx0aWYgKG1hcFtjb2xsZWN0aW9uRW50cnlJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtYXBbY29sbGVjdGlvbkVudHJ5SWRdID0ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb246IGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRtYXRjaGVzOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlcyA9IG1hcFtjb2xsZWN0aW9uRW50cnlJZF0ubWF0Y2hlcztcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gV2UgY291bGQgb3B0aW1pc2Ugc29tZSB0aGluZ3MgaGVyZSBieSBjaGVja2luZyBpZiB0cmFuc2FjdGlvbi5jb2xsZWN0aW9uQ2hhbmdlcyBhbHJlYWR5IGNvbnRhaW5zIGl0ZW1FbnRyeSwgaWYgdGhhdCdzIHRoZSBjYXNlIHdlIGRvbid0IGhhdmUgdG8gbWF0Y2ggYXQgYWxsXG5cdFx0XHQvLyBDdXJyZW50bHkgYWxyZWFkeSBleGlzdGluZyBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBpbiBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMgKGNoYW5nZXMuaW5kZXhPZihpdGVtRW50cnkpICE9PSAtMSlcblx0XHRcdGlmIChtYXRjaGVzW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlc1tpdGVtSWRdID0ge1xuXHRcdFx0XHRpdGVtOiBpdGVtRW50cnksXG5cdFx0XHRcdGlzTWF0Y2g6IG1hdGNoRnVuY3Rpb24oY29sbGVjdGlvbkVudHJ5KSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckJhc2UgfSBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlclxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGdldENvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zICgpOiBDb2xsZWN0aW9uRW50cnlbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uSWQgaW4gdGhpcy5tYXApIHtcblx0XHRcdGNvbnN0IG1hcEVudHJ5ID0gdGhpcy5tYXBbY29sbGVjdGlvbklkXTtcblxuXHRcdFx0aWYgKHRoaXMuaGFzRml0dGluZ0l0ZW1zKG1hcEVudHJ5Lm1hdGNoZXMpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKG1hcEVudHJ5LmNvbGxlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXMgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckJhc2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Rml0dGluZzogSXRlbUlkW10sXG5cdG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9jZXNzZXMgYSBkZWx0YSBhbmQgYWRkcyB0aGUgaXRlbXMgdG8gdGhlIHJpZ2h0IGNvbGxlY3Rpb25zLCB0aGlzIGlzIHRoZSBPTkxZIGNsYXNzIHRoYXQgc2hvdWxkIGNoYW5nZSBjb2xsZWN0aW9uIGl0ZW1zXG4gKlxuICogLS0tLS0tXG4gKlxuICogQHJlbWFya1xuICogVGhlIENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBhY2Nlc3MvbW9kaWZ5IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0J3MgT05MWSBjYWxsZWQgZnJvbSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yXG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdGdldENvbGxlY3Rpb25FbnRyaWVzOiAoaXRlbVR5cGU6IEl0ZW1UeXBlKSA9PiBDb2xsZWN0aW9uRW50cnlbXSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zIChcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbklkIGluIHRoaXMubWFwKSB7XG5cdFx0XHRjb25zdCBtYXBFbnRyeSA9IHRoaXMubWFwW2NvbGxlY3Rpb25JZF07XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBtYXBFbnRyeS5jb2xsZWN0aW9uO1xuXHRcdFx0Y29uc3QgZ3JvdXBlZEl0ZW1FbnRyaWVzID0gdGhpcy5ncm91cEl0ZW1FbnRyaWVzKG1hcEVudHJ5Lm1hdGNoZXMpO1xuXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLnJlbW92ZUl0ZW1FbnRyaWVzRnJvbUNvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5ub3RGaXR0aW5nLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLmZpdHRpbmcsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZ3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHRcdC5xdWVyeShcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0XHR7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IFsnaWQnXX0sXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBub3cgZXhhY3RseSBrbm93IHdoaWNoIG9mIHRoZSBtYXliZSBpdGVtcyBmaXRcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmZpbHRlcihcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiByZXNwb25zZS5saW5rc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPiAtMSxcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBncm91cEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBmaXR0aW5nOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0XHRjb25zdCBub3RGaXR0aW5nOiBJdGVtSWRbXSA9IFtdO1xuXHRcdGNvbnN0IG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIG1hdGNoZXMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gbWF0Y2guaXRlbTtcblx0XHRcdGNvbnN0IGlzTWF0Y2ggPSBtYXRjaC5pc01hdGNoO1xuXG5cdFx0XHRpZiAoaXNNYXRjaCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRmaXR0aW5nLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAoaXNNYXRjaCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0bm90Rml0dGluZy5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF5YmUucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRmaXR0aW5nOiBmaXR0aW5nLFxuXHRcdFx0bm90Rml0dGluZzogbm90Rml0dGluZyxcblx0XHRcdG1heWJlOiBtYXliZSxcblx0XHR9O1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWRDb252ZXJzaW9uTWFwLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSwgVHJhbnNhY3Rpb25FcnJvckxldmVsIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycgfCAnb25DbG9zZScgfCAnc2tpcE9uQ2xvc2UnO1xuXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlID0ge1xuXHRvbkJlZm9yZVNhdmU6ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSkgPT4gYW55LFxuXHRvblNhdmVTdWNjZXNzOiAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KSA9PiBhbnksXG5cdG9uU2V0SXRlbUVycm9yOiAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHRcdGtleTogc3RyaW5nLFxuXHQpID0+IHZvaWQsXG5cdG9uQ2xlYXJJdGVtRXJyb3I6IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0a2V5OiBzdHJpbmcsXG5cdCkgPT4gdm9pZCxcblx0b25TZXRHbG9iYWxFcnJvcjogKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGxldmVsOiBUcmFuc2FjdGlvbkVycm9yTGV2ZWwsXG5cdCkgPT4gdm9pZCxcblx0b25DbGVhckdsb2JhbEVycm9yOiAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdCkgPT4gdm9pZCxcbn07XG5cbnR5cGUgQ2FsbGJhY2tNYXA8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+ID0ge1xuXHRba2V5OiBzdHJpbmddOiB7XG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbVF0sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb25cblx0fVxufTtcblxuY29uc3QgREVGQVVMVF9QUklPUklUWSA9IDEwMDtcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyIHtcblxuXHRwcml2YXRlIGNhbGxiYWNrczoge1xuXHRcdFtUIGluIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVdOiBBcnJheTxbXG5cdFx0XHRudW1iZXIsXG5cdFx0XHRDYWxsYmFja01hcDxUPlxuXHRcdF0+XG5cdH0gPSB7XG5cdFx0b25CZWZvcmVTYXZlOiBbXSxcblx0XHRvblNhdmVTdWNjZXNzOiBbXSxcblx0XHRvblNldEl0ZW1FcnJvcjogW10sXG5cdFx0b25DbGVhckl0ZW1FcnJvcjogW10sXG5cdFx0b25TZXRHbG9iYWxFcnJvcjogW10sXG5cdFx0b25DbGVhckdsb2JhbEVycm9yOiBbXSxcblx0fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyQ2FsbGJhY2s8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdLFxuXHRcdGNvbmRpdGlvbjogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycsXG5cdFx0cHJpb3JpdHk6IG51bWJlciA9IERFRkFVTFRfUFJJT1JJVFksXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHRoaXMuZ2V0UHJpb3JpdHlMZXZlbChcblx0XHRcdHR5cGUsXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpW2tleV0gPSB7XG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdGNvbmRpdGlvbixcblx0XHR9O1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGRlbGV0ZSB0aGlzLmdldFByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdHByaW9yaXR5LFxuXHRcdFx0KVtrZXldO1xuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZUNhbGxiYWNrczxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdHR5cGU6IFQsXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdFx0Y2xvc2VUYWI6IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0Y29uc3QgcHJpb3JpdHlMZXZlbHMgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcblx0XHRjb25zdCBjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbiA9IGNsb3NlVGFiID8gJ29uQ2xvc2UnIDogJ3NraXBPbkNsb3NlJztcblxuXHRcdGxldCBjaGFpbiA9IHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXG5cdFx0Zm9yIChjb25zdCBwcmlvcml0eUxldmVsIG9mIHByaW9yaXR5TGV2ZWxzKSB7XG5cdFx0XHRjaGFpbiA9IGNoYWluLnRoZW4oXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNhbGxiYWNrc1ByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdFx0cHJpb3JpdHlMZXZlbFsxXSBhcyBDYWxsYmFja01hcDxUPixcblx0XHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRcdFx0ZXhlY3V0ZSxcblx0XHRcdFx0KSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhaW47XG5cdH1cblxuXHRwcml2YXRlIGdldFByaW9yaXR5TGV2ZWw8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGRlc3RpbmF0aW9uUHJpb3JpdHk6IG51bWJlcixcblx0KTogQ2FsbGJhY2tNYXA8VD4ge1xuXHRcdGNvbnN0IHByaW9yaXR5TGV2ZWxzID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG5cdFx0bGV0IG5ld1ByaW9yaXR5TGV2ZWw7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByaW9yaXR5TGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBwcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbHNbaV07XG5cblx0XHRcdGlmIChwcmlvcml0eUxldmVsWzBdIDwgZGVzdGluYXRpb25Qcmlvcml0eSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByaW9yaXR5TGV2ZWxbMF0gPT09IGRlc3RpbmF0aW9uUHJpb3JpdHkpIHtcblx0XHRcdFx0cmV0dXJuIHByaW9yaXR5TGV2ZWxbMV0gYXMgQ2FsbGJhY2tNYXA8VD47XG5cdFx0XHR9XG5cblx0XHRcdG5ld1ByaW9yaXR5TGV2ZWwgPSB7fTtcblxuXHRcdFx0cHJpb3JpdHlMZXZlbHMuc3BsaWNlKFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQwLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0ZGVzdGluYXRpb25Qcmlvcml0eSxcblx0XHRcdFx0XHRuZXdQcmlvcml0eUxldmVsLFxuXHRcdFx0XHRdLFxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuIG5ld1ByaW9yaXR5TGV2ZWw7XG5cdFx0fVxuXG5cdFx0bmV3UHJpb3JpdHlMZXZlbCA9IHt9O1xuXG5cdFx0cHJpb3JpdHlMZXZlbHMucHVzaChbXG5cdFx0XHRkZXN0aW5hdGlvblByaW9yaXR5LFxuXHRcdFx0bmV3UHJpb3JpdHlMZXZlbCxcblx0XHRdKTtcblxuXHRcdHJldHVybiBuZXdQcmlvcml0eUxldmVsO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2tzUHJpb3JpdHlMZXZlbDxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdGNhbGxiYWNrczogQ2FsbGJhY2tNYXA8VD4sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdCk6ICgpID0+IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdDoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gY2FsbGJhY2tzKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrRW50cnkgPSBjYWxsYmFja3Nba2V5XTtcblxuXHRcdFx0XHRpZiAoY2FsbGJhY2tFbnRyeS5jb25kaXRpb24gIT09IGNvbmRpdGlvbiAmJiBjYWxsYmFja0VudHJ5LmNvbmRpdGlvbiAhPT0gJ2Fsd2F5cycpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzdWx0W2tleV0gPSBleGVjdXRlKGNhbGxiYWNrRW50cnkuY2FsbGJhY2spO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlc3VsdCk7XG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgbm9vcCwgUm1Db3JlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvQWJzdHJhY3RDYWNoZURlcGVuZGVuY3lJbnRlcmZhY2UnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbUVudHJ5T3B0aW9ucyxcblx0SXRlbVJlc291cmNlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRDb252ZXJzaW9uTWFwLFxuXHRDcmVhdGVSZXF1ZXN0UGFyYW1ldGVyTWFwLFxuXHREZXJlZ0Z1bmN0aW9uLFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkQ2hhbmdlQ2FsbGJhY2ssXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TGlua0NvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRTdGF0ZUtleVR5cGUsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7XG5cdGNyZWF0ZVBhdGgsXG5cdGhhc1Byb3BlcnRpZXMsXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCxcblx0T25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHRUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGUsXG5cdFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIsXG5cdFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyxcblx0VHJhbnNhY3Rpb25JdGVtSGFuZGxlcixcblx0VHJhbnNhY3Rpb25WYWxpZGF0b3IsXG5cdFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yIH0gZnJvbSAnLi4vQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4uL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV2ZW50SGFuZGxlciB9IGZyb20gJy4vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuXG50eXBlIEl0ZW1SZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHttYWluOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiwgbGlua2VkOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXB9O1xuXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkVycm9yTGV2ZWwge1xuXHR3YXJuaW5nID0gJ3dhcm5pbmcnLFxuXHRlcnJvciA9ICdlcnJvcidcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSBpcyByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZiBuZXdseSBjcmVhdGVkIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9XG4gKiBhbmQge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30sIGFuZCB0aGUgY2hhbmdlcyBvZiBleGlzdGluZyBJdGVtRW50cmllcyBhbmQgQ29sbGVjdGlvbkVudHJpZXMuXG4gKlxuICogVGhlIFRyYW5zYWN0aW9uQ2FjaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSwgd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uJ3MgY2hhbmdlcyBvbiB0aGlzIEl0ZW1FbnRyeVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25DYWNoZVxuXHRleHRlbmRzIEFic3RyYWN0Q2FjaGUge1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQSBtYXAgb2YgYWxsIGl0ZW0gZXJyb3JzLCBjYW4gYmUgcG9wdWxhdGVkIHVzaW5nIHtAbGluayBUcmFuc2FjdGlvblZhbGlkYXRvci5zZXRHbG9iYWxFcnJvciBUcmFuc2FjdGlvblZhbGlkYXRvci5zZXRHbG9iYWxFcnJvcn0gYW5kIHtAbGluayBUcmFuc2FjdGlvblZhbGlkYXRvci5zZXRJdGVtRXJyb3IgVHJhbnNhY3Rpb25WYWxpZGF0b3Iuc2V0SXRlbUVycm9yfS5cblx0ICogQ29udGFpbnMgYSB0cmFuc2xhdGlvbiBhbmQgbGV2ZWwgZm9yIGV2ZXJ5IGVycm9yXG5cdCAqL1xuXHRwdWJsaWMgZXJyb3JzOiB7XG5cdFx0aXRlbToge1xuXHRcdFx0W2l0ZW1FbnRyeUlkOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtjb2x1bW5JZDogc3RyaW5nXToge1xuXHRcdFx0XHRcdFtlcnJvcktleTogc3RyaW5nXToge1xuXHRcdFx0XHRcdFx0ZmllbGRTdHJpbmc6IHN0cmluZyxcblx0XHRcdFx0XHRcdHN0cmluZzogc3RyaW5nLFxuXHRcdFx0XHRcdFx0bGV2ZWw6IFRyYW5zYWN0aW9uRXJyb3JMZXZlbFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2xvYmFsOiB7XG5cdFx0XHRba2V5OiBzdHJpbmddOiB7XG5cdFx0XHRcdHN0cmluZzogc3RyaW5nLFxuXHRcdFx0XHRsZXZlbDogVHJhbnNhY3Rpb25FcnJvckxldmVsXG5cdFx0XHR9XG5cdFx0fVxuXHR9ID0ge1xuXHRcdGl0ZW06IHt9LFxuXHRcdGdsb2JhbDoge30sXG5cdH07XG5cblx0cHVibGljIGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogU3RvcmVzIHRoZSAncm9vdCcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9LCB0aGlzIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBjYW4gYmUgdXNlZCBhcyByZXF1ZXN0IHBhcmVudCB0byBzdG9yZSB0aGUgd2hvbGUgdHJhbnNhY3Rpb24gYXQgb25jZVxuXHQgKi9cblx0cHVibGljIHJvb3RJdGVtOiBJdGVtRW50cnk8YW55PiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyBhZGRpdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycyBmb3Igd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgc3RvcmVkIHRvIHRoZSBzZXJ2ZXJcblx0ICovXG5cdHB1YmxpYyB0YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSXMgdHJ1ZSB3aGlsZSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gaXMgYXBwbHlpbmcgY2hhbmdlcyB0byB0aGUgcGFyZW50IChjYW4gZWl0aGVyIGJlIHRocm91Z2ggYSBtZXJnZSBvciBhbiBBcGkgc2F2ZSlcblx0ICovXG5cdHB1YmxpYyBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhczpcblx0ICogLSBOZXdseSBjcmVhdGVkIGl0ZW1zXG5cdCAqIC0gUmVtb3ZlZCBpdGVtcyAoZnJvbSBjb2xsZWN0aW9ucylcblx0ICogLSBDaGFuZ2VzIG9uIGV4aXN0aW5nIGl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVGhlIHRyYW5zYWN0aW9uJ3MgcGFyZW50XG5cdCAqL1xuXHRwdWJsaWMgcmVhZG9ubHkgcGFyZW50OiBBYnN0cmFjdENhY2hlO1xuXG5cdHB1YmxpYyByZWFkb25seSBpdGVtSGFuZGxlcjogVHJhbnNhY3Rpb25JdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyByZWFkb25seSBldmVudEhhbmRsZXI6IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yPzogVHJhbnNhY3Rpb25WYWxpZGF0b3I7XG5cdHByaXZhdGUgY2hhbmdlc0ludGVydmFsOiBudWxsIHwgbnVtYmVyID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZGVwZW5kZW5jaWVzOiBBYnN0cmFjdENhY2hlRGVwZW5kZW5jeUludGVyZmFjZSxcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0cGFyZW50OiBBYnN0cmFjdENhY2hlLFxuXHRcdC8qKlxuXHRcdCAqIEBkZXNjcmlwdGlvblxuXHRcdCAqIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcblx0XHQgKi9cblx0XHRwdWJsaWMgaWQ/OiBzdHJpbmcsXG5cdFx0dmFsaWRhdG9yRmFjdG9yeT86IFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRkZXBlbmRlbmNpZXMsXG5cdFx0XHRjb3JlLFxuXHRcdCk7XG5cblx0XHR0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvckZhY3RvcnkgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdDogdmFsaWRhdG9yRmFjdG9yeS5jb25zdHJ1Y3QodGhpcyk7XG5cblx0XHR0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuXHRcdHRoaXMuaXRlbUhhbmRsZXIgPSBuZXcgVHJhbnNhY3Rpb25JdGVtSGFuZGxlcihcblx0XHRcdGRlcGVuZGVuY2llcyxcblx0XHRcdHRoaXMsXG5cdFx0XHR0aGlzLnZhbGlkYXRvcixcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlciA9IG5ldyBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLFxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlcixcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlcixcblx0XHRcdGRlcGVuZGVuY2llcy5leGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGVzdHJveSAoKTogdm9pZCB7XG5cdFx0dGhpcy5wYXJlbnQub25DaGlsZERlc3Ryb3kodGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJGaWVsZENoYW5nZUNhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjYWxsYmFjazogRmllbGRDaGFuZ2VDYWxsYmFjazxJdGVtVHlwZVR5cGU+LFxuXHQpOiBEZXJlZ0Z1bmN0aW9uIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlci5yZWdpc3RlckZpZWxkQ2hhbmdlQ2FsbGJhY2soXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdGNhbGxiYWNrLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ2hhbmdlc0RlbHRhICgpOiBDaGFuZ2VzRGVsdGEge1xuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHR9XG5cblx0cHVibGljIGdldEZpcnN0RXJyb3JTdHJpbmcgKCk6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG5cdFx0Zm9yIChjb25zdCBlcnJvcktleSBpbiB0aGlzLmVycm9ycy5nbG9iYWwpIHtcblx0XHRcdGNvbnN0IGVycm9yID0gdGhpcy5lcnJvcnMuZ2xvYmFsW2Vycm9yS2V5XTtcblxuXHRcdFx0aWYgKGVycm9yLmxldmVsID09PSBUcmFuc2FjdGlvbkVycm9yTGV2ZWwuZXJyb3IpIHtcblx0XHRcdFx0cmV0dXJuIGVycm9yLnN0cmluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIHRoaXMuZXJyb3JzLml0ZW0pIHtcblx0XHRcdGNvbnN0IGl0ZW1FcnJvcnMgPSB0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBpdGVtRXJyb3JzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbHVtbkVycm9ycyA9IGl0ZW1FcnJvcnNbY29sdW1uSWRdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgZXJyb3JLZXkgaW4gY29sdW1uRXJyb3JzKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3IgPSBjb2x1bW5FcnJvcnNbZXJyb3JLZXldO1xuXG5cdFx0XHRcdFx0aWYgKGVycm9yLmxldmVsID09PSBUcmFuc2FjdGlvbkVycm9yTGV2ZWwuZXJyb3IpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlcnJvci5zdHJpbmc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHtAbGluayBUcmFuc2FjdGlvblZhbGlkYXRvciBUcmFuc2FjdGlvblZhbGlkYXRvcn1cblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX3NldEdsb2JhbEVycm9yIChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRpc0ludmFsaWQ6IGJvb2xlYW4sXG5cdFx0c2F2ZUJ1dHRvbkVycm9yVHJhbnNsYXRpb25GbjogKCkgPT4gc3RyaW5nLFxuXHRcdGxldmVsOiBUcmFuc2FjdGlvbkVycm9yTGV2ZWwsXG5cdCk6IHZvaWQge1xuXHRcdGlmICghaXNJbnZhbGlkKSB7XG5cdFx0XHR0aGlzLmNsZWFyR2xvYmFsRXJyb3Ioa2V5KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuZXJyb3JzLmdsb2JhbFtrZXldID0ge1xuXHRcdFx0c3RyaW5nOiBzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuKCksXG5cdFx0XHRsZXZlbDogbGV2ZWwsXG5cdFx0fTtcblxuXHRcdHRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGVDYWxsYmFja3MoXG5cdFx0XHQnb25TZXRHbG9iYWxFcnJvcicsXG5cdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayhcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRsZXZlbCxcblx0XHRcdCksXG5cdFx0XHRmYWxzZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5fc2V0SXNWYWxpZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkge0BsaW5rIFRyYW5zYWN0aW9uVmFsaWRhdG9yIFRyYW5zYWN0aW9uVmFsaWRhdG9yfVxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBfc2V0SXRlbUVycm9yIChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0ZXJyb3JLZXk6IHN0cmluZyxcblx0XHRpc0ludmFsaWQ6IGJvb2xlYW4sXG5cdFx0ZmllbGRFcnJvclRyYW5zbGF0aW9uRm46ICgpID0+IHN0cmluZyxcblx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuOiAoKSA9PiBzdHJpbmcsXG5cdFx0bGV2ZWw6IFRyYW5zYWN0aW9uRXJyb3JMZXZlbCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKCFpc0ludmFsaWQpIHtcblx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0ZXJyb3JLZXksXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y3JlYXRlUGF0aChcblx0XHRcdHRoaXMuZXJyb3JzLml0ZW0sXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0ZXJyb3JLZXksXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRmaWVsZFN0cmluZzogZmllbGRFcnJvclRyYW5zbGF0aW9uRm4oKSxcblx0XHRcdFx0XHRzdHJpbmc6IHNhdmVCdXR0b25FcnJvclRyYW5zbGF0aW9uRm4oKSxcblx0XHRcdFx0XHRsZXZlbDogbGV2ZWwsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdCk7XG5cblx0XHR0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlQ2FsbGJhY2tzKFxuXHRcdFx0J29uU2V0SXRlbUVycm9yJyxcblx0XHRcdGNhbGxiYWNrID0+IGNhbGxiYWNrKFxuXHRcdFx0XHRpdGVtRW50cnlJZCxcblx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdGVycm9yS2V5LFxuXHRcdFx0KSxcblx0XHRcdGZhbHNlLFxuXHRcdCk7XG5cblx0XHR0aGlzLl9zZXRJc1ZhbGlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX3NldElzVmFsaWQgKCk6IHZvaWQge1xuXHRcdHRoaXMuaXNWYWxpZCA9IHRydWU7XG5cblx0XHRmb3IgKGNvbnN0IGVycm9yS2V5IGluIHRoaXMuZXJyb3JzLmdsb2JhbCkge1xuXHRcdFx0Y29uc3QgZXJyb3IgPSB0aGlzLmVycm9ycy5nbG9iYWxbZXJyb3JLZXldO1xuXG5cdFx0XHRpZiAoZXJyb3IubGV2ZWwgPT09IFRyYW5zYWN0aW9uRXJyb3JMZXZlbC5lcnJvcikge1xuXHRcdFx0XHR0aGlzLmlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiB0aGlzLmVycm9ycy5pdGVtKSB7XG5cdFx0XHRjb25zdCBpdGVtRXJyb3JzID0gdGhpcy5lcnJvcnMuaXRlbVtpdGVtRW50cnlJZF07XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gaXRlbUVycm9ycykge1xuXHRcdFx0XHRjb25zdCBjb2x1bW5FcnJvcnMgPSBpdGVtRXJyb3JzW2NvbHVtbklkXTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGVycm9yS2V5IGluIGNvbHVtbkVycm9ycykge1xuXHRcdFx0XHRcdGNvbnN0IGVycm9yID0gY29sdW1uRXJyb3JzW2Vycm9yS2V5XTtcblxuXHRcdFx0XHRcdGlmIChlcnJvci5sZXZlbCA9PT0gVHJhbnNhY3Rpb25FcnJvckxldmVsLmVycm9yKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY2hhbmdlcyBmcm9tIHRoZSBwYXJlbnQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnMsIHRoaXMgYXNzdW1lcyB0aGF0IGFuIGFjdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gYSBwYXJlbnQsIHNvIGl0IGRvZXMndCBoYW5kbGUgY3JlYXRlZCBlbnRyaWVzXG5cdCAqIGFuZCByZW1vdmVzIGVudHJpZXMgdGhhdCB3ZXJlIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtcyBkZWxldGVkSXRlbXN9IHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZGVsZXRlZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50fSBhbmQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBhc3N1bWVzXG5cdCAqIHRoZSBjaGFuZ2UgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIGFuZCBhcHBseUNoYW5nZXNEZWx0YSB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZXMgb25jZSB5b3Ugc2F2ZSB0aGUgdHJhbnNhY3Rpb25cblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX0gaWYgeW91IHdhbnQgdG8gYXBwbHkgY2hhbmdlcyBmcm9tIG91dHNpZGUgdGhlIGNvcmVcblx0ICpcblx0ICogQHBhcmFtIGludGVybmFsQ2hhbmdlc0RlbHRhIENoYW5nZXMgdG8gYmUgYXBwbGllZFxuXHQgKiBAcGFyYW0gaXNDYWxsZWRBZnRlckFwaVNhdmUgSWYgJ2lzQ2FsbGVkQWZ0ZXJBcGlTYXZlJyBpcyB0cnVlIGxvY2FsIGNoYW5nZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4gKGluc3RlYWQgb2Ygb25seSB3aGVuIHRoZXJlIGFyZSBubyBjaGFuZ2VzKVxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgKFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0Ly8gV2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIGNyZWF0ZWQgaXRlbXMsIGJlc2lkZXMgY2hlY2tpbmcgaWYgdGhleSBmaXQgaW4gY29sbGVjdGlvbnNcblx0XHQvLyBjcmVhdGluZyBlbnRyaWVzIGlzIGFscmVhZHkgZG9uZSBieSBgYXBwbHlDaGFuZ2VzRGVsdGFgIG9uIGEgcGFyZW50IHRyYW5zYWN0aW9uXG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb25zdCBpbmRleCA9IHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0uaW5kZXhPZihpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYgYW4gaXRlbSBpcyBkZWxldGVkIG9uIGFub3RoZXIgY2FjaGUgd2Ugc2hvdWxkbid0IGF0dGVtcHQgYW5vdGhlciByZXF1ZXN0LCBzbyB3ZSByZW1vdmUgaXQgZnJvbSB0aGUgdG8tYmUtZGVsZXRlZCBhcnJheVxuXHRcdFx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXS5zcGxpY2UoXG5cdFx0XHRcdFx0XHRcdGluZGV4LFxuXHRcdFx0XHRcdFx0XHQxLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB3ZSBjb3VsZCBhcHBseSB0aGUgY2hhbmdlcyB0byBjaGlsZHJlbiB3aGlsZSB0aGUgcHJvbWlzZSBpcyBydW5uaW5nXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBkbyB3ZSB3YW50IHRoaXM/IE1heWJlIGFmdGVyIG1lcmdpbmcgdGhlIHNlcnZlciBjaGFuZ2VzIHRoZXJlJ3Mgbm8gY2hhbmdlcyBhbnltb3JlXG5cdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdFx0dGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG5cblx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5jbGVhckdsb2JhbEVycm9yKCk7XG5cdFx0XHR0aGlzLnZhbGlkYXRvci52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIGNoYW5nZXMgdG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgaXRzIGNoaWxkcmVuXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKlxuXHQgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9IGFuZCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YX0gaXMgdGhhdCBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGFzc3VtZXNcblx0ICogdGhlIGNoYW5nZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCwgYW5kIGFwcGx5Q2hhbmdlc0RlbHRhIHdpbGwgcHJvY2VzcyB0aGUgY2hhbmdlcyBpdHNlbGYgKHJlc3VsdCB2cyBjYXVzZSlcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIERpZmZlcnMgZnJvbSB7QGxpbmsgU2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEgU2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGluIHRoZSBoYW5kbGluZyBvZiBkZWxldGVkIGVudHJpZXMgYW5kIHRoZSBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGNhbGxcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKGNoYW5nZXNEZWx0YS5pc0VtcHR5KCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdFx0cm9sbGJhY2s6IG5vb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hVcGRhdGVkRGVyaXZlZFZhbHVlc0Zyb21EZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtyZXN1bHQsIGludGVybmFsQ2hhbmdlc0RlbHRhLCByb2xsYmFja0Z1bmN0aW9uc30gPSBzdXBlci5fYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9sZENoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeS5pZF07XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSBpbiB0aGUgYXJyYXkgP1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9sZENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdFx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0Y2hpbGQuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChpbnRlcm5hbENoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gZG8gd2Ugd2FudCB0aGlzPyBNYXliZSBhZnRlciBtZXJnaW5nIHRoZSBzZXJ2ZXIgY2hhbmdlcyB0aGVyZSdzIG5vIGNoYW5nZXMgYW55bW9yZSwgY291bGQgYmUgYSBwZXJmb3JtYW5jZSB0aGluZ3lcblx0XHRcdFx0XHR0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLmRldGVjdENoYW5nZXMoKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLnZhbGlkYXRvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnZhbGlkYXRvci52YWxpZGF0ZVRyYW5zYWN0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0U2VydmVyQ2FjaGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnQgZnJvbSB0aGUgY2xvc2VzdCB0cmFuc2FjdGlvblxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbUVudHJ5IFRoZSBlbnRyeSB0byBnZXQgdGhlIHBhcmVudCBmcm9tXG5cdCAqIEBwYXJhbSBmcm9tSW5pdGlhbCBJZiBgdHJ1ZWAgdGhlIHBhcmVudCB2YWx1ZXMgd2lsbCBiZSByZWFkIGZyb20ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcy5pbml0aWFsIGluaXRpYWx9IChVc2VmdWwgZm9yIHdoZW4geW91J3ZlIG1vdmVkIGFuIGVudHJ5KVxuXHQgKiBAcGFyYW0gcHJvdmlkZWRGaWVsZHMgVXNlIHRoZSBwcm92aWRlZCBmaWVsZHMgaW5zdGVhZCBvZiB0aGUgY2FjaGVkIGZpZWxkcywgdXNlZCBieSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFVzZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fSBpbnN0ZWFkIG9mIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudH0gaWYgeW91J3JlIGdldHRpbmcgdGhlIHBhcmVudCBpbiB0aGUgb25SZW1vdmUgY2FsbGJhY2tcblx0ICovXG5cdC8vIHRvZG9bY2FjaGVdIHJlbmFtZSB0byBnZXRJdGVtUGFyZW50IG9yIGdldFBhcmVudE9iamVjdD9cblx0cHVibGljIGdldFBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZnJvbUluaXRpYWw6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRwcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0bGV0IGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChwcm92aWRlZEZpZWxkcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmaWVsZHMgPSBwcm92aWRlZEZpZWxkcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY2hhbmdlc1R1cGxlID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRpZiAoY2hhbmdlc1R1cGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZmllbGRzID0gY2hhbmdlc1R1cGxlW2Zyb21Jbml0aWFsID8gJ2luaXRpYWwnIDogJ2NoYW5nZXMnXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZmllbGRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldFBhcmVudChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGZyb21Jbml0aWFsLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeVtdIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmdldExvY2FsQ29sbGVjdGlvbkVudHJ5KGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYWxsZWQgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSB3aXRoIGEgY29sbGVjdGlvbkVudHJ5SWQgdGhhdCBpc24ndCBjYWNoZWRgKTtcblx0XHR9XG5cblx0XHRsZXQgY29sbGVjdGlvbkNoYW5nZXMgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmdldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25DaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbGxlY3Rpb25DaGFuZ2VzID0gdGhpcy5wYXJlbnRcblx0XHRcdFx0LmdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkoY29sbGVjdGlvbkVudHJ5SWQpXG5cdFx0XHRcdC5zbGljZSgpO1xuXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLnNldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRcdGNvbGxlY3Rpb25DaGFuZ2VzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29sbGVjdGlvbkNoYW5nZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgdHJhbnNhY3Rpb24gY2hhaW4gYW5kIHJldHVybnMgdGhlIGNoYW5nZXMgb2YgdGhlIGl0ZW0gb24gdGhlIGZpcnN0IHRyYW5zYWN0aW9uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb3B5RmllbGRzIElmIHNldCwgd2lsbCBjYWxsIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBBcGlGb3JtYXR0ZXIuY29weUZpZWxkc30sIG90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXMuY2hhbmdlcztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0Y29weUZpZWxkcyxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZX0gZnJvbSB0aGUgdHJhbnNhY3Rpb24sIHByZXZlbnRpbmcgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2Uub3B0aW9ucy5vbkFkZCBvbkFkZH0gYW5kIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2Uub3B0aW9ucy5vblJlbW92ZSBvblJlbW92ZX0gY2FsbGJhY2tzIGZyb20gYmVpbmcgY2FsbGVkLlxuXHQgKiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIgbmVlZGVkXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogRG9lcyBub3QgcmVtb3ZlIGNoYW5nZXNcblx0ICovXG5cdHB1YmxpYyBjbGVhckNvbGxlY3Rpb25SZXNvdXJjZSAocmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZSk6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmNsZWFyUmVzb3VyY2UocmVzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5yb290SXRlbSByb290SXRlbX0gaXMgdXNlcyBsb2Nrc1xuXHQgKi9cblx0cHVibGljIGlzTG9ja2FibGUgKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLnJvb3RJdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yb290SXRlbS5pc0xvY2thYmxlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIERpc2FibGVzIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMgd2F0Y2hlciwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNoYW5nZXMgb24gaXRlbXNcblx0ICovXG5cdHB1YmxpYyBkaXNhYmxlQ2hhbmdlc1dhdGNoZXIgKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNoYW5nZXNJbnRlcnZhbCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNsZWFySW50ZXJ2YWwodGhpcy5jaGFuZ2VzSW50ZXJ2YWwpO1xuXHRcdHRoaXMuY2hhbmdlc0ludGVydmFsID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRW5hYmxlcyB0aGUgdHJhbnNhY3Rpb24ncyBjaGFuZ2VzIHdhdGNoZXIsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGRldGVjdCBjaGFuZ2VzIG9uIGl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgZW5hYmxlQ2hhbmdlc1dhdGNoZXIgKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNoYW5nZXNJbnRlcnZhbCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnQ2hhbmdlcyB3YXRjaGVyIGFscmVhZHkgcnVubmluZyEnLFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0KTtcblx0XHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jaGFuZ2VzSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGlmICghdGhpcy5kZXRlY3RDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmRpc2FibGVDaGFuZ2VzV2F0Y2hlcigpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmlzTG9ja2FibGUoKSkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmxvY2tTZXJ2aWNlLmZldGNoTG9jayh0aGlzLnJvb3RJdGVtISk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQzMDAwLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFNhdmVzIHRoZSB0cmFuc2FjdGlvbiwgdGhpcyBoYXMgYSBkaWZmZXJlbnQgZWZmZWN0IGRlcGVuZGluZyBvbiB0aGUgdHJhbnNhY3Rpb24ncyBwYXJlbnQuXG5cdCAqXG5cdCAqIC0gSWYgdGhlIHBhcmVudCBpcyBhbm90aGVyIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IGl0IHdpbGwgbWVyZ2UgdGhlIGNoYW5nZXMgb2YgdGhlIGNoaWxkIHRyYW5zYWN0aW9uIGluIHRoZSB0aGUgcGFyZW50IHRyYW5zYWN0aW9uXG5cdCAqIC0gSWYgdGhlIHBhcmVudCBpcyB0aGUge0BsaW5rIFNlcnZlckNhY2hlIFNlcnZlckNhY2hlfSBpdCB3aWxsIHNhdmUgdGhlIGNoYW5nZXMgdG8gdGhlIEFQaVxuXHQgKi9cblx0cHVibGljIHNhdmUgKFxuXHRcdGNsb3NlVGFiID0gZmFsc2UsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUmVxdWVzdFBhcmFtZXRlck1hcCA9IHt9LFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5pc1NhdmluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QoKTtcblx0XHR9XG5cblx0XHR0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRsZXQgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLmlzTG9ja2FibGUoKVxuXHRcdFx0XHQ/IHRoaXMuZGVwZW5kZW5jaWVzLmxvY2tTZXJ2aWNlLmZldGNoTG9jayh0aGlzLnJvb3RJdGVtISlcblx0XHRcdFx0OiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKClcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlQ2FsbGJhY2tzKFxuXHRcdFx0XHRcdFx0J29uQmVmb3JlU2F2ZScsXG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayh0aGlzKSxcblx0XHRcdFx0XHRcdGNsb3NlVGFiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMudGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucGFyZW50LmFwcGx5Q2hhbmdlc0Zyb21DaGlsZChcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfaXRlbUlkQ29udmVyc2lvbk1hcCA9PiB7XG5cdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbk1hcCA9IF9pdGVtSWRDb252ZXJzaW9uTWFwO1xuXG5cdFx0XHRcdFx0dGhpcy50YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5sb2NrU2VydmljZS5jbGVhckxvY2sodGhpcy5yb290SXRlbSEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGVDYWxsYmFja3MoXG5cdFx0XHRcdFx0XHQnb25TYXZlU3VjY2VzcycsXG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRjbG9zZVRhYixcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRpZiAoIWNsb3NlVGFiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW1JZENvbnZlcnNpb25NYXA7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGRldGVjdENoYW5nZXMgKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLmhhc0NoYW5nZXMpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRldGVjdENoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGFzQ2hhbmdlcyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGFuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSB0aHJvdWdoIGFuIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSB3aGljaCBtZWFucyB0aGF0IGNoYW5nZXMgb24gdGhpcyBlbnRyeSB3aWxsIG5vIGxvbmdlciBiZSB0cmFja2VkLlxuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbSAoaXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8YW55Pik6IHZvaWQge1xuXHRcdHRoaXMuY2xlYXJJdGVtRW50cnkoaXRlbVJlc291cmNlLmVudHJ5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gZnJvbSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gd2hpY2ggbWVhbnMgdGhhdCBjaGFuZ2VzIG9uIHRoaXMgZW50cnkgd2lsbCBubyBsb25nZXIgYmUgdHJhY2tlZC5cblx0ICovXG5cdHB1YmxpYyBjbGVhckl0ZW1FbnRyeSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyLmNsZWFySXRlbUVudHJ5KGl0ZW1FbnRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gdGhyb3VnaCBhIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSB3aGljaCBtZWFucyB0aGF0IGNoYW5nZXMgb24gdGhpcyBjb2xsZWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGJlIHRyYWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJDb2xsZWN0aW9uIChjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxhbnk+KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY2xlYXJFbnRyeShjb2xsZWN0aW9uUmVzb3VyY2UuZW50cnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGZpcmUgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBzYXZlZCwgcmVqZWN0aW5nIHRoaXMgY2FsbGJhY2sgd2lsbCBwcmV2ZW50IHRoZSB0cmFuc2FjdGlvbiBmcm9tIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIG9uQmVmb3JlU2F2ZSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbJ29uQmVmb3JlU2F2ZSddLFxuXHRcdGNvbmRpdGlvbj86IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbixcblx0XHRwcmlvcml0eT86IG51bWJlcixcblx0KTogKCkgPT4gdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuZXZlbnRIYW5kbGVyLnJlZ2lzdGVyQ2FsbGJhY2soXG5cdFx0XHQnb25CZWZvcmVTYXZlJyxcblx0XHRcdGtleSxcblx0XHRcdGNhbGxiYWNrLFxuXHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0cHJpb3JpdHksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQWRkcyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBmaXJlIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIHNhdmVkIHN1Y2Nlc3NmdWxseVxuXHQgKi9cblx0cHVibGljIG9uU2F2ZVN1Y2Nlc3MgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlWydvblNhdmVTdWNjZXNzJ10sXG5cdFx0Y29uZGl0aW9uPzogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRcdHByaW9yaXR5PzogbnVtYmVyLFxuXHQpOiAoKSA9PiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIucmVnaXN0ZXJDYWxsYmFjayhcblx0XHRcdCdvblNhdmVTdWNjZXNzJyxcblx0XHRcdGtleSxcblx0XHRcdGNhbGxiYWNrLFxuXHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0cHJpb3JpdHksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyBhIHtAbGluayBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHQgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uUmVzdWx0fSBmb3IgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TW9kdWxlQ2hhbmdlcyAoKTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uUmVzdWx0IHtcblx0XHRpZiAodGhpcy5yb290SXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIHJvb3QgaXRlbSBmb3IgdHJhbnNhY3Rpb24gY2FjaGUgJyArIHRoaXMpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KHRoaXMpXG5cdFx0XHQucHJvY2VzcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBwYXNzZWQgbWFwIHdpdGggdGhlIG5ldyB7QGxpbmsgQ29udmVyc2lvbk1hcCBDY29udmVyc2lvbk1hcH0gdmFsdWVzXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlSXRlbUlkTWFwIChcblx0XHRjb2xsZWN0aW9uTWFwOiB7W2l0ZW1JZDogbnVtYmVyXTogYW55fSxcblx0XHRjb252ZXJzaW9uTWFwOiBDb252ZXJzaW9uTWFwLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoY29udmVyc2lvbk1hcCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBvbGRJZCBpbiBjb252ZXJzaW9uTWFwKSB7XG5cdFx0XHRjb25zdCBuZXdJZCA9IGNvbnZlcnNpb25NYXBbb2xkSWRdO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbk1hcFtvbGRJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29sbGVjdGlvbk1hcFtuZXdJZF0gPSBjb2xsZWN0aW9uTWFwW29sZElkXTtcblx0XHRcdGRlbGV0ZSBjb2xsZWN0aW9uTWFwW29sZElkXTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQucXVlcnkoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0e1tsaW5rVHlwZV06IFsnaWQnXX0sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmdldExpbmtDb2xsZWN0aW9ucyhcblx0XHRcdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UubGlua3NbbGlua1R5cGVdLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uc0Zyb21EZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGRlZmluaXRpb246IExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRsaW5rSWRBcnJheSxcblx0XHRcdFx0ZGVmaW5pdGlvbi5pdGVtVHlwZSxcblx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLmVudHJ5LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXMoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cmllcyxcblx0XHRcdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5yZXNvdXJjZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5mZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0bGlua0lkQXJyYXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoY29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25Gcm9tRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0ZGVmaW5pdGlvbjogQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGRlZmluaXRpb24uaXRlbVR5cGUsXG5cdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5lbnRyeSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRlbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRcdFx0ZW50cnksXG5cdFx0XHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMucmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRlbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRcdFx0ZW50cnksXG5cdFx0XHRcdFx0XHRuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRlbnRyeTogbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyksIC8vIHdlIG5lZWQgdGhlIGRlZmF1bHQgY29sdW1uIHZhbHVlXG5cdFx0XHRcdHJlc291cmNlOiBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdH0sXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnNEZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGxpbmtGaWVsZDogc3RyaW5nLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0bGlua0ZpZWxkOiBsaW5rRmllbGQsXG5cdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdGVudHJ5OiBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSwgLy8gd2UgbmVlZCB0aGUgZGVmYXVsdCBjb2x1bW4gdmFsdWVcblx0XHRcdFx0cmVzb3VyY2U6IG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSBnZXRJdGVtQnlJZC9nZXROZXdSZXNvdXJjZVdpdGhJZFxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiBzdGF0ZUtleSBjYW4gYmUgYSBrZXl3b3JkIG9yIGEgbG9jYWwgaWQgKGluIGNhc2Ugb2YgYSByZWZyZXNoKVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHBhcnNlZFN0YXRlS2V5ID0gdGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5wYXJzZVN0YXRlS2V5KHN0YXRlS2V5IGFzIHN0cmluZyk7XG5cblx0XHRpZiAocGFyc2VkU3RhdGVLZXkgPT09IG51bGwpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IHN0YXRlS2V5IGFzIEl0ZW1JZDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKVxuXHRcdFx0XHR8fCB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXNcblx0XHRcdFx0XHQuY29udGFpbnMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0SXRlbUJ5SWQoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0aXNSb290LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocGFyc2VkU3RhdGVLZXkudHlwZSA9PT0gU3RhdGVLZXlUeXBlLkR1cGxpY2F0ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0RHVwbGljYXRlQnlJZChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHBhcnNlZFN0YXRlS2V5Lml0ZW1JZCBhcyBJdGVtSWQsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpc1Jvb3QsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldER1cGxpY2F0ZUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGR1cGxpY2F0ZUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPiB8IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zLml0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMuaXRlbSA9IGR1cGxpY2F0ZUlkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlV2l0aElkKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmdldExvY2FsRHVwbGljYXRlSWQoKSxcblx0XHRcdG9wdGlvbnMgYXMgSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0XHRyZXR1cm5MaW5rcyxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBQYXJ0aWFsPEl0ZW1FbnRyeU9wdGlvbnM+LFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBQYXJ0aWFsPEl0ZW1FbnRyeU9wdGlvbnM+LFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2VXaXRoSWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz4sXG5cdFx0cmV0dXJuTGlua3M6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4gfCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaE5ld0l0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0ZGVsdGFSZXN1bHQgPT4ge1xuXHRcdFx0XHRcdGxldCBtYWluRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGxpbmtlZEVudHJpZXNNYXA6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZGVsdGFSZXN1bHQuY3JlYXRlZCkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUgPT09IGl0ZW1UeXBlXG5cdFx0XHRcdFx0XHRcdCYmIGl0ZW1FbnRyeS5pdGVtSWQgPT09IGl0ZW1JZFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1haW5FbnRyeSA9IGl0ZW1FbnRyeTtcblxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsaW5rZWRFbnRyaWVzTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChtYWluRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgSXRlbUVudHJ5IHdpdGggdGhlIHJlcXVlc3RlZCBJdGVtSWQgd2FzIG5vdCBpbiB0aGUgdGVtcGxhdGUgcmVzcG9uc2UnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBtYWluID0gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0XHRcdG1haW5FbnRyeSxcblx0XHRcdFx0XHRcdGlzUm9vdCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmICghcmV0dXJuTGlua3MpIHtcblx0XHRcdFx0XHRcdHJldHVybiBtYWluO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRtYWluOiBtYWluLFxuXHRcdFx0XHRcdFx0bGlua2VkOiB0aGlzLnByb2Nlc3NMaW5rZWRJdGVtcyhcblx0XHRcdFx0XHRcdFx0bGlua2VkRW50cmllc01hcCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgbmV3IEl0ZW1FbnRyeSBhbmQgcmVzb3VyY2Vcblx0ICovXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogUGFydGlhbDxJdGVtRW50cnlPcHRpb25zPiA9IHt9LFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4gfCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlV2l0aElkKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRyZXR1cm5MaW5rcyxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG11bHRpcGxlIGl0ZW1zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz4gPSB7fSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG11bHRpcGxlIGl0ZW1zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1zQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogUGFydGlhbDxJdGVtRW50cnlPcHRpb25zPiA9IHt9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4ge1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkcyxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGl0ZW0gd2l0aCB0aGUgY2hhbmdlcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn1cblx0ICpcblx0ICogQHBhcmFtIGlzUm9vdCBTZXRzIHRoZSBpdGVtIGFzIHRoZSByb290IGl0ZW0gb2YgdGhlIHRyYW5zYWN0aW9uLCBuZXcgaXRlbXMgd2lsbCBiZSBsaW5rZWQgdG8gdGhpcyBpdGVtIChpZiB0aGVyZSdzIGEgY29ubmVjdGlvbiBpbiB0aGUgTGlua1RyZWUpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz4gPSB7fSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2UoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIHRpdGxlIG9mIGFuIGl0ZW0sIGRvZXMgbm90IGNyZWF0ZSBhbiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX1cblx0ICovXG5cdHB1YmxpYyBmZXRjaFRpdGxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZmV0Y2hUaXRsZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoaWxkIFRyYW5zYWN0aW9uIGludG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgdGhlbiBwcm9wYWdhdGVzIHRoZW0gdG8gdGhlIG90aGVyIGNoaWxkIHRyYW5zYWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0Y2hpbGRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRfYnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRfb25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMuZGVwZW5kZW5jaWVzLmxpbmtUcmVlU2VydmljZS5nZXQoKTtcblx0XHRjb25zdCBpbnRlcm5hbENoYW5nZXNEZWx0YSA9IGNoaWxkVHJhbnNhY3Rpb24uZ2V0RGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHQvLyBCaXQgb2YgYSBoYWNrLCBidXQgd2hlbiBtZXJnaW5nIHRyYW5zYWN0aW9ucyB3ZSB3YW50IHRvIGhhbmRsZSBtb3ZlcyBhcyB1cGRhdGVzXG5cdFx0XHQvLyBXZSBvbmx5IHdhbnQgdGhlIG1vdmVzIGluIHRoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBkbyBhIGxpbmtUbyByZXF1ZXN0IHdoZW4gc2F2aW5nIHRvIHRoZSBBUElcblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHR1cGxlLnRvLFxuXHRcdFx0KTtcblxuXHRcdFx0ZGVsZXRlIGludGVybmFsQ2hhbmdlc0RlbHRhLm1vdmVkW2l0ZW1FbnRyeUlkXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdID0gdGhpcy5pdGVtSGFuZGxlci5jb3B5VHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHRcdGNoaWxkVHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdLFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0XHR0dXBsZSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmFkZCh0dXBsZS5lbnRyeSk7XG5cdFx0XHRjaGlsZFRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIodHVwbGUuZW50cnkpO1xuXG5cdFx0XHRjb25zdCBsb2NhbENoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW3R1cGxlLmVudHJ5LmlkXSA9IHRoaXMuaXRlbUhhbmRsZXIuY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0Y2hpbGRUcmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgbmV3RGlzcGxheU5hbWUgPSB0aGlzLmRlcGVuZGVuY2llcy5pdGVtRW50cnlTZXJ2aWNlLmdldERpc3BsYXlOYW1lKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAobmV3RGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5kaXNwbGF5bmFtZSA9IG5ld0Rpc3BsYXlOYW1lO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5yb290SXRlbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnN0IGxpbmtOb2RlID0gbGlua1RyZWVbdGhpcy5yb290SXRlbS5pdGVtVHlwZV1bdHVwbGUuZW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGlmIChsaW5rTm9kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGxpbmtOb2RlLnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5JVEVNVEFCTEUpIHtcblx0XHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLml0ZW10eXBlID0gdGhpcy5yb290SXRlbS5pdGVtVHlwZTtcblx0XHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLml0ZW0gPSB0aGlzLnJvb3RJdGVtLml0ZW1JZDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpbmtOb2RlLnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzW2xpbmtOb2RlLmZpZWxkXSA9IHRoaXMucm9vdEl0ZW0uaXRlbUlkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHQvLyBpZiBhbiBpdGVtRW50cnkgd2FzIGEgbG9jYWwgZW50cnkgb24gYSBjaGlsZCB0cmFuc2FjdGlvbiwgaXQncyBpbXBvc3NpYmxlIHRoYXQgaXQgaXMgb24gdGhpcyB0cmFuc2FjdGlvblxuXHRcdFx0XHRpZiAoaXRlbUVudHJ5LmlzTG9jYWwoKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0dGhpcy5jbGVhckl0ZW1FcnJvcihcblx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5oYXNDaGFuZ2VzID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEl0ZW1zRnJvbURlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdFx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0aWYgKGNoaWxkID09PSBjaGlsZFRyYW5zYWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy52YWxpZGF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhpcy52YWxpZGF0b3IudmFsaWRhdGVUcmFuc2FjdGlvbigpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpbnRlcm5hbENoYW5nZXNEZWx0YS5pdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBhbHJlYWR5IGNhY2hlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjaGFuZ2VzIG9mIHRoaXMgc3BlY2lmaWMgdHJhbnNhY3Rpb24gZm9yIHRoYXQgZW50cnlcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZ2V0TG9jYWxJdGVtRW50cnkoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIGdldCBhIGxvY2FsIEl0ZW1FbnRyeSB3aXRoIGVudHJ5SWQgJyR7aXRlbUVudHJ5SWR9JyBidXQgY291bGRuJ3QgZmluZCBpdGApO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0Y2hhbmdlczogdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUsIGRvZXNuJ3QgZG8gYSBBUEkgcmVxdWVzdCwgdXNlZCBmb3Igc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5RW50cnlJZChpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUgYnkgSXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gQ29sbGVjdGlvbkVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5QnlRdWVyeVN0cmluZyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5UXVlcnlTdHJpbmcoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5nZXRMb2NhbENvbGxlY3Rpb25FbnRyeUJ5UXVlcnlTdHJpbmcoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gQ29sbGVjdGlvbkVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IG9mIHRoZSBUcmFuc2FjdGlvbkNhY2hlLCB0aGlzIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IHRoZSBlbmQgcmVzdWx0IChpbml0aWFsIGlzIGNvbXBhcmVkIHRvIGNoYW5nZXMpLCBzbyBjaGFuZ2luZyBzb21ldGhpbmcgYW5kIHJldmVydGluZyBpdFxuXHQgKiB3b24ndCBiZSBpbmNsdWRlZFxuXHQgKi9cblx0cHVibGljIGdldERlbHRhICgpOiBJbnRlcm5hbENoYW5nZXNEZWx0YSB7XG5cdFx0Y29uc3QgaW50ZXJuYWxDaGFuZ2VzRGVsdGEgPSB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKE51bWJlcihpdGVtRW50cnlJZCkpO1xuXG5cdFx0XHQvLyBBbiBpdGVtIGNhbiBiZSB1c2VkIGJ5IGEgMm5kKyBsZXZlbCBjaGlsZCBUcmFuc2FjdGlvbkNhY2hlLCBpdCB3aWxsIGJlIGxvY2FsIHRoYW4gYnV0IGl0IHNob3VsZCBvbmx5IGNvdW50IGFzIGEgY3JlYXRlXG5cdFx0XHQvLyBvbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBhY3R1YWxseSBjcmVhdGVkIHRoZSBlbnRyeVxuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY29udGFpbnMoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpXG5cdFx0XHRcdCYmIHR1cGxlLmVudHJ5LmlzTG9jYWwoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1JZCA9IHR1cGxlLmNoYW5nZXMuY2hhbmdlcy5pZDtcblxuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG5ld1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdQYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3Qgb2xkUGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IXRoaXMuZGVwZW5kZW5jaWVzLml0ZW1FbnRyeVNlcnZpY2UubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdFx0XHRvbGRQYXJlbnQsXG5cdFx0XHRcdFx0XHRuZXdQYXJlbnQsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Ly8gaGFzQ2hhbmdlcyBvbmx5IHRha2VzIHdyaXRhYmxlIGNvbHVtbnMgaW50byBhY2NvdW50IGJ5IGRlZmF1bHQsIHNvIGp1c3QgbW92aW5nIHNvbWV0aGluZyBkb2Vzbid0IGNvdW50IGFzIGFuIHVwZGF0ZVxuXHRcdFx0XHQhdGhpcy5kZXBlbmRlbmNpZXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHR0dXBsZS5lbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXMpIHtcblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1zRGVsZXRlZCh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbnRlcm5hbENoYW5nZXNEZWx0YTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIG1vdmUgdG8gVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRpc1Jvb3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAoaXNSb290KSB7XG5cdFx0XHR0aGlzLnJvb3RJdGVtID0gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0ge1xuXHRcdFx0XHRpbml0aWFsOiB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoaXRlbUVudHJ5LmlkKSxcblx0XHRcdFx0Y2hhbmdlczogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KGl0ZW1FbnRyeS5pZCksXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc291cmNlID0gdGhpcy5kZXBlbmRlbmNpZXMuaXRlbVJlc291cmNlRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXNOZXcsXG5cdFx0KTtcblxuXHRcdHJldHVybiByZXNvdXJjZTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0KTogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRcdFx0aW5pdGlhbDogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGNoYW5nZXM6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLmRlcGVuZGVuY2llcy5pdGVtUmVzb3VyY2VGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0KTtcblxuXHRcdFx0cmVzdWx0LnB1c2gocmVzb3VyY2UpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc0xpbmtlZEl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua2VkRW50cmllczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+LFxuXHQpOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXA8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCByZXN1bHQ6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rZWRFbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHRbaXRlbVR5cGVdID0gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRsaW5rZWRFbnRyaWVzW2l0ZW1UeXBlXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLmRlcGVuZGVuY2llcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdHJlc291cmNlT3B0aW9ucyxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuYWRkUmVzb3VyY2UocmVzb3VyY2UpO1xuXG5cdFx0cmV0dXJuIHJlc291cmNlO1xuXHR9XG5cblx0cHVibGljIGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIGNoYW5nZXNPYmplY3QuY2hhbmdlcztcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbcGFyZW50SWQ6IHN0cmluZ106IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cmllc1twYXJlbnRJZF0sXG5cdFx0XHRcdHJlc291cmNlT3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbGwgcmVxdWlyZWQgY29sdW1ucyB0byBtYXRjaC9maXQgaW4gY29sbGVjdGlvbnNcblx0ICovXG5cdHByaXZhdGUgZXhwYW5kSXRlbXNGcm9tRGVsdGEgKGRlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W11bXT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1FbnRyeVtdfSA9IHt9O1xuXHRcdGNvbnN0IGNvbHVtbnNQZXJJdGVtVHlwZU1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9ID0ge307XG5cblx0XHRjb25zdCBhZGRFbnRyeSA9XG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRpZiAoaXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5kZXBlbmRlbmNpZXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb2x1bW5zUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdID0gY29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxJdGVtRW50cnlbXT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNvbHVtbnNQZXJJdGVtVHlwZU1hcCkge1xuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5leHBhbmRMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdGRlbHRhLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuY29sdW1uQ2FjaGVcblx0XHRcdFx0XHRcdC5yZXRyaWV2ZShcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQuY2FjaGVkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxuXG5cdHByaXZhdGUgY2xlYXJHbG9iYWxFcnJvciAoXG5cdFx0a2V5Pzogc3RyaW5nLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjbGVhckVycm9yID1cblx0XHRcdGNsZWFyS2V5ID0+IHtcblx0XHRcdFx0dGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHQnb25DbGVhckdsb2JhbEVycm9yJyxcblx0XHRcdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayhcblx0XHRcdFx0XHRcdGNsZWFyS2V5LFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVycm9yS2V5IGluIHRoaXMuZXJyb3JzLmdsb2JhbCkge1xuXHRcdFx0XHRjbGVhckVycm9yKGVycm9yS2V5KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lcnJvcnMuZ2xvYmFsID0ge307XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNsZWFyRXJyb3Ioa2V5KTtcblxuXHRcdFx0ZGVsZXRlIHRoaXMuZXJyb3JzLmdsb2JhbFtrZXldO1xuXHRcdH1cblxuXHRcdHRoaXMuX3NldElzVmFsaWQoKTtcblx0fVxuXG5cdHByaXZhdGUgY2xlYXJJdGVtRXJyb3IgKFxuXHRcdGl0ZW1FbnRyeUlkPzogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvbHVtbklkPzogc3RyaW5nLFxuXHRcdGVycm9yS2V5Pzogc3RyaW5nLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjbGVhckl0ZW1FcnJvciA9IChcblx0XHRcdGNsZWFySXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRcdGNsZWFyQ29sdW1uSWQ6IHN0cmluZyxcblx0XHRcdGNsZWFyRXJyb3JLZXk6IHN0cmluZyxcblx0XHQpID0+IHtcblx0XHRcdHRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGVDYWxsYmFja3MoXG5cdFx0XHRcdCdvbkNsZWFySXRlbUVycm9yJyxcblx0XHRcdFx0Y2FsbGJhY2sgPT4gY2FsbGJhY2soXG5cdFx0XHRcdFx0Y2xlYXJJdGVtRW50cnlJZCxcblx0XHRcdFx0XHRjbGVhckNvbHVtbklkLFxuXHRcdFx0XHRcdGNsZWFyRXJyb3JLZXksXG5cdFx0XHRcdCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblxuXHRcdFx0ZGVsZXRlIHRoaXMuZXJyb3JzLml0ZW1bY2xlYXJJdGVtRW50cnlJZF1bY2xlYXJDb2x1bW5JZF1bY2xlYXJFcnJvcktleV07XG5cdFx0fTtcblxuXHRcdGlmIChpdGVtRW50cnlJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZXJJdGVtRW50cnlJZCBpbiB0aGlzLmVycm9ycy5pdGVtKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW1FcnJvcnMgPSB0aGlzLmVycm9ycy5pdGVtW2l0ZXJJdGVtRW50cnlJZF07XG5cblx0XHRcdFx0Zm9yIChjb25zdCBpdGVyQ29sdW1uSWQgaW4gaXRlbUVycm9ycykge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkVycm9ycyA9IGl0ZW1FcnJvcnNbaXRlckNvbHVtbklkXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlckVycm9yS2V5IGluIGNvbHVtbkVycm9ycykge1xuXHRcdFx0XHRcdFx0Y2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0XHRcdE51bWJlcihpdGVySXRlbUVudHJ5SWQpLFxuXHRcdFx0XHRcdFx0XHRpdGVyQ29sdW1uSWQsXG5cdFx0XHRcdFx0XHRcdGl0ZXJFcnJvcktleSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXJyb3JzLml0ZW0gPSB7fTtcblx0XHRcdHRoaXMuX3NldElzVmFsaWQoKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBpdGVtRXJyb3JzID0gdGhpcy5lcnJvcnMuaXRlbVtpdGVtRW50cnlJZF07XG5cblx0XHRcdGZvciAoY29uc3QgaXRlckNvbHVtbklkIGluIGl0ZW1FcnJvcnMpIHtcblx0XHRcdFx0Y29uc3QgY29sdW1uRXJyb3JzID0gaXRlbUVycm9yc1tpdGVyQ29sdW1uSWRdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgaXRlckVycm9yS2V5IGluIGNvbHVtbkVycm9ycykge1xuXHRcdFx0XHRcdGNsZWFySXRlbUVycm9yKFxuXHRcdFx0XHRcdFx0TnVtYmVyKGl0ZW1FbnRyeUlkKSxcblx0XHRcdFx0XHRcdGl0ZXJDb2x1bW5JZCxcblx0XHRcdFx0XHRcdGl0ZXJFcnJvcktleSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSB0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5fc2V0SXNWYWxpZCgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZXJyb3JzLml0ZW1baXRlbUVudHJ5SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXJyb3JLZXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgY29sdW1uRXJyb3JzID0gdGhpcy5lcnJvcnMuaXRlbVtpdGVtRW50cnlJZF1bY29sdW1uSWRdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZXJFcnJvcktleSBpbiBjb2x1bW5FcnJvcnMpIHtcblx0XHRcdFx0Y2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdFx0TnVtYmVyKGl0ZW1FbnRyeUlkKSxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0XHRpdGVyRXJyb3JLZXksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSB0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXVtjb2x1bW5JZF07XG5cdFx0XHR0aGlzLl9zZXRJc1ZhbGlkKCk7XG5cblx0XHRcdGlmICghaGFzUHJvcGVydGllcyh0aGlzLmVycm9ycy5pdGVtW2l0ZW1FbnRyeUlkXSkpIHtcblx0XHRcdFx0dGhpcy5jbGVhckl0ZW1FcnJvcihpdGVtRW50cnlJZCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjbGVhckl0ZW1FcnJvcihcblx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRlcnJvcktleSxcblx0XHQpO1xuXG5cdFx0ZGVsZXRlIHRoaXMuZXJyb3JzLml0ZW1baXRlbUVudHJ5SWRdW2NvbHVtbklkXVtlcnJvcktleV07XG5cdFx0dGhpcy5fc2V0SXNWYWxpZCgpO1xuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHRoaXMuZXJyb3JzLml0ZW1baXRlbUVudHJ5SWRdW2NvbHVtbklkXSkpIHtcblx0XHRcdHRoaXMuY2xlYXJJdGVtRXJyb3IoXG5cdFx0XHRcdGl0ZW1FbnRyeUlkLFxuXHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvblJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaFJlc3VsdCwgQ29sbGVjdGlvblF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZW51bSBDT05TVEFOVFMge1xuXHRNQVlCRSA9ICdtYXliZSdcbn1cblxudHlwZSBDb2xsZWN0aW9uRW50cnlNYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtjb2xsZWN0aW9uRW50cnlJZDogbnVtYmVyXTogQ29sbGVjdGlvbkVudHJ5PGFueT5cblx0fVxufTtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25DYWNoZSB7XG5cdHByaXZhdGUgZW50cmllczogQ29sbGVjdGlvbkVudHJ5TWFwID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBnZXRCeUVudHJ5SWQgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5lbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnRhaW5zIChjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnRyaWVzW2NvbGxlY3Rpb25FbnRyeS5pZF0gIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHNvbWUgKGNhbGxiYWNrOiAoZW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGlmIChjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvckVhY2ggKGNhbGxiYWNrOiAoZW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKlx0ZmlsdGVyIChjYWxsYmFjazogKGVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IENvbGxlY3Rpb25FbnRyeU1hcCAgPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdCBmaWx0ZXJlZEVudHJpZXNbaXRlbVR5cGVdID0ge307XG5cblx0IGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHQgY29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF07XG5cblx0IGlmIChjYWxsYmFjayhjb2xsZWN0aW9uRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSA9IGNvbGxlY3Rpb25FbnRyeTtcblx0IH1cblx0IH1cblxuXHQgdGhpcy5lbnRyaWVzID0gZmlsdGVyZWRFbnRyaWVzO1xuXHQgfVxuXHQgKi9cblx0dG9BcnJheSAoKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxhbnk+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRhZGQ8VCBleHRlbmRzIENvbGxlY3Rpb25FbnRyeTxhbnk+PiAoY29sbGVjdGlvbkVudHJ5OiBUKTogVCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnRyaWVzW2l0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkuaWRdID0gY29sbGVjdGlvbkVudHJ5O1xuXHR9XG5cblx0Y2xlYXIgKGNvbGxlY3Rpb25FbnRyeT86IENvbGxlY3Rpb25FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmVudHJpZXMgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5zKGNvbGxlY3Rpb25FbnRyeSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVsZXRlIHRoaXMuZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cdH1cblxuXHRnZXRCeUl0ZW1UeXBlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2VudHJ5SWRdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0bWF0Y2hQYXJlbnQgKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PGFueT4sXG5cdFx0aXRlbVR5cGU6IHN0cmluZyxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gY29sbGVjdGlvbkVudHJ5LnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyA9PSB0byBjb21wYXJlIGl0ZW1JZHNcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdHJldHVybiBwYXJlbnQuaXRlbVR5cGUgPT09IGl0ZW1UeXBlICYmIHBhcmVudC5pdGVtSWQgPT0gaXRlbUlkO1xuXHR9XG5cblx0Ly8gVE9ETzogdGhpbmsgb2YgYmV0dGVyIG5hbWVcblx0Z2V0QnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHwgbnVsbCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0aWYgKHRoaXMubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdGVudHJpZXNbZW50cnlJZF0sXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXR1cm4gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldENvbGxlY3Rpb25zQnlQYXJlbnQgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdO1xuXG5cdFx0XHRcdGlmICh0aGlzLm1hdGNoUGFyZW50KFxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdHBhcmVudElkLFxuXHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30gd2hpY2ggY29udGFpbiB0aGUgaXRlbSB3aXRoIHRoZSBwYXNzZWQgSXRlbVR5cGUvSXRlbUlkXG5cdCAqL1xuXHRnZXRCeUNvbnRhaW5pbmdJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cdFx0XHRjb25zdCBpdGVtcyA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChpdGVtcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGl0ZW1zLnNvbWUoXG5cdFx0XHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCA9PSBpdGVtSWQsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyBpZiB0aGUgcGFzc2VkIGZpZWxkcyB3b3VsZCBmaXQgaW4gdGhlIGNvbGxlY3Rpb25zIHVzaW5nIHRoZSB7QGxpbmsgUXVlcnlNYXRjaGVyIFF1ZXJ5TWF0Y2hlcn1cblx0ICovXG5cdGdldEJ5Rml0dGluZ0l0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT4gPSB7XG5cdFx0XHRmaXR0aW5nOiBbXSxcblx0XHRcdG5vdGZpdHRpbmc6IFtdLFxuXHRcdFx0bWF5YmU6IFtdLFxuXHRcdH07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdC8vIGNvbnNvbGUudGltZSgnZ2V0QnlGaXR0aW5nSXRlbScpO1xuXG5cdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50LFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdGNvbnN0IG1hdGNoUmVzdWx0ID0gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCk7XG5cblx0XHRcdC8vIHRvZG9bY2FjaGVdOiBtYXliZT9cblx0XHRcdGlmIChtYXRjaFJlc3VsdCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXN1bHQuZml0dGluZy5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoUmVzdWx0ID09PSBDT05TVEFOVFMuTUFZQkUpIHtcblx0XHRcdFx0cmVzdWx0Lm1heWJlLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5ub3RmaXR0aW5nLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLnRpbWVFbmQoJ2dldEJ5Rml0dGluZ0l0ZW0nKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nID09PSBxdWVyeS5zdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldEJ5UXVlcnlTdHJpbmc8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHwgbnVsbCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcgPT09IHF1ZXJ5U3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRnZXRCeUtleTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0ZW50cnlLZXk6IHN0cmluZyxcblx0KTogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmVudHJ5S2V5ID09PSBlbnRyeUtleSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSByZW1vdmUgdGhpcywgeW91IHNob3VsZCBnZXQgYSBuZXcgcmVzb3VyY2UuLi5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UmVzb3VyY2VCeUtleTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVzb3VyY2VLZXk6IHN0cmluZyxcblx0KTogQXJyYXk8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCB8fCAhKHRoaXMudHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkNhY2hlKSkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uUmVzb3VyY2VzW2VudHJ5SWRdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0XHRpZiAocmVzb3VyY2Uub3B0aW9ucy5yZXNvdXJjZUtleSA9PT0gcmVzb3VyY2VLZXkpIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChyZXNvdXJjZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUXVlcnlQYXJzZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZSwgQ29sbGVjdGlvblF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVVbmZvdW5kTG9jYWxDb2xsZWN0aW9uRXJyb3IgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHttZXNzYWdlOiBzdHJpbmd9IHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGNvbGxlY3Rpb24gb2YgdHlwZSAke2l0ZW1UeXBlfSBjb3VsZCBub3QgYmUgZm91bmRgfTtcblx0fVxuXG5cdC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIGNvbHVtbnMgcHJvcGVydHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgaW4gd2hlbiBjb2x1bW5zIGFyZSBleHBhbmRlZFxuXHRjbG9uZU9wdGlvbnMgKFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpOyAvLyBkb2VzIGEgc2hhbGxvdyBjb3B5XG5cblx0XHRyZXN1bHQucXVlcnlQYXJhbXMgPSB0aGlzLmNsb25lUXVlcnlQYXJhbXMob3B0aW9ucy5xdWVyeVBhcmFtcyk7XG5cdFx0cmVzdWx0LnBhcmVudCA9IHBhcmVudDtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4pOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHRjbG9uZVF1ZXJ5UGFyYW1zPFQgZXh0ZW5kcyBvYmplY3Q+IChwYXJhbWV0ZXJzOiBUKTogVCB7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcblxuXHRcdGZvciAoY29uc3Qga2V5IGluIHBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xuXHRcdFx0bGV0IGNsb25lO1xuXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0Y2xvbmUgPSB2YWx1ZS5zbGljZSgpO1xuXHRcdFx0fS8vIHdlJ3JlIG9ubHkgdXNpbmcgcHJpbWl0aXZlIGFycmF5c1xuXHRcdFx0ZWxzZSBpZiAobW9tZW50LmlzTW9tZW50KHZhbHVlKSkge1xuXHRcdFx0XHRjbG9uZSA9IHZhbHVlLmNsb25lKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZSA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHRba2V5XSA9IGNsb25lO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRjcmVhdGVRdWVyeSAob3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyk6IENvbGxlY3Rpb25RdWVyeSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cblx0XHRsZXQgcXVlcnk7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRxdWVyeSA9IG9wdGlvbnMucXVlcnk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpbmtlZFRvUXVlcnkgPSB7XG5cdFx0XHRcdGxpbmtlZFRvOiBwYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5OiB7aWQ6ICcmcGFyZW50SWQnfSxcblx0XHRcdH07XG5cdFx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zLnBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0cXVlcnkgPSBvcHRpb25zLnF1ZXJ5ID09PSBudWxsID9cblx0XHRcdFx0bGlua2VkVG9RdWVyeSA6XG5cdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHRvcHRpb25zLnF1ZXJ5LFxuXHRcdFx0XHRcdGxpbmtlZFRvUXVlcnksXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdG9wdGlvbnMucXVlcnlQYXJhbXMsXG5cdFx0XHQpXG5cdFx0XHQucGFyc2UoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvYmplY3Q6IHBhcnNlZFF1ZXJ5WzBdLFxuXHRcdFx0c3RyaW5nOiBwYXJzZWRRdWVyeVsxXSxcblx0XHR9O1xuXHR9XG5cblx0Z2V0SWRBcnJheSAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxhbnk+Pixcblx0XHRhY2N1bXVsYXRvcjogSXRlbUlkW10gPSBbXSxcblx0KTogSXRlbUlkW10ge1xuXHRcdGlmIChhY2N1bXVsYXRvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRhY2N1bXVsYXRvciA9IFtdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRhY2N1bXVsYXRvci5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmlsdGVycyBhbiBhcnJheSBvZiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSBhY2NvcmRpbmcgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKiBEb2VzIGFuIGluLXBsYWNlIHJlcGxhY2VtZW50IG9mIHRoZSBpdGVtcyBpbiB0aGUgYXJyYXkgdGhhdCBkbyBtYXRjaCB0aGUgY29uZGl0aW9uIChrZWVwaW5nIHRoZSBhcnJheSByZWZlcmVuY2UpXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZmFpbGVkIHRoZSBjb25kaXRpb25cblx0ICovXG5cdGZpbHRlckFycmF5PFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55PiA9IEl0ZW1FbnRyeTxhbnk+PiAoXG5cdFx0aXRlbUVudHJpZXM6IFRbXSxcblx0XHRjYWxsYmFjazogKGl0ZW1FbnRyeTogVCkgPT4gYm9vbGVhbixcblx0KTogVFtdIHtcblx0XHRjb25zdCBmaWx0ZXJlZEVudHJpZXM6IFRbXSA9IFtdO1xuXHRcdGNvbnN0IHJlbW92ZWRFbnRyaWVzOiBUW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHQoY2FsbGJhY2soaXRlbUVudHJ5KSA/IGZpbHRlcmVkRW50cmllcyA6IHJlbW92ZWRFbnRyaWVzKS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbW92ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHJlbW92ZWRFbnRyaWVzO1xuXHRcdH1cblxuXHRcdGl0ZW1FbnRyaWVzLmxlbmd0aCA9IGZpbHRlcmVkRW50cmllcy5sZW5ndGg7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpdGVtRW50cmllc1tpXSA9IGZpbHRlcmVkRW50cmllc1tpXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVtb3ZlZEVudHJpZXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsIEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlU2VydmljZSB7XG5cblx0cHJvY2Vzc09wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT5cblx0KTogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHRnZXRJZEFycmF5IChpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8YW55Pj4pOiBJdGVtSWRbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcylcblx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG59XG4iLCJpbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uLCBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uQ2FjaGUge1xuXHRjYWNoZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXHRhbGxDb2x1bW5zOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0c2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdFx0aWYgKGNhY2hlW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjYWNoZVtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnRyeSA9IGNhY2hlW2l0ZW1UeXBlXTtcblx0XHRjb25zdCBjb2x1bW5JZCA9IHJlc3BvbnNlQ29sdW1uLmlkO1xuXG5cdFx0aWYgKGVudHJ5W2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyeVtjb2x1bW5JZF0gPSByZXNwb25zZUNvbHVtbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW50cnlbY29sdW1uSWRdO1xuXHR9XG5cblx0c2V0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdGNvbnN0IHJlc3VsdDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCByZXNwb25zZVR5cGUgaW4gcmVzcG9uc2VDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5zID0gcmVzcG9uc2VDb2x1bW5zW3Jlc3BvbnNlVHlwZV07XG5cblx0XHRcdHJlc3VsdFtyZXNwb25zZVR5cGVdID0ge307XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY29sdW1ucykge1xuXHRcdFx0XHRyZXN1bHRbcmVzcG9uc2VUeXBlXVtjb2x1bW5JZF0gPSB0aGlzLnNldENvbHVtbihcblx0XHRcdFx0XHRyZXNwb25zZVR5cGUsXG5cdFx0XHRcdFx0Y29sdW1uc1tjb2x1bW5JZF0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLmFsbENvbHVtbnNbaXRlbVR5cGVdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cmV0cmlldmUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IHtjYWNoZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsIG1pc3Npbmc6IEFwaVJlcXVlc3RDb2x1bW5zfSB7XG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRpZiAodGhpcy5jb250YWluc0FsbChpdGVtVHlwZSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRjYWNoZWQ6IHRoaXMuZ2V0Q29sdW1ucyhpdGVtVHlwZSksXG5cdFx0XHRcdFx0bWlzc2luZzogW10sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNhY2hlZDoge30sXG5cdFx0XHRcdG1pc3Npbmc6IHRydWUsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3BvbnNlQWNjdW11bGF0b3IgPSB7fTtcblx0XHRjb25zdCByZXF1ZXN0QWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uW10gPSBbXTtcblxuXHRcdHRoaXMucmV0cmlldmVDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjYWNoZWQ6IHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0XHRtaXNzaW5nOiByZXF1ZXN0QWNjdW11bGF0b3IsXG5cdFx0fTtcblx0fVxuXG5cdGNvbnRhaW5zQWxsIChpdGVtVHlwZTogSXRlbVR5cGUpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5hbGxDb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdHJ1ZTtcblx0fVxuXG5cdGdldENvbHVtbnMgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRcdHJldHVybiB7W2l0ZW1UeXBlXTogY2FjaGVbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyBbXSA6IGNhY2hlW2l0ZW1UeXBlXX07XG5cdH1cblxuXHRwcml2YXRlIHJldHJpZXZlQ29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogdm9pZCB7XG5cdFx0Ly8gYWx3YXlzIHJldHJpZXZlIHRoZSBpZCBjb2x1bW5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHR0aGlzLnJldHJpZXZlQ29sdW1uKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbixcblx0XHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJldHJpZXZlQ29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbixcblx0XHRyZXF1ZXN0QWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uW10sXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5VdGlsLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2x1bW4uaWQsXG5cdFx0KTtcblxuXHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXF1ZXN0QWNjdW11bGF0b3IucHVzaChyZXF1ZXN0Q29sdW1uKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAocmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXNwb25zZUFjY3VtdWxhdG9yW2l0ZW1UeXBlXVtjb2x1bW4uaWRdID0gcmVzcG9uc2VDb2x1bW47XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1pc3NpbmdEZXJpdmVkOiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1ucyhcblx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uLmNoaWxkcmVuLFxuXHRcdFx0bWlzc2luZ0Rlcml2ZWQsXG5cdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdCk7XG5cblx0XHRpZiAobWlzc2luZ0Rlcml2ZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yLnB1c2goe1tjb2x1bW4uaWRdOiBtaXNzaW5nRGVyaXZlZH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDb2x1bW4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChjYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlW2NvbHVtbklkXTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbywgQ29sdW1uU2V0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q29sdW1uRXhwYW5zaW9uUmVzdWx0LFxuXHRJdGVtVHlwZSxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0Um9vdENvbHVtbk1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRGaXJzdFByb3BlcnR5IH0gZnJvbSAnLi9VdGlsJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgQ29sdW1uRXhwYW5zaW9uIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgaGF2ZSB0aGUgc2FtZSB7QGxpbmsgQ29sdW1uU2V0IENvbHVtblNldH0gKG1hdGNoZWQgb24ge0BsaW5rIENvbHVtblNldC5pZCBDb2x1bW5TZXQuaWR9KSB3aWxsIGFsbCBnZXQgdGhlIHNhbWUgbmV3IGV4cGFuZGVkIENvbHVtblNldFxuICovXG5leHBvcnQgY2xhc3MgQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cblx0ZXhwYW5zaW9uTWFwOiB7W2NvbHVtblNldElkOiBzdHJpbmddOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGx9ID0ge307XG5cdGV4cGFuc2lvbk1hcFNpemU6IG51bWJlciA9IDA7XG5cdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbjtcblx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3RvcnksXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHB1YmxpYyByZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCkge1xuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gcmVxdWVzdENvbHVtbnMgc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheSwgd2hlbiBpdCBpcyB0cnVlIGRlcml2ZWQgY29sdW1uIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9zdFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSB0cnVlO1xuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucy5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSBmYWxzZTtcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMgPSByZXF1ZXN0Q29sdW1ucztcblx0XHR9XG5cdH1cblxuXHRydW4gKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGV4cGFuc2lvbk1hcCA9IHRoaXMuZXhwYW5zaW9uTWFwO1xuXHRcdGNvbnN0IGNvbHVtblNldElkID0gY29sdW1uU2V0LmlkO1xuXG5cdFx0aWYgKGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF07XG5cdFx0fVxuXG5cdFx0dGhpcy5leHBhbnNpb25NYXBTaXplKys7XG5cblx0XHRyZXR1cm4gZXhwYW5zaW9uTWFwW2NvbHVtblNldElkXSA9IGNvbHVtblNldC5pc1N1cGVyc2V0T2YodGhpcy5yZXF1ZXN0Q29sdW1ucykgP1xuXHRcdFx0bnVsbCA6XG5cdFx0XHRjb2x1bW5TZXQuZXhwYW5kKFxuXHRcdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHRcdFx0dGhpcy5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0YWdncmVnYXRlUm9vdENvbHVtbnMgKCk6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGV4cGFuc2lvbk1hcCA9IHRoaXMuZXhwYW5zaW9uTWFwO1xuXG5cdFx0aWYgKHRoaXMuZXhwYW5zaW9uTWFwU2l6ZSA9PT0gMSkge1xuXHRcdFx0Y29uc3QgZXhwYW5zaW9uUmVzdWx0ID0gZXhwYW5zaW9uTWFwW2dldEZpcnN0UHJvcGVydHkoZXhwYW5zaW9uTWFwKSBhcyBzdHJpbmddO1xuXG5cdFx0XHRyZXR1cm4gZXhwYW5zaW9uUmVzdWx0ICE9PSBudWxsID8gZXhwYW5zaW9uUmVzdWx0LmRpZmZlcmVuY2Uucm9vdCA6IFtdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uU2V0SWQgaW4gZXhwYW5zaW9uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSBleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uRXhwYW5zaW9uID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5kaWZmZXJlbmNlLnJvb3QsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNvbHVtbkluZm9GYWN0b3J5LmNvbnN0cnVjdEZyb21Sb290TWFwKHJvb3RDb2x1bW5NYXApO1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwIChcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGRlc3RpbmF0aW9uOiBSb290Q29sdW1uTWFwLFxuXHQpIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblxuXHRcdFx0aWYgKGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9IHtcblx0XHRcdFx0XHRhcGlDb2x1bW46IGNvbHVtbi5hcGlDb2x1bW4sXG5cdFx0XHRcdFx0Y2hpbGRyZW46IHt9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdGNvbHVtbi5jaGlsZHJlbixcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlLCBDb2x1bW5DYWNoZSwgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlLCBSZXNwb25zZUNvbHVtbiwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkhhbmRsZXIge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGNhY2hlOiBDb2x1bW5DYWNoZSxcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0c2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0cmV0dXJuIHRoaXMuY2FjaGUuc2V0Q29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHQpO1xuXHR9XG5cblx0c2V0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdHJldHVybiB0aGlzLmNhY2hlLnNldENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRmZXRjaEl0ZW1UeXBlVHJhbnNsYXRpb25zIChpdGVtVHlwZXM6IEl0ZW1UeXBlW10pOiBQcm9taXNlSW50ZXJmYWNlPHtbaXRlbVR5cGU6IHN0cmluZ106IHN0cmluZ30+IHtcblx0XHRjb25zdCBwcm9taXNlczoge1tpdGVtVHlwZTogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgb2YgaXRlbVR5cGVzKSB7XG5cdFx0XHRwcm9taXNlc1tpdGVtVHlwZV0gPSB0aGlzLmZldGNoKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0WydpZCddLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdDoge1tpdGVtVHlwZTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiByZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHJlc3BvbnNlW2l0ZW1UeXBlXVtpdGVtVHlwZV0uaWQubmFtZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cmVxdWVzdCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHBhcmFtcyA9IHtmaWx0ZXI6IGZhbHNlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UuY29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0e1tpdGVtVHlwZV06IGNvbHVtbnN9LFxuXHRcdFx0cGFyYW1zLFxuXHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjb2x1bW5SZXNvdXJjZSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY2FjaGUuc2V0Q29sdW1ucyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdFx0XHRcdGNvbHVtblJlc291cmNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRmZXRjaCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRwYXJhbXM/OiBhbnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD4ge1xuXHRcdGNvbnN0IGNvbHVtblJlc291cmNlID0gdGhpcy5jYWNoZS5yZXRyaWV2ZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5SZXNvdXJjZS5taXNzaW5nICE9PSB0cnVlICYmIGNvbHVtblJlc291cmNlLm1pc3NpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbHVtblJlc291cmNlLmNhY2hlZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uUmVzb3VyY2UubWlzc2luZyxcblx0XHRcdHBhcmFtcyxcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0Y29sdW1uUmVzb3VyY2UuY2FjaGVkLFxuXHRcdFx0XHRcdCkubWVyZ2VkO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdGZldGNoQWxsIChpdGVtVHlwZTogSXRlbVR5cGUpOiBQcm9taXNlSW50ZXJmYWNlPFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA+IHtcblx0XHRpZiAodGhpcy5jYWNoZS5jb250YWluc0FsbChpdGVtVHlwZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4odGhpcy5jYWNoZS5nZXRDb2x1bW5zKGl0ZW1UeXBlKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDT0xVTU5fU0VQRVJBVE9SIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkluZm88SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aWQ6IHN0cmluZztcblx0bGV2ZWw6IG51bWJlcjtcblx0cGF0aDogc3RyaW5nO1xuXHR0YWlsUGF0aDogc3RyaW5nO1xuXHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlIHwgbnVsbCA9IG51bGw7XG5cdGNoaWxkcmVuOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGlzTGVhZjogYm9vbGVhbiA9IHRydWU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHJlYWRvbmx5IGFwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0cmVhZG9ubHkgcGFyZW50OiBDb2x1bW5JbmZvPEl0ZW1UeXBlPiB8IG51bGwgPSBudWxsXG5cdCkge1xuXHRcdGNvbnN0IGNvbHVtbklkID0gYXBpQ29sdW1uLmlkO1xuXG5cdFx0dGhpcy5pZCA9IGNvbHVtbklkO1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0dGhpcy5sZXZlbCA9IDA7XG5cdFx0XHR0aGlzLnBhdGggPSBjb2x1bW5JZDtcblx0XHRcdHRoaXMudGFpbFBhdGggPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5sZXZlbCA9IHBhcmVudC5sZXZlbCArIDE7XG5cdFx0XHR0aGlzLnBhdGggPSBwYXJlbnQucGF0aCArIENPTFVNTl9TRVBFUkFUT1IgKyBjb2x1bW5JZDtcblx0XHRcdHRoaXMudGFpbFBhdGggPSBwYXJlbnQubGV2ZWwgPT09IDAgP1xuXHRcdFx0XHRjb2x1bW5JZCA6XG5cdFx0XHRcdHBhcmVudC50YWlsUGF0aCArIENPTFVNTl9TRVBFUkFUT1IgKyBjb2x1bW5JZDtcblx0XHR9XG5cdH1cblxuXHRzZXRDaGlsZHJlbiAoaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSwgY2hpbGRyZW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4pOiB0aGlzIHtcblx0XHR0aGlzLml0ZW1UeXBlID0gaXRlbVR5cGU7XG5cdFx0dGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXHRcdHRoaXMuaXNMZWFmID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbywgQ29sdW1uVXRpbCwgUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBDb2x1bW5FeHBhbnNpb25SZXN1bHQsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBlbXB0eU9iamVjdCA9IHt9O1xubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aWQgPSArK2N1cnJlbnRJZDtcblxuXHRyZXF1ZXN0OiBBcGlSZXF1ZXN0Q29sdW1ucztcblx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuO1xuXHRyZXNwb25zZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IGVtcHR5T2JqZWN0O1xuXG5cdGxpbms6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsO1xuXHRtYWluOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGRlcml2ZWQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0cm9vdDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRsZWFmOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGZvcm1hdHRlZDoge21haW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sIGRlcml2ZWQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj59ID0ge1xuXHRcdG1haW46IFtdLFxuXHRcdGRlcml2ZWQ6IFtdLFxuXHR9O1xuXHRmaWx0ZXJlZDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRjdXN0b206IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0c2VhcmNoYWJsZTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRpdGVtOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdG5vdEl0ZW06IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgZ3JvdXBDb2x1bW5JbmZvIChjb2x1bW5JbmZvOiBDb2x1bW5JbmZvKTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uVXRpbCA9IHRoaXMuY29sdW1uVXRpbDtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IGNvbHVtbkluZm8uYXBpQ29sdW1uO1xuXHRcdGNvbnN0IGlzRGVyaXZlZCA9IGNvbHVtbkluZm8ucGFyZW50ICE9PSBudWxsO1xuXG5cdFx0aWYgKGlzRGVyaXZlZCkge1xuXHRcdFx0dGhpcy5kZXJpdmVkLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubWFpbi5wdXNoKGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4udHlwZSA9PT0gJ2xpbmsnKSB7XG5cdFx0XHRcdHRoaXMubGluayA9IGNvbHVtbkluZm87XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGNvdWxkIHBvc3NpYmx5IGFkZCBkZXJpdmVkIGNvbHVtbnMgdG8gJ25vdEl0ZW0nXG5cdFx0XHR0aGlzW2NvbHVtblV0aWwuaXNJdGVtQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSA/ICdpdGVtJyA6ICdub3RJdGVtJ10ucHVzaChjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKCFjb2x1bW5JbmZvLmlzTGVhZikge1xuXHRcdFx0XHR0aGlzLnJvb3QucHVzaChjb2x1bW5JbmZvKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc0Zvcm1hdHRlZENvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuZm9ybWF0dGVkW2lzRGVyaXZlZCA/ICdkZXJpdmVkJyA6ICdtYWluJ10ucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc0ZpbHRlcmVkQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5maWx0ZXJlZC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzU2VhcmNoYWJsZUNvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuc2VhcmNoYWJsZS5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzQ3VzdG9tQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5jdXN0b20ucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uSW5mby5pc0xlYWYpIHtcblx0XHRcdHRoaXMubGVhZi5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblx0fVxuXG5cdHRvSlNPTiAoKSB7XG5cdFx0Y29uc3QgcGFyc2VDb2x1bW5zID0gKGNvbHVtbnM6IENvbHVtbkluZm9bXSkgPT4gY29sdW1ucy5tYXAoXG5cdFx0XHRjID0+IGMuaWQpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1haW46IHBhcnNlQ29sdW1ucyh0aGlzLm1haW4pLFxuXHRcdFx0ZGVyaXZlZDogcGFyc2VDb2x1bW5zKHRoaXMuZGVyaXZlZCksXG5cdFx0fTtcblx0fVxuXG5cdGV4cGFuZFJlcXVlc3RDb2x1bW5zIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IHZvaWQge1xuXHRcdGNvbnN0IG1lcmdlZFJlcXVlc3RDb2x1bW5zID0gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRjb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXG5cdFx0dGhpcy5yZXF1ZXN0ID0gbWVyZ2VkUmVxdWVzdENvbHVtbnM7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSBtZXJnZWRSZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZTtcblx0fVxuXG5cdGlzU3VwZXJzZXRPZiAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiBib29sZWFuIHtcblx0XHRpZiAoY29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdENvbHVtbnNUcnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtblV0aWwgPSB0aGlzLmNvbHVtblV0aWw7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLnJlcXVlc3Q7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiAhY29sdW1uVXRpbC5jb250YWluc0Rlcml2ZWRDb2x1bW5zKGNvbHVtbnMpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGlmICghY29sdW1uVXRpbC5jb250YWluc0NvbHVtbihcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXJnZWRDb2x1bW5TZXQgKFxuXHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQsXG5cdFx0bWVyZ2VkUmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRtZXJnZWRSZXF1ZXN0Q29sdW1ucy5tZXJnZWQsXG5cdFx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJlc3VsdC5yZXF1ZXN0Q29sdW1uc1RydWUgPSB0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSB8fCByZXF1ZXN0Q29sdW1uc1RydWU7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0IHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXHR9XG5cblx0bWVyZ2VSZXNwb25zZUNvbHVtbnMgKHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHR0aGlzLnJlc3BvbnNlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXHR9XG5cblx0bWVyZ2UgKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWVyZ2VkQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5tZXJnZVJlcXVlc3RDb2x1bW5zKGNvbHVtblNldC5yZXF1ZXN0KSxcblx0XHRcdHRoaXMubWVyZ2VSZXNwb25zZUNvbHVtbnMoY29sdW1uU2V0LnJlc3BvbnNlKSxcblx0XHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUsXG5cdFx0KTtcblx0fVxuXG5cdGV4cGFuZCAoXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbixcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBtZXJnZWRSZXF1ZXN0Q29sdW1ucyA9IHRoaXMubWVyZ2VSZXF1ZXN0Q29sdW1ucyhyZXF1ZXN0Q29sdW1ucyk7XG5cdFx0Y29uc3QgbWVyZ2VkUmVzcG9uc2VDb2x1bW5zID0gdGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1ucyhyZXNwb25zZUNvbHVtbnMpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogdGhpcy5nZXRNZXJnZWRDb2x1bW5TZXQoXG5cdFx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHRcdCksXG5cdFx0XHRkaWZmZXJlbmNlOiB0aGlzLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLmRpZmZlcmVuY2UsXG5cdFx0XHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1ucywgLy8gd2UgbmVlZCB0byBiZSBhYmxlIHRvIGxvb2sgdXAgdGhlIHBhcmVudCBvZiBkZXJpdmVkIGNvbHVtbnNcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXHRwcml2YXRlIGNhY2hlOiB7W2NvbHVtblNldElkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgcmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zXG5cdCkge1xuXG5cdH1cblxuXHRydW4gKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBib29sZWFuIHtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdFx0Y29uc3QgY29sdW1uU2V0SWQgPSBjb2x1bW5TZXQuaWQ7XG5cblx0XHRpZiAoY2FjaGVbY29sdW1uU2V0SWRdICE9PSB1bmRlZmluZWQpXG5cdFx0XHRyZXR1cm4gY2FjaGVbY29sdW1uU2V0SWRdO1xuXG5cdFx0cmV0dXJuIGNhY2hlW2NvbHVtblNldElkXSA9IGNvbHVtblNldC5pc1N1cGVyc2V0T2YodGhpcy5yZXF1ZXN0Q29sdW1ucyk7XG5cdH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgQ09MVU1OX1NFUEVSQVRPUiwgUkVOREVSX0FTX1NFUEVSQVRPUiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQge1xuXHRBcGlMaW5rVHJlZVR5cGUsXG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRJdGVtVHlwZSxcblx0UmVzcG9uc2VDb2x1bW4sXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJlc3BvbnNlQ29sdW1uTWFwLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGV4dGVuZCwgaXNEZWZpbmVkIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PFQgZXh0ZW5kcyBBcGlSZXF1ZXN0Q29sdW1ucyA9IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRVIGV4dGVuZHMgQXBpUmVxdWVzdENvbHVtbnMgPSBBcGlSZXF1ZXN0Q29sdW1ucz4gPSB7bWVyZ2VkOiBULCBkaWZmZXJlbmNlOiBVfTtcblxuZXhwb3J0IGNsYXNzIENvbHVtblV0aWwge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIHRoZSB7QGxpbmsgQXBpTGlua1RyZWUgTGlua1RyZWV9IGFuZCByZXR1cm5zIHRoZSBsaW5rIGNvbHVtbklkcyBmb3IgdGhlIGdpdmVuIEl0ZW1UeXBlXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogLSBGb3Ige0BsaW5rIEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QgZGlyZWN0IGxpbmtzfSBpdCB3aWxsIGJlIGEgY29sdW1uSWRcblx0ICogLSBGb3Ige0BsaW5rIEFwaUxpbmtUcmVlVHlwZS5JVEVNVEFCTEUgaXRlbXRhYmxlIGxpbmtzfSBpdCB3aWxsIGJlICdpdGVtdHlwZScgYW5kICdpdGVtJ1xuXHQgKi9cblx0cHVibGljIGdldENvbHVtbnNGcm9tTGluayAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1uW10ge1xuXHRcdGNvbnN0IGxpbmtUcmVlID0gdGhpcy5saW5rVHJlZVNlcnZpY2UuZ2V0KCk7XG5cdFx0Y29uc3QgbGlua1RyZWVFbnRyeSA9IGxpbmtUcmVlW3BhcmVudFR5cGVdW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0c3dpdGNoIChsaW5rVHJlZUVudHJ5LnR5cGUpIHtcblx0XHRcdGNhc2UgQXBpTGlua1RyZWVUeXBlLkRJUkVDVDpcblx0XHRcdFx0cmVzdWx0LnB1c2gobGlua1RyZWVFbnRyeS5maWVsZCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFOlxuXHRcdFx0XHRyZXN1bHQucHVzaCgnaXRlbXR5cGUnKTtcblx0XHRcdFx0cmVzdWx0LnB1c2goJ2l0ZW0nKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldENvbHVtblBhdGggKFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdFx0cmVuZGVyQXM6IG51bGwgfCBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzZXBhcmF0b3IgPSAnJztcblx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRyZXN1bHQgKz0gc2VwYXJhdG9yICsgY29sdW1uLmlkO1xuXHRcdFx0c2VwYXJhdG9yID0gQ09MVU1OX1NFUEVSQVRPUjtcblx0XHR9XG5cblx0XHRpZiAocmVuZGVyQXMgIT09IG51bGwpIHtcblx0XHRcdHJlc3VsdCArPSBSRU5ERVJfQVNfU0VQRVJBVE9SICsgcmVuZGVyQXM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldERhdGVGb3JtYXRPcHRpb25zIChjb2x1bW5UeXBlPzogJ2RhdGV0aW1lJykge1xuXHRcdGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuXG5cdFx0Y29uc3QgZm9ybWF0cyA9IHtcblx0XHRcdCdKLU0tWSc6IG5vdy5mb3JtYXQoJ0RELU1NLVlZWVknKSxcblx0XHRcdCdKLU0nOiBub3cuZm9ybWF0KCdERC1NTScpLFxuXHRcdFx0J2orRitZJzogbm93LmZvcm1hdCgnRCBNTU0gWVlZWScpLFxuXHRcdFx0J0QraitGK1knOiBub3cuZm9ybWF0KCdkZGRkIEQgTU1NIFlZWVknKSxcblx0XHRcdCdGJzogbm93LmZvcm1hdCgnTU1NJyksXG5cdFx0XHQnZic6IG5vdy5mb3JtYXQoJ01NTU0nKSxcblx0XHRcdCdEJzogbm93LmZvcm1hdCgnZGRkZCcpLFxuXHRcdFx0J2QnOiBub3cuZm9ybWF0KCdkZGQnKSxcblx0XHR9O1xuXG5cdFx0aWYgKGNvbHVtblR5cGUgPT09ICdkYXRldGltZScpIHtcblx0XHRcdGV4dGVuZChcblx0XHRcdFx0Zm9ybWF0cyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdCdKLU0tWStIOmknOiBub3cuZm9ybWF0KCdERC1NTS1ZWVlZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0otTStIOmknOiBub3cuZm9ybWF0KCdERC1NTSBISDptbScpLFxuXHRcdFx0XHRcdCdqK0YrWStIOmknOiBub3cuZm9ybWF0KCdERCBNTU1NIFkgSEg6bW0nKSxcblx0XHRcdFx0XHQnRCtqK0YrWStIOmknOiBub3cuZm9ybWF0KCdkZGRkIEREIE1NTSBZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0g6aSc6IG5vdy5mb3JtYXQoJ0hIOm1tJyksXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmb3JtYXRzO1xuXHR9XG5cblx0aXNTdHJpbmdDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICdwaG9uZSc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICd0ZXh0cmVwbGFjZSc6XG5cdFx0XHRcdC8vIGNhc2UgJ2h0bWwnOiAvLyBUT0RPOiBzb3J0IG9uIGZpbHRlcmVkIHZhbHVlXG5cdFx0XHRcdC8vIGNhc2UgJ2VudW0nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0Zsb2F0Q29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZG91YmxlJzogLy8gZmxvYXRpbmcgcG9pbnQgdHlwZXNcblx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAnZGlzdGFuY2UnOlxuXHRcdFx0Y2FzZSAnZGltZW5zaW9uJzpcblx0XHRcdGNhc2UgJ3Bvd2VyJzpcblx0XHRcdGNhc2UgJ2N1cnJlbnQnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzSW50Q29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnaW50JzogLy8gaW50ZWdlciB0eXBlc1xuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ3F1YW50aXR5Jzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNOdW1iZXJDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5pc0Zsb2F0Q29sdW1uKGNvbHVtbikgfHwgdGhpcy5pc0ludENvbHVtbihjb2x1bW4pO1xuXHR9XG5cblx0aXNDdXN0b21Db2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29sdW1uLmZpZWxkdHlwZSA9PT0gJ2N1c3RvbWZpZWxkJztcblx0fVxuXG5cdGlzSXRlbUNvbHVtbiAoXG5cdFx0Y29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRpbmNsdWRlSWQgPSB0cnVlLFxuXHQpOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdpZCc6XG5cdFx0XHRcdHJldHVybiBpbmNsdWRlSWQ7XG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRGF0ZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc1JlbmRlcmVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRmlsdGVyZWRDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHQvLyB1Z2x5IGhhY2sgOi0oXG5cdFx0aWYgKGNvbHVtbi5pZCA9PT0gJ3N0YWZmZWwnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmdlbmVyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0Y2FzZSAnY291bnRyeSc6XG5cdFx0XHRjYXNlICd2b2x1bWUnOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ2Rpc3RhbmNlJzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdxdWFudGl0eSc6XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdGNhc2UgJ2h0bWwnOlxuXHRcdFx0Y2FzZSAndGV4dHJlcGxhY2UnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRm9ybWF0dGVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ2ZpbGVzaXplJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNTZWxlY3RhYmxlQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnYmxvYic6XG5cdFx0XHRjYXNlICdjb29yZGluYXRlJzpcblx0XHRcdGNhc2UgJ2ZvcmNldXBkYXRlJzpcblx0XHRcdGNhc2UgJ2lkJzpcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0Y2FzZSAncGFyZW50aWQnOlxuXHRcdFx0Y2FzZSAncGFyZW50dHlwZSc6XG5cdFx0XHRjYXNlICdwYXNzd29yZCc6XG5cdFx0XHRjYXNlICd0b2tlbic6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGhhc0xvY2F0aW9uUHJvcGVydHkgKFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0bG9jYXRpb246IG51bWJlcixcblx0KTogYm9vbGVhbiB7XG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2Vcblx0XHRyZXR1cm4gKGxvY2F0aW9uICYgY29sdW1uLmxvY2F0aW9uKSAhPT0gMDtcblx0fVxuXG5cdGlzRWRpdGFibGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRpZiAoY29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlzU2VhcmNoYWJsZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2VtYWlsJzpcblx0XHRcdGNhc2UgJ3Bob25lJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnaHRtbCc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGdldERlZmF1bHRXZWlnaHQgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBudW1iZXIge1xuXHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKCdnZXREZWZhdWx0V2VpZ2h0JywgY29sdW1uKTtcblxuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdGNhc2UgJ2ludCc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdwb3dlcic6XG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdFx0cmV0dXJuIDAuNTtcblxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0XHRyZXR1cm4gMS41O1xuXG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICdodG1sJzpcblx0XHRcdGNhc2UgJ3RleHRyZXBsYWNlJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4gJiB7dHlwZTogJ2RpbWVuc2lvbicgfCAnd2VpZ2h0JyB8ICdwcmljZSd9KTogWyc9JywgJz4nLCAnPCddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbiAmIHt0eXBlOiAnZGF0ZScgfCAnZGF0ZXRpbWUnIHwgJ3RpbWUnIHwgJ2R1cmF0aW9uJ30pOiBbJz4nLCAnPCddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IFsnPScsICchPSddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbikge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdCc9Jyxcblx0XHRcdFx0XHQnPicsXG5cdFx0XHRcdFx0JzwnLFxuXHRcdFx0XHRdO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPicsXG5cdFx0XHRcdFx0JzwnLFxuXHRcdFx0XHRdO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPScsXG5cdFx0XHRcdFx0JyE9Jyxcblx0XHRcdFx0XTtcblx0XHR9XG5cdH1cblxuXHRjb250YWluc0NvbHVtbiAoXG5cdFx0cmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbixcblx0XHRkZXN0aW5hdGlvbjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRjb25zdCBjb2x1bW5JbmRleCA9IHRoaXMuZmluZFJlcXVlc3RDb2x1bW4oXG5cdFx0XHRjb2x1bW4uaWQsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHQpO1xuXG5cdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0aWYgKCF0aGlzLmNvbnRhaW5zQ29sdW1uKFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdW2NvbHVtbi5pZF0sXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNvbnRhaW5zRGVyaXZlZENvbHVtbnMgKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10pOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiByZXF1ZXN0Q29sdW1ucykge1xuXHRcdFx0aWYgKHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKGNvbHVtbikuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXNwb25zZUNvbHVtbnNBdmFpbGFibGUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHJlc3BvbnNlQ29sdW1uTWFwOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IHJlcXVlc3RDb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHBhcnNlZENvbHVtbiA9IHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBwYXJzZWRDb2x1bW4uY2hpbGRyZW47XG5cdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSByZXNwb25zZUNvbHVtbk1hcFtpdGVtVHlwZV07XG5cdFx0XHRsZXQgcmVzcG9uc2VDb2x1bW47XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29sdW1uID0gcmVzcG9uc2VDb2x1bW5zW3BhcnNlZENvbHVtbi5pZF07XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGlsZHJlbi5sZW5ndGggPiAwICYmXG5cdFx0XHRcdCF0aGlzLnJlc3BvbnNlQ29sdW1uc0F2YWlsYWJsZShcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0XHRjaGlsZHJlbixcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbk1hcCxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNvcHlSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogdHJ1ZSk6IHRydWU7XG5cdGNvcHlSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdKTogQXBpUmVxdWVzdENvbHVtbltdO1xuXHRjb3B5UmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogQXBpUmVxdWVzdENvbHVtbnMge1xuXHRcdGlmIChjb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0cmVzdWx0LnB1c2godGhpcy5jb3B5UmVxdWVzdENvbHVtbihjb2x1bW4pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Y29weVJlcXVlc3RDb2x1bW4gKHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4pOiBBcGlSZXF1ZXN0Q29sdW1uIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gY29sdW1uLmlkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoaWxkcmVuOiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGRDb2x1bW4gb2YgY29sdW1uLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZHJlbi5wdXNoKHRoaXMuY29weVJlcXVlc3RDb2x1bW4oY2hpbGRDb2x1bW4pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1tjb2x1bW4uaWRdOiBjaGlsZHJlbn07XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogdHJ1ZSxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ8dHJ1ZSwgW10+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHNlY29uZDogdHJ1ZSxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PHRydWUsIHRydWU+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOlxuXHRcdFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDxBcGlSZXF1ZXN0Q29sdW1uW10sIEFwaVJlcXVlc3RDb2x1bW5bXT47XG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdGhlIHBhc3NlZCBjb2x1bW5zIGFuZCByZXR1cm5zIHRoZSBtZXJnZWQgc2V0IGFuZCB0aGUgZGlmZmVyZW5jZS5cblx0ICpcblx0ICogQHJldHVybnNcblx0ICogLSBNZXJnZWQ6IFRoZSBtZXJnZWQgc2V0IG9mIGNvbHVtbnNcblx0ICogLSBEaWZmZXJlbmNlOiBDb2x1bW5zIHRoYXQgYXJlIGluIHNlY29uZCwgYnV0IG5vdCBpbiBmaXJzdFxuXHQgKi9cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdCB7XG5cdFx0aWYgKGZpcnN0ID09PSB0cnVlKSAvLyA9PT0gb3BlcmF0b3IgbmVlZGVkIGhlcmVcblx0XHR7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXJnZWQ6IHRydWUsXG5cdFx0XHRcdGRpZmZlcmVuY2U6IFtdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoc2Vjb25kID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXJnZWQ6IHRydWUsXG5cdFx0XHRcdGRpZmZlcmVuY2U6IHRydWUsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IG1lcmdlZCA9IHRoaXMuY29weVJlcXVlc3RDb2x1bW5zKGZpcnN0KTtcblx0XHRjb25zdCBkaWZmZXJlbmNlOiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIHNlY29uZCkge1xuXHRcdFx0Y29uc3QgYWRkZWRDb2x1bW4gPSB0aGlzLm1lcmdlUmVxdWVzdENvbHVtbihcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRtZXJnZWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoYWRkZWRDb2x1bW4gIT09IG51bGwpIHtcblx0XHRcdFx0ZGlmZmVyZW5jZS5wdXNoKGFkZGVkQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiBtZXJnZWQsXG5cdFx0XHRkaWZmZXJlbmNlOiBkaWZmZXJlbmNlLFxuXHRcdH07XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW4gKFxuXHRcdHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KSB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0Y29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmZpbmRSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdGRlc3RpbmF0aW9uLnB1c2gocmVxdWVzdENvbHVtbik7XG5cdFx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbjtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPSB7XG5cdFx0XHRcdFtjb2x1bW4uaWRdOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkZWRDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdGNvbnN0IGFkZGVkQ29sdW1uID0gdGhpcy5tZXJnZVJlcXVlc3RDb2x1bW4oXG5cdFx0XHRcdGNoaWxkQ29sdW1uLFxuXHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XVtjb2x1bW4uaWRdLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGFkZGVkQ29sdW1uICE9PSBudWxsKSB7XG5cdFx0XHRcdGFkZGVkQ29sdW1ucy5wdXNoKGFkZGVkQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYWRkZWRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtbY29sdW1uLmlkXTogYWRkZWRDb2x1bW5zfTtcblx0fVxuXG5cdGdldFJlcXVlc3RDb2x1bW5JZCAocmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbik6IHN0cmluZyB7XG5cdFx0aWYgKHR5cGVvZiByZXF1ZXN0Q29sdW1uID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHJlcXVlc3RDb2x1bW47XG5cdFx0fVxuXG5cdFx0bGV0IGNvbHVtbklkO1xuXG5cdFx0Zm9yIChjb2x1bW5JZCBpbiByZXF1ZXN0Q29sdW1uKSB7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbHVtbklkIGFzIHN0cmluZztcblx0fVxuXG5cdHBhcnNlUmVxdWVzdENvbHVtbiAocmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbik6IHtpZDogc3RyaW5nLCBjaGlsZHJlbjogQXBpUmVxdWVzdENvbHVtbltdfSB7XG5cdFx0aWYgKHR5cGVvZiByZXF1ZXN0Q29sdW1uID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHJlcXVlc3RDb2x1bW4sXG5cdFx0XHRcdGNoaWxkcmVuOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0bGV0IGNvbHVtbklkO1xuXG5cdFx0Zm9yIChjb2x1bW5JZCBpbiByZXF1ZXN0Q29sdW1uKSB7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBjb2x1bW5JZCBhcyBzdHJpbmcsXG5cdFx0XHRjaGlsZHJlbjogcmVxdWVzdENvbHVtbltjb2x1bW5JZCBhcyBzdHJpbmddLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0d28gc2V0cyBvZiB7QGxpbmsgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwc30uXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVzcG9uc2VDb2x1bW5zIChcblx0XHRmaXJzdDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRzZWNvbmQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IHttZXJnZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsIGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXB9IHtcblx0XHRjb25zdCBtZXJnZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblx0XHRjb25zdCBkaWZmZXJlbmNlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGZpcnN0KSB7XG5cdFx0XHRpZiAoc2Vjb25kW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1lcmdlZFtpdGVtVHlwZV0gPSBmaXJzdFtpdGVtVHlwZV07XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1lcmdlUmVzdWx0ID0gdGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1uTWFwKFxuXHRcdFx0XHRmaXJzdFtpdGVtVHlwZV0sXG5cdFx0XHRcdHNlY29uZFtpdGVtVHlwZV0sXG5cdFx0XHQpO1xuXG5cdFx0XHRtZXJnZWRbaXRlbVR5cGVdID0gbWVyZ2VSZXN1bHQubWVyZ2VkO1xuXHRcdFx0ZGlmZmVyZW5jZVtpdGVtVHlwZV0gPSBtZXJnZVJlc3VsdC5kaWZmZXJlbmNlO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gc2Vjb25kKSB7XG5cdFx0XHRpZiAoZmlyc3RbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bWVyZ2VkW2l0ZW1UeXBlXSA9IHNlY29uZFtpdGVtVHlwZV07XG5cdFx0XHRcdGRpZmZlcmVuY2VbaXRlbVR5cGVdID0gc2Vjb25kW2l0ZW1UeXBlXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiBtZXJnZWQsXG5cdFx0XHRkaWZmZXJlbmNlOiBkaWZmZXJlbmNlLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0d28gc2V0cyBvZiB7QGxpbmsgUmVzcG9uc2VDb2x1bW5NYXAgcmVzcG9uc2UgY29sdW1uc30uXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVzcG9uc2VDb2x1bW5NYXAgKFxuXHRcdGZpcnN0OiBSZXNwb25zZUNvbHVtbk1hcCxcblx0XHRzZWNvbmQ6IFJlc3BvbnNlQ29sdW1uTWFwLFxuXHQpOiB7bWVyZ2VkOiBSZXNwb25zZUNvbHVtbk1hcCwgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5NYXB9IHtcblx0XHRjb25zdCBtZXJnZWQ6IFJlc3BvbnNlQ29sdW1uTWFwID0ge307XG5cdFx0Y29uc3QgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5NYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZmlyc3QpIHtcblx0XHRcdG1lcmdlZFtjb2x1bW5JZF0gPSBmaXJzdFtjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBzZWNvbmQpIHtcblx0XHRcdGlmIChpc0RlZmluZWQoZmlyc3RbY29sdW1uSWRdKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWVyZ2VkW2NvbHVtbklkXSA9IHNlY29uZFtjb2x1bW5JZF07XG5cdFx0XHRkaWZmZXJlbmNlW2NvbHVtbklkXSA9IHNlY29uZFtjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogbWVyZ2VkLFxuXHRcdFx0ZGlmZmVyZW5jZTogZGlmZmVyZW5jZSxcblx0XHR9O1xuXHR9XG5cblx0aXNMb2NhbENvbHVtbklkIChjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbHVtbklkLnN1YnN0cmluZyhcblx0XHRcdDAsXG5cdFx0XHQyLFxuXHRcdCkgPT09ICdfXyc7XG5cdH1cblxuXHRwcm9jZXNzQ29uZmlnQ29sdW1ucyAoY29uZmlnQ29sdW1uczogc3RyaW5nW10pOiBBcGlSZXF1ZXN0Q29sdW1uW10ge1xuXHRcdGNvbnN0IHJlcXVlc3Q6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29uZmlnQ29sdW1ucykge1xuXHRcdFx0aWYgKHRoaXMuaXNMb2NhbENvbHVtbklkKGNvbHVtbikpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucHJvY2Vzc0NvbmZpZ0NvbHVtbihcblx0XHRcdFx0dGhpcy5wYXJzZUNvbmZpZ0NvbHVtbihjb2x1bW4pLFxuXHRcdFx0XHRyZXF1ZXN0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVxdWVzdDtcblx0fVxuXG5cdHBhcnNlQ29uZmlnQ29sdW1uIChjb25maWdDb2x1bW46IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gY29uZmlnQ29sdW1uLnNwbGl0KFJFTkRFUl9BU19TRVBFUkFUT1IpWzBdLnNwbGl0KENPTFVNTl9TRVBFUkFUT1IpO1xuXHR9XG5cblx0cHJvY2Vzc0NvbmZpZ0NvbHVtbiAoXG5cdFx0cGFyc2VkQ29uZmlnQ29sdW1uOiBzdHJpbmdbXSxcblx0XHRkZXN0aW5hdGlvbjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpIHtcblx0XHRjb25zdCBjb2x1bW5JZCA9IHBhcnNlZENvbmZpZ0NvbHVtblswXTtcblx0XHRjb25zdCBpc0xlYWYgPSBwYXJzZWRDb25maWdDb2x1bW4ubGVuZ3RoID09PSAxO1xuXHRcdGxldCBjb2x1bW5JbmRleCA9IHRoaXMuZmluZFJlcXVlc3RDb2x1bW4oXG5cdFx0XHRjb2x1bW5JZCxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdCk7XG5cblx0XHRpZiAoaXNMZWFmKSB7XG5cdFx0XHRpZiAoY29sdW1uSW5kZXggPT09IC0xKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uLnB1c2goY29sdW1uSWQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29sdW1uSW5kZXggPSBkZXN0aW5hdGlvbi5wdXNoKHtbY29sdW1uSWRdOiBbXX0pIC0gMTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPSB7W2NvbHVtbklkXTogW119O1xuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHR0aGlzLnByb2Nlc3NDb25maWdDb2x1bW4oXG5cdFx0XHRwYXJzZWRDb25maWdDb2x1bW4uc2xpY2UoMSksXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF1bY29sdW1uSWRdLFxuXHRcdCk7XG5cdH1cblxuXHRmaW5kUmVxdWVzdENvbHVtbiAoXG5cdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBudW1iZXIge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdENvbHVtbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IHJlcXVlc3RDb2x1bW5zW2ldO1xuXG5cdFx0XHRpZiAodGhpcy5nZXRSZXF1ZXN0Q29sdW1uSWQoY29sdW1uKSA9PT0gY29sdW1uSWQpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2UsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbUlkQ29udmVyc2lvbk1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi9Db2x1bW5JbmZvJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuL0tleVNlcnZpY2UnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBICdDb252ZXJzaW9uTWFwJyBpcyB1c2VkIHRvIHVwZGF0ZSBhIHNldCBvZiBpdGVtIElEcyB0byBhbm90aGVyLiBUaGlzIGhhcHBlbnMgd2hlbiBwcm9jZXNzaW5nIGJhY2stZW5kXG4gKiByZXNwb25zZXMgKGNyZWF0ZSAvIHRlbXBsYXRlKSBvciBjbG9uaW5nIGl0ZW1zIGluIHRoZSBmcm9udC1lbmQuIEEgY29udmVyc2lvbiBtYXAgaXMgZ3JvdXBlZCBieSBpdGVtIHR5cGUsIGFzIGl0ZW1cbiAqIElEJ3MgYXJlIG5vdCB1bmlxdWUgYWNyb3NzIHR5cGVzLlxuICpcbiAqIFRPRE86IEluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBjcmVhdGUgYSBjbGFzcyBhbmQgYSAnQ29udmVyc2lvbk1hcEZhY3RvcnknLlxuICovXG5leHBvcnQgY2xhc3MgQ29udmVyc2lvbk1hcFNlcnZpY2Uge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUxvY2FsQ29udmVyc2lvbk1hcCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGRvRXh0ZW5kOiBib29sZWFuID0gZmFsc2UsXG5cdFx0YXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHQpOiBJdGVtSWRDb252ZXJzaW9uTWFwIHtcblx0XHRjb25zdCBhcGlJdGVtSWQgPSBhcGlSZXNwb25zZS5saW5rc1tpdGVtVHlwZV1bMF07XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge307XG5cblx0XHRyZXN1bHRbaXRlbVR5cGVdID0ge307XG5cdFx0cmVzdWx0W2l0ZW1UeXBlXVthcGlJdGVtSWRdID0gaXRlbUlkO1xuXG5cdFx0aWYgKGRvRXh0ZW5kKSB7XG5cdFx0XHR0aGlzLmV4cGFuZExvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGFwaUl0ZW1JZCxcblx0XHRcdFx0YXBpUmVzcG9uc2UsXG5cdFx0XHRcdHJlc3VsdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0YXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGxpbmtzID0gYXBpUmVzcG9uc2UuaXRlbXNbcGFyZW50VHlwZV1bcGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rcykge1xuXHRcdFx0Y29uc3QgaWRBcnJheSA9IGxpbmtzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgaWRBcnJheSkge1xuXHRcdFx0XHRjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXVthcGlJdGVtSWRdID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblxuXHRcdFx0XHR0aGlzLmV4cGFuZExvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0YXBpUmVzcG9uc2UsXG5cdFx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29udmVyc2lvbk1hcCAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRuZXdJdGVtSWQ/OiBJdGVtSWQsXG5cdCk6IEl0ZW1JZCB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdGxldCBjb252ZXJzaW9uTWFwRW50cnk7XG5cblx0XHRpZiAoY29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRjb252ZXJzaW9uTWFwRW50cnkgPSBjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChjb252ZXJzaW9uTWFwRW50cnlbaXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF07XG5cdFx0fVxuXG5cdFx0aWYgKG5ld0l0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRuZXdJdGVtSWQgPSB0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb252ZXJzaW9uTWFwRW50cnlbaXRlbUlkXSA9IG5ld0l0ZW1JZDtcblx0fVxuXG5cdHB1YmxpYyBiYXRjaEV4cGFuZENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8YW55Pj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuZXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcDtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb252ZXJzaW9uVmFsdWUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRtYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IEl0ZW1JZCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBjb2x1bW5zIGluIGBmaWVsZHNgIHVzaW5nIHRoZSBgcGFyZW50YCBhbmQgYGNvbnZlcnNpb25NYXBgLlxuXHQgKiBAcGFyYW0gcGFyZW50IC0gV2hlbiByZXRyaWV2aW5nIGFuIGl0ZW0gdGhlICdsaW5rJyBjb2x1bW4gaXMgbm90IHByZXNlbnQgaW4gdGhlIHRlbXBsYXRlIHJlc3BvbnNlLCBhbmQgaXNcblx0ICogYWRkZWQgYXQgYSBsYXRlciBzdGFnZS4gVGhlIHZhbHVlIGZvciB0aGlzIGNvbHVtbiBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgcGFyYW1ldGVyLlxuXHQgKi9cblx0cHVibGljIHVwZGF0ZUl0ZW1WYWx1ZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRzb3VyY2U6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZGVzdGluYXRpb246IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0aXRlbUNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCA9IG51bGwsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGl0ZW1Db2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdC8vIFRPRE86IHdlIGNhbiByZWNvbnNpZGVyIHRoaXMgb25jZSBhbGwgY29sdW1ucyBhcmUgcmVzcGVjdGVkIGZvciBsb2NhbCBpdGVtcyBbUk00LTEwMzc4XVxuXHRcdFx0bGV0IG5ld1ZhbHVlO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnR5cGUgPT09ICdsaW5rJyAmJiBzb3VyY2VbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdG5ld1ZhbHVlID0gcGFyZW50Lml0ZW1JZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmV3VmFsdWUgPSB0aGlzLmdldENvbnZlcnNpb25WYWx1ZShcblx0XHRcdFx0XHRhcGlDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0c291cmNlW2NvbHVtbklkXSxcblx0XHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JZF0gPSBuZXdWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ3JlYXRlQ29tcGlsYXRpb24sIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENyZWF0ZVJlcXVlc3RFbnRyeSwgSXRlbUlkLCBJdGVtTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDcmVhdGVEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblxuXHRyZXF1ZXN0czogQXJyYXk8Q3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29tcGlsYXRpb246IENyZWF0ZUNvbXBpbGF0aW9uLFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0cHJpdmF0ZSBicmVha3VwQnlQYXJlbnQgPSBmYWxzZSxcblx0KSB7XG5cdH1cblxuXHRmaW5hbGl6ZVJlcXVlc3QgKHJlcXVlc3RSZXNvdXJjZTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4pIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHJlcXVlc3RSZXNvdXJjZS5jb2xsZWN0aW9ucy5nZXRDb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMoKTtcblx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSByZXF1ZXN0UmVzb3VyY2UuY29sdW1ucztcblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRjb2x1bW5FeHBhbnNpb24uZXhwYW5kKGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zKTtcblx0XHR9XG5cblx0XHRyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdC5jb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3RSZXNvdXJjZTtcblx0fVxuXG5cdHNldFJlcXVlc3RQYXJlbnQgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RFbnRyeTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0RW50cnkucmVxdWVzdDtcblxuXHRcdGlmIChwYXJlbnRUeXBlID09PSAnVm9pZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXF1ZXN0LnBhcmVudFR5cGUgPSBwYXJlbnRUeXBlO1xuXHRcdHJlcXVlc3QucGFyZW50SWQgPSB7fTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cHVibGljIHJ1biAoKSB7XG5cdFx0Y29uc3QgY29tcGlsYXRpb24gPSB0aGlzLmNvbXBpbGF0aW9uO1xuXG5cdFx0aWYgKHRoaXMuYnJlYWt1cEJ5UGFyZW50KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmVudFR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgcGFyZW50TWFwID0gY29tcGlsYXRpb25bcGFyZW50VHlwZV07XG5cblx0XHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRNYXApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnRJZCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IHJlcXVlc3RSZXNvdXJjZSA9IHRoaXMuaW5pdGlhbGl6ZVJlcXVlc3QoKTtcblxuXHRcdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRcdHBhcmVudE1hcFtwYXJlbnRJZF0sXG5cdFx0XHRcdFx0XHR0aGlzLnNldFJlcXVlc3RQYXJlbnQoXG5cdFx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0XHRcdCkgPyArcGFyZW50SWQgOiBudWxsLFxuXHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR0aGlzLnJlcXVlc3RzLnB1c2godGhpcy5maW5hbGl6ZVJlcXVlc3QocmVxdWVzdFJlc291cmNlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChjb25zdCBwYXJlbnRUeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHBhcmVudE1hcCA9IGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdO1xuXHRcdFx0XHRjb25zdCByZXF1ZXN0UmVzb3VyY2UgPSB0aGlzLmluaXRpYWxpemVSZXF1ZXN0KCk7XG5cdFx0XHRcdGNvbnN0IGhhc1BhcmVudCA9IHRoaXMuc2V0UmVxdWVzdFBhcmVudChcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRsZXQgdmFsaWRSZXF1ZXN0ID0gZmFsc2U7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRNYXApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnRJZCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRcdHBhcmVudE1hcFtwYXJlbnRJZF0sXG5cdFx0XHRcdFx0XHRoYXNQYXJlbnQgPyArcGFyZW50SWQgOiBudWxsLFxuXHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR2YWxpZFJlcXVlc3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZhbGlkUmVxdWVzdCkge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdHMucHVzaCh0aGlzLmZpbmFsaXplUmVxdWVzdChyZXF1ZXN0UmVzb3VyY2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RzO1xuXHR9XG5cblx0aW5pdGlhbGl6ZVJlcXVlc3QgKCk6IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRyZXF1ZXN0VHlwZTogJ2NyZWF0ZScsXG5cdFx0XHRcdGl0ZW1zOiB7fSxcblx0XHRcdFx0Y29sdW1uczoge30sXG5cdFx0XHR9LFxuXHRcdFx0Y29sdW1uczogdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKSxcblx0XHRcdGl0ZW1zOiB7fSxcblx0XHRcdGNvbGxlY3Rpb25zOiB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmdldENvbGxlY3Rpb25NYXRjaGVyKCksXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgZXh0ZW5kUmVxdWVzdCAoXG5cdFx0aXRlbVZhbHVlczogSXRlbU1hcDxJbnRlcm5hbENyZWF0ZURlbHRhPixcblx0XHRyZXF1ZXN0UGFyZW50SWQ6IEl0ZW1JZCB8IG51bGwsXG5cdFx0ZGVzdGluYXRpb246IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0ID0gZGVzdGluYXRpb24ucmVxdWVzdDtcblx0XHRjb25zdCBpdGVtRW50cnlNYXAgPSBkZXN0aW5hdGlvbi5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaXRlbVZhbHVlcykge1xuXHRcdFx0aWYgKHJlcXVlc3QuaXRlbVR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXF1ZXN0Lml0ZW1UeXBlID0gaXRlbVR5cGUgYXMgSXRlbVR5cGVUeXBlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbUVudHJ5TWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGl0ZW1FbnRyeU1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdFx0cmVxdWVzdC5pdGVtc1tpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbVZhbHVlc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxDcmVhdGVEZWx0YTogSW50ZXJuYWxDcmVhdGVEZWx0YSA9IGl0ZW1WYWx1ZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGludGVybmFsQ3JlYXRlRGVsdGEuZW50cnk7XG5cblx0XHRcdFx0Y29uc3QgY2hpbGRFbnRyaWVzID0gZ2V0UGF0aChcblx0XHRcdFx0XHR0aGlzLmNvbXBpbGF0aW9uLFxuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBpdGVtUmVxdWVzdDogYW55ID0gcmVxdWVzdC5pdGVtc1tpdGVtVHlwZV1baXRlbUVudHJ5Lml0ZW1JZF0gPSB7fTtcblx0XHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhdGgoXG5cdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi50YWJSZXF1ZXN0UGFyYW1ldGVycyxcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAocmVxdWVzdFBhcmVudElkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0KHJlcXVlc3QucGFyZW50SWQgYXMge1tpdGVtSWQ6IHN0cmluZ106IEl0ZW1JZH0pW2l0ZW1FbnRyeS5pdGVtSWRdID0gcmVxdWVzdFBhcmVudElkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVzdGluYXRpb24uY29sdW1ucy5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIG5lZWQgdGhpcyA/XG5cdFx0XHRcdC8vIGRlc3RpbmF0aW9uLmNvbGxlY3Rpb25zLmV4cGFuZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdGl0ZW1FbnRyeU1hcFtpdGVtVHlwZV1baXRlbUlkXSA9IGl0ZW1FbnRyeTtcblxuXHRcdFx0XHRpdGVtUmVxdWVzdC52YWx1ZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXF1ZXN0TG9jYWwoXG5cdFx0XHRcdFx0aW50ZXJuYWxDcmVhdGVEZWx0YS5maWVsZHMsXG5cdFx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpdGVtUmVxdWVzdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcblxuXHRcdFx0XHRpZiAoY2hpbGRFbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGxpbmtzOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0gPSBpdGVtUmVxdWVzdC5saW5rcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY2hpbGRUeXBlIGluIGNoaWxkRW50cmllcykge1xuXHRcdFx0XHRcdGxpbmtzW2NoaWxkVHlwZV0gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGRJZCBpbiBjaGlsZEVudHJpZXNbY2hpbGRUeXBlXSkge1xuXHRcdFx0XHRcdFx0bGlua3NbY2hpbGRUeXBlXS5wdXNoKHBhcnNlSW50KFxuXHRcdFx0XHRcdFx0XHRjaGlsZElkLFxuXHRcdFx0XHRcdFx0XHQxMCxcblx0XHRcdFx0XHRcdCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRjaGlsZEVudHJpZXMsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEZpcnN0UHJvcGVydHkgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgZW51bSBPUEVSQVRPUlMge1xuXHRPUiA9ICdPUicsXG5cdEFORCA9ICdBTkQnXG59XG5cbmV4cG9ydCB0eXBlIE9QRVJBVE9SU19UWVBFID0gJ09SJyB8ICdBTkQnIHwgJ29yJyB8ICdhbmQnIHwgT1BFUkFUT1JTO1xuXG5leHBvcnQgZW51bSBDT01QQVJBVE9SUyB7XG5cdEVRVUFMUyA9ICc9Jyxcblx0Tk9UX0VRVUFMUyA9ICchPScsXG5cdExFU1NfVEhBTiA9ICc8Jyxcblx0TU9SRV9USEFOID0gJz4nLFxuXHRMRVNTX09SX0VRVUFMX1RIQU4gPSAnPD0nLFxuXHRFUVVBTF9PUl9NT1JFX1RIQU4gPSAnPj0nLFxuXHRJTiA9ICdJTidcbn1cblxuZXhwb3J0IHR5cGUgQ09NUEFSQVRPUlNfVFlQRSA9ICc9JyB8ICchPScgfCAnPCcgfCAnPicgfCAnPD0nIHwgJz49JyB8ICdJTicgfCBDT01QQVJBVE9SUztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF1ZXJ5UGFyc2VyQmFzZTxSZXR1cm5UeXBlIGV4dGVuZHMgYW55PiB7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcXVlcnk6IEFwaVF1ZXJ5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBwYXJzZSAocXVlcnk6IEFwaVF1ZXJ5ID0gdGhpcy5xdWVyeSk6IFJldHVyblR5cGUge1xuXHRcdGlmIChxdWVyeS5saW5rZWRUbyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUxpbmtlZFRvUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmxpbmtlZFRvLFxuXHRcdFx0XHRxdWVyeS5xdWVyeSxcblx0XHRcdFx0cXVlcnkucmV2ZXJzZSxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuY3VzdG9tICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlQ3VzdG9tUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmN1c3RvbSxcblx0XHRcdFx0cXVlcnkucGFyYW1ldGVycyxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuc2VhcmNoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU2VhcmNoUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LnNlYXJjaCxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuY29uZGl0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXhRdWVyeShcblx0XHRcdFx0cXVlcnkuY29uZGl0aW9ucyxcblx0XHRcdFx0cXVlcnkub3BlcmF0b3IsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5Lml0ZW1UeXBlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU3ViRmllbGRRdWVyeShcblx0XHRcdFx0cXVlcnkua2V5LFxuXHRcdFx0XHRxdWVyeS5pdGVtVHlwZSxcblx0XHRcdFx0cXVlcnkuZmllbGQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5rZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBxdWVyeS5xdWVyeSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTdWJRdWVyeShcblx0XHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdFx0cXVlcnkucXVlcnksXG5cdFx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVNpbXBsZVF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdHF1ZXJ5LnZhbHVlLFxuXHRcdFx0XHRxdWVyeS5jb21wYXJhdG9yLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtleSA9IGdldEZpcnN0UHJvcGVydHkocXVlcnkpO1xuXG5cdFx0aWYgKGtleSA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VFbXB0eVF1ZXJ5KCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWUgPSBxdWVyeVtrZXldO1xuXG5cdFx0Ly8gdHlwZW9mIG51bGwgaXMgYW4gb2JqZWN0IDp0aGlua2luZzpcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVN1YlF1ZXJ5KFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyc2VTaW1wbGVRdWVyeShcblx0XHRcdGtleSxcblx0XHRcdHZhbHVlLFxuXHRcdFx0cXVlcnkuY29tcGFyYXRvcixcblx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlRW1wdHlRdWVyeSAoKTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGZpZWxkOiBzdHJpbmcsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ3VzdG9tUXVlcnkgKFxuXHRcdGN1c3RvbTogc3RyaW5nLFxuXHRcdHBhcmFtZXRlcnM6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29tcGFyYXRvcjogQ09NUEFSQVRPUlNfVFlQRSxcblx0XHRub3Q/OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdHJldmVyc2U6IGJvb2xlYW4sXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUNvbXBsZXhRdWVyeSAoXG5cdFx0Y29uZGl0aW9uczogYW55W10sXG5cdFx0b3BlcmF0b3I6IE9QRVJBVE9SU19UWVBFLFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1uLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlNfVFlQRSB9IGZyb20gJy4vUXVlcnlQYXJzZXInO1xuaW1wb3J0IHsgT1BFUkFUT1JTX1RZUEUsIFF1ZXJ5UGFyc2VyQmFzZSB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5Q29sdW1uRXh0cmFjdG9yXG5cdGV4dGVuZHMgUXVlcnlQYXJzZXJCYXNlPEFwaVJlcXVlc3RDb2x1bW5bXT4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpIHtcblx0XHRzdXBlcihxdWVyeSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VFbXB0eVF1ZXJ5ICgpIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiBbe1trZXldOiB0aGlzLnBhcnNlKHN1YlF1ZXJ5KX1dO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0X2tleTogc3RyaW5nLFxuXHRcdF9pdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0X2ZpZWxkOiBzdHJpbmcsXG5cdFx0X3F1ZXJ5OiBBcGlRdWVyeSxcblx0XHRfbm90OiBib29sZWFuLFxuXHQpIHtcblx0XHRyZXR1cm4gW107XG5cdFx0Ly8gdG9kb1tjYWNoZV0gV2Ugc2hvdWxkIGV4cGFuZCB0aGUgcmVxdWVzdENvbHVtbnMgd2l0aCB7W2l0ZW1UeXBlXTogdGhpcy5wYXJzZShxdWVyeSl9IGJ1dCBjdXJyZW50bHkgY29sbGVjdGlvbnMgb25seSBhbGxvdyBmZXRjaGluZyBkaXJlY3QgY29sdW1uc1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2VhcmNoUXVlcnkgKFxuXHRcdF92YWx1ZTogYW55LFxuXHRcdF9ub3Q6IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVF1ZXJ5IChcblx0XHRfY3VzdG9tOiBzdHJpbmcsXG5cdFx0X3BhcmFtZXRlcnM6IGFueSxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVNpbXBsZVF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRfdmFsdWU6IGFueSxcblx0XHRfY29tcGFyYXRvcj86IENPTVBBUkFUT1JTX1RZUEUsXG5cdFx0X25vdD86IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBba2V5XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0X3F1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5LFxuXHRcdF9yZXZlcnNlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0X25vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayhcblx0XHRcdGxpbmtlZFRvLFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlQ29tcGxleFF1ZXJ5IChcblx0XHRjb25kaXRpb25zOiBhbnlbXSxcblx0XHRfb3BlcmF0b3I/OiBPUEVSQVRPUlNfVFlQRSxcblx0XHRfbm90PzogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyc2VDb25kaXRpb25zKGNvbmRpdGlvbnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUNvbmRpdGlvbnMgKGNvbmRpdGlvbnM6IGFueVtdKSB7XG5cdFx0cmV0dXJuIGNvbmRpdGlvbnMucmVkdWNlKFxuXHRcdFx0KFxuXHRcdFx0XHRhY2N1bXVsYXRvcixcblx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0KSA9PiBhY2N1bXVsYXRvci5jb25jYXQoXG5cdFx0XHRcdHRoaXMucGFyc2UoY29uZGl0aW9uKSxcblx0XHRcdCksXG5cdFx0XHRbXSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucywgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciB9IGZyb20gJy4uL0NvbGxlY3Rpb25NYXRjaGVyJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IFF1ZXJ5Q29sdW1uRXh0cmFjdG9yIH0gZnJvbSAnLi4vUXVlcnlDb2x1bW5FeHRyYWN0b3InO1xuaW1wb3J0IHsgaW5BcnJheSB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yIH0gZnJvbSAnLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIGVudHJpZXM6IENvbGxlY3Rpb25DYWNoZTtcblxuXHRwdWJsaWMgY29sbGVjdGlvbkNoYW5nZXM6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFtxdWVyeVN0cmluZzogc3RyaW5nXTogSXRlbUVudHJ5W11cblx0XHR9XG5cdH0gPSB7fTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuZW50cmllcyA9IGNvbGxlY3Rpb25DYWNoZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHNldENvbGxlY3Rpb25DaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbaXRlbVR5cGVdW3F1ZXJ5U3RyaW5nXSA9IGl0ZW1FbnRyaWVzO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25DaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiB1bmRlZmluZWQgfCBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2l0ZW1UeXBlXVtxdWVyeVN0cmluZ107XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFuZCBzdG9yZXMgaXQgaW4gdGhpcyB0cmFuc2FjdGlvbidzIHtAbGluayBDb2xsZWN0aW9uQ2FjaGUgQ29sbGVjdGlvbkNhY2hlfVxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uY29yZS5jb2xsZWN0aW9uRW50cnlGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXG5cdFx0dGhpcy5lbnRyaWVzLmFkZChjb2xsZWN0aW9uRW50cnkpO1xuXG5cdFx0dGhpcy5zZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRbXSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29yZS5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29yZS5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdChtYXRjaGVyVHlwZTogSXRlbVR5cGUpID0+IG1hdGNoZXJUeXBlID09PSBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVcblx0XHRcdFx0PyBbY29sbGVjdGlvbkVudHJ5XSBhcyBDb2xsZWN0aW9uRW50cnlbXVxuXHRcdFx0XHQ6IFtdLFxuXHRcdCk7XG5cblx0XHRjb25zdCB0cmFuc2FjdGlvbnM6IEFic3RyYWN0Q2FjaGVbXSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0VHJhbnNhY3Rpb25DaGFpbigpO1xuXG5cdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB0cmFuc2FjdGlvbnMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzID0gdHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyLmV4cGFuZChcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0Y2hhbmdlcyxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb2xsZWN0aW9uTWF0Y2hlci5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIHtAbGluayBDb2xsZWN0aW9uTWF0Y2hlciBDb2xsZWN0aW9uTWF0Y2hlcn0gd2l0aCB0aGUgdHJhbnNhY3Rpb24ncyBjb2xsZWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGdldENvbGxlY3Rpb25NYXRjaGVyICgpOiBDb2xsZWN0aW9uTWF0Y2hlcjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgY29sbGVjdGlvbnMgbGlua2VkIHRvIHRoZSBwYXNzZWQgcGFyZW50c1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSB8ICgoKSA9PiBJdGVtSWRbXSksXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb25zIHdpdGggdGhlIHBhc3NlZCBjb2x1bW5zXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZXhwYW5kQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXh0ZW5kcyB0aGUgY29sbGVjdGlvbnMnIHtAbGluayBDb2xsZWN0aW9uRW50cnkucXVlcnlQYXJhbXMgcXVlcnlQYXJhbXN9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5LnF1ZXJ5IHF1ZXJpZXN9IGFuZCBmZXRjaGVzIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB3aXRoIHRoZSBuZXcgcXVlcmllc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gdG8gdGhlIGNvbGxlY3Rpb24ncyBjaGFuZ2VzIG9uIHRoZSB0cmFuc2FjdGlvbixcblx0ICogd2lsbCBza2lwIHRoZSBJdGVtRW50cnkgaWYgdGhlIGBza2lwRW50cnlGaWx0ZXJGbmAgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWBcblx0ICovXG5cdHByb3RlY3RlZCBfYWRkSXRlbUVudHJpZXNUb0NvbGxlY3Rpb25DaGFuZ2VzPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdFx0c2tpcEVudHJ5RmlsdGVyRm46ICh0ZW1FbnRyeTogSXRlbUVudHJ5KSA9PiBib29sZWFuLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChpdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0KTtcblxuXHRcdGlmIChjaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhZGRlZEl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0Y2hhbmdlcy5pbmRleE9mKGl0ZW1FbnRyeSkgIT09IC0xXG5cdFx0XHRcdHx8IHNraXBFbnRyeUZpbHRlckZuKGl0ZW1FbnRyeSlcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y2hhbmdlcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2soXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGFkZGVkRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyByZW1vdmVJdGVtRW50cmllc0Zyb21Db2xsZWN0aW9uQ2hhbmdlcyAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0aWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRpZiAoaWRBcnJheS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0KTtcblxuXHRcdGlmIChjaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByZW1vdmVkSXRlbUVudHJpZXMgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuZmlsdGVyQXJyYXkoXG5cdFx0XHRjaGFuZ2VzLFxuXHRcdFx0aXRlbUVudHJ5ID0+ICFpbkFycmF5KFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRpZEFycmF5LFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuaGFuZGxlUmVtb3ZlZEl0ZW1FbnRyaWVzQ2FsbGJhY2soXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMsXG5cdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgaGFuZGxlUmVtb3ZlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRyZW1vdmVkSXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbixcblx0KTogdm9pZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4cGFuZHMgdGhlIG9wdGlvbidzIHtAbGluayBDb2xsZWN0aW9uRW50cnlPcHRpb25zLmNvbHVtbnMgY29sdW1uc30gd2l0aCB0aGUgY29sdW1ucyByZXF1aXJlZCBmb3IgdGhlIHtAbGluayBDb2xsZWN0aW9uTWF0Y2hlciBDb2xsZWN0aW9uTWF0Y2hlcn0gdG8gZnVuY3Rpb24uXG5cdCAqIERhdGEgZmV0Y2hlZCBmb3IgYSBwYXJlbnQgdHJhbnNhY3Rpb24gbWlnaHQgYWxzbyBmaXQgaW4gYSBjaGlsZCB0cmFuc2FjdGlvbiwgc28gdGhvc2Uge0BsaW5rIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMucXVlcnlDb2x1bW5zIHF1ZXJ5Q29sdW1uc30gc2hvdWxkIGFsc28gYmUgdGFrZW4gaW50byBhY2NvdW50XG5cdCAqL1xuXHRwcm90ZWN0ZWQgZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uRXh0cmFjdG9yID0gbmV3IFF1ZXJ5Q29sdW1uRXh0cmFjdG9yKFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRxdWVyeSxcblx0XHQpO1xuXG5cdFx0b3B0aW9ucy5xdWVyeUNvbHVtbnMgPSBjb2x1bW5FeHRyYWN0b3IucGFyc2UoKTtcblxuXHRcdC8vIGFscmVhZHkgaGF2ZSBhbGwgY29sdW1ucywgc28gY2FuJ3QgZXhwYW5kIHRoZW1cblx0XHRpZiAob3B0aW9ucy5jb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5xdWVyeUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZ2V0KClbaXRlbVR5cGVdO1xuXHR9XG59XG4iLCJpbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRBcGlSZXNwb25zZVByb2Nlc3Nvcixcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvbk1hdGNoZXIsXG5cdENvbGxlY3Rpb25RdWVyeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdGlzRnVuY3Rpb24sXG5cdEl0ZW1FbnRyeU9wdGlvbnMsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuLi8uLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5cbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL1NlcnZlckl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGNsYXNzIFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyXG5cdGV4dGVuZHMgQ29sbGVjdGlvbkhhbmRsZXJCYXNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBpdGVtSGFuZGxlcjogU2VydmVySXRlbUhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogU2VydmVyQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMoe1xuXHRcdFx0XHRcdGNvbHVtbnM6IG9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0XHRwYXJlbnQ6IG9wdGlvbnMucGFyZW50LFxuXHRcdFx0XHRcdHF1ZXJ5OiBxdWVyeSxcblx0XHRcdFx0fSksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nXSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4ob3B0aW9ucy5jb2x1bW5zKTtcblxuXHRcdHJldHVybiB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHBhcnNlZFF1ZXJ5LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdIHwgKCgpID0+IEl0ZW1JZFtdKSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiB7W3BhcmVudElkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeT59ID0ge307XG5cblx0XHRpZiAoaXNGdW5jdGlvbjwoKSA9PiBJdGVtSWRbXT4ocGFyZW50SWRBcnJheSkpIHtcblx0XHRcdHBhcmVudElkQXJyYXkgPSBwYXJlbnRJZEFycmF5KCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRjb25zdCBuZXdPcHRpb25zID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogcGFyZW50SWQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkobmV3T3B0aW9ucyk7XG5cblx0XHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXSBzaG91bGQgdGhpcyBiZSBpbiBhIGxvb3A/IGV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zIGNhbiBjaGFuZ2UgdGhlIGNvbHVtbnNcblx0XHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG5ld09wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRcdHByb21pc2VzW3BhcmVudElkXSA9IHRoaXMuZmV0Y2hDb2xsZWN0aW9uRGF0YShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCBleHRlbmRlZFF1ZXJ5ID0gY29sbGVjdGlvbkVudHJ5LmV4dGVuZFF1ZXJ5KHF1ZXJ5Q2FsbGJhY2spLm9iamVjdDtcblx0XHRjb25zdCBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuY3JlYXRlTm90SW4oXG5cdFx0XHRcdHRoaXNcblx0XHRcdFx0XHQuZ2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRcdCkhXG5cdFx0XHRcdFx0Lm1hcChcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdCksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMsXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCAhPT0gbnVsbCkge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cmVxdWVzdFR5cGU6ICdxdWVyeScsXG5cdFx0XHRcdFx0aXRlbVR5cGU6IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRjb2x1bW5zOiB7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnN9LFxuXHRcdFx0XHRcdHF1ZXJ5OiBleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0XHRcdGxpbWl0OiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRmdWxsUXVlcnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlID0gcHJvbWlzZTtcblxuXHRcdHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0ZGVsZXRlIGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlO1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld1JlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IHtcblx0XHRpZiAobmV3UmVxdWVzdENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25zKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Ly8gVE9ETzogZmlsdGVyIGxvY2FsIGl0ZW1zP1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bmV3UmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG5ld1JlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgb2YgcGFyZW50SWRBcnJheSkge1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbnM7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGlmICghaGFzUHJvcGVydGllcyhjb2xsZWN0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXHRcdGxldCBpdGVtSWRBcnJheTogSXRlbUlkW10gPSBbXTtcblxuXHRcdG9wdGlvbnMucXVlcnlQYXJhbXMgPSBxdWVyeUNhbGxiYWNrKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRjb2xsZWN0aW9uRW50cnkuZXh0ZW5kUXVlcnkocXVlcnlDYWxsYmFjayk7XG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHRcdGl0ZW1JZEFycmF5ID0gaXRlbUlkQXJyYXkuY29uY2F0KFxuXHRcdFx0XHR0aGlzXG5cdFx0XHRcdFx0LmdldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XHQpIVxuXHRcdFx0XHRcdC5tYXAoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkQW5kQ29uZGl0aW9uKFxuXHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKS5vYmplY3QsXG5cdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuY3JlYXRlTm90SW4oaXRlbUlkQXJyYXkpLFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0c3VwZXIuX2FkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Ly8gTG9jYWwgSXRlbUVudHJpZXMgZG9uJ3QgYmVsb25nIGluIHJlbW90ZSBjb2xsZWN0aW9uIGNoYW5nZXNcblx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXNMb2NhbCgpLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFeHBhbmRzIHRoZSBjb2x1bW5zIG9mIHRoZSBpdGVtcyBpbiB0aGUgY29sbGVjdGlvblxuXHQgKi9cblx0cHVibGljIGV4cGFuZENvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCB7bWVyZ2VkLCBkaWZmZXJlbmNlfSA9IGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zLm1lcmdlUmVxdWVzdENvbHVtbnMobmV3Q29sdW1ucyk7XG5cblx0XHRpZiAoZGlmZmVyZW5jZSAhPT0gdHJ1ZSAmJiBkaWZmZXJlbmNlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9uRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0bGV0IHByb21pc2U7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMubGltaXQgIT09IG51bGwpIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJlcXVlc3RUeXBlOiAncXVlcnknLFxuXHRcdFx0XHRcdGl0ZW1UeXBlOiBpdGVtVHlwZSxcblx0XHRcdFx0XHRjb2x1bW5zOiBtZXJnZWQsXG5cdFx0XHRcdFx0cXVlcnk6IGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0bGltaXQ6IGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmxpbWl0LCAvLyB0b2RvW2NhY2hlXSBhY3R1YWxseSBpbXBsZW1lbnQgbGltaXQgPyBDdXJyZW50bHkgZG9lbnMndCByZWFsbHkgd29ya1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG1lcmdlZCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb21pc2Vcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0bWVyZ2VkLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5leHBhbmRDb2x1bW5zKGNvbHVtbkV4cGFuc2lvbik7XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sdW1uRXhwYW5zaW9uO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0X2NvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRhZGRlZEVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChhZGRlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gT25seSB1c2VkIGluIHRoZSBmcm9udGVuZCBwbGFubmVyXG5cdFx0Ly8gY29sbGVjdGlvbkVudHJ5Lm9uQWRkSW5pdGlhbChhZGRlZEVudHJpZXMpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhbmRsZVJlbW92ZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRfY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0aWYgKHJlbW92ZWRJdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBPbmx5IHVzZWQgaW4gdGhlIGZyb250ZW5kIHBsYW5uZXJcblx0XHQvLyBjb2xsZWN0aW9uRW50cnkub25SZW1vdmVJbml0aWFsKHJlbW92ZWRJdGVtRW50cmllcyk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBwYXNzZWQgSXRlbVR5cGUvb3B0aW9ucywgd2lsbCBkbyBub3RoaW5nIGlmIHRoZSByZXF1ZXN0ZWQgQ29sbGVjdGlvbkVudHJ5L2NvbHVtbnMgYXJlIGFscmVhZHkgY2FjaGVkLlxuXHQgKiBXaWxsIGNyZWF0ZSBhIG5ldyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gaWYgdGhlIENvbGxlY3Rpb25FbnRyeSBkaWRuJ3QgZXhpc3QgeWV0XG5cdCAqL1xuXHRwcml2YXRlIGZldGNoQ29sbGVjdGlvbkRhdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0Y29sbGVjdGlvblF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRsZXQgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldEJ5UXVlcnkoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25RdWVyeSxcblx0XHQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gbnVsbCAmJiBjb2x1bW5TdWJzZXRDYWNoZS5ydW4oY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHQvLyBUaGVyZSBhbHJlYWR5IGlzIGFuIGVudHJ5IGFuZCBpdCBjb250YWlucyB0aGUgY29sdW1ucyB3ZSBuZWVkLCBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybiBpdFxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9uRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzTmV3bHlDcmVhdGVkQ29sbGVjdGlvbkVudHJ5OiBib29sZWFuID0gY29sbGVjdGlvbkVudHJ5ID09PSBudWxsO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSA9PT0gbnVsbCkge1xuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChvcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHtbaXRlbVR5cGVdOiBvcHRpb25zLmNvbHVtbnN9O1xuXG5cdFx0XHRsZXQgcmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yO1xuXG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHQucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlcXVlc3RUeXBlOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sdW1uczogcmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0XHRxdWVyeTogb3B0aW9ucy5xdWVyeSxcblx0XHRcdFx0XHRcdGxpbWl0OiBvcHRpb25zLmxpbWl0LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdClcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0X3Jlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gX3Jlc3BvbnNlO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0KVxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHQoKSA9PiByZXNwb25zZSxcblx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHRcdC5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvblF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25RdWVyeS5zdHJpbmcsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRpZiAoaXNOZXdseUNyZWF0ZWRDb2xsZWN0aW9uRW50cnkpIHtcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSEuY29sdW1ucyA9IHRoaXMudHJhbnNhY3Rpb24uY29yZS5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkhLmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHtcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxuXHRRdWVyeVBhcnNlckZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgfSBmcm9tICcuLi8uLi9DcmVhdGVkQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdENvbHVtbkV4cGFuc2lvbixcblx0Q29sdW1uU2V0LFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Q29sdW1uVXRpbCxcblx0UXVlcnlTZXJ2aWNlLFxuXHRSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0UmVxdWVzdEJ1ZmZlclJlc3BvbnNlLFxuXHRUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEl0ZW1IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0l0ZW1IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vU2VydmVyQ2FjaGUnO1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT47XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJJdGVtSGFuZGxlclxuXHRleHRlbmRzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIGl0ZW1DaGFuZ2VzOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzXG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJpdmF0ZSBxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0ZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0YXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFNlcnZlckNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1FbnRyeSAoXG5cdFx0Y3JlYXRlVHVwbGU6IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSxcblx0KTogSXRlbUVudHJ5IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSBzdXBlci5jcmVhdGVJdGVtRW50cnkoY3JlYXRlVHVwbGUpO1xuXG5cdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0gY3JlYXRlVHVwbGUuZmllbGRzO1xuXG5cdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUHJvY2Vzc2VzIHVwZGF0ZXMgb24gYSBjYWNoZWQgZW50cnlcblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXNUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZT4sXG5cdFx0X2ZvcmNlT3ZlcndyaXRlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0X3VwZGF0ZUluaXRpYWw6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRfaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdF9jcmVhdGVJdGVtQ2hhbmdlc0lmTm9uZUV4aXN0OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4gfCBudWxsIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cnlDaGFuZ2VzVHVwbGUuZW50cnk7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5jaGFuZ2VzO1xuXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgIT09IG51bGwpIHtcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zID0gY2hhbmdlcy5leHBhbmRlZENvbHVtbnMubWVyZ2VkO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByZXZpb3VzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHRcdHt9LFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0dGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGVzdFxuXHRcdGlmIChjaGFuZ2VzLmZpZWxkcy5pZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpdGVtRW50cnkuaXRlbUlkID0gY2hhbmdlcy5maWVsZHMuaWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByZXZpb3VzO1xuXHR9XG5cblx0cHVibGljIGNvcHlUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMgKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXM6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyxcblx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHQpOiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzIHtcblx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGl0ZW1FbnRyeUNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0ZW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRvcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0ZW50cnlPcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGVudHJ5T3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5XG5cdFx0XHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZFBhcmVudENvbmRpdGlvbihcblx0XHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRcdGVudHJ5T3B0aW9ucy5wYXJlbnQsXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQucGFyc2UoKSxcblx0XHRcdFx0ZW50cnlPcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgcmVzcG9uc2UubGlua3NbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gaXRlbUVudHJpZXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRvcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKTtcblx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTx2b2lkPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuZmV0Y2hJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMucHVzaChcblx0XHRcdFx0XHRcdFx0dGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdCkhLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gaXRlbUVudHJpZXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBJdGVtRW50cmllcyBsaW5rZWQgdG8gdGhlIHBhcmVudCBJdGVtc1xuXHQgKlxuXHQgKiBAcGFyYW0gY29sdW1ucyBzaG91bGQgY29udGFpbiBhIGRlcml2ZWQgY29sdW1uIHRoYXQgcmVmZXJzIHRvIHRoZSBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyBmZXRjaExpbmtlZEl0ZW1FbnRyaWVzRGF0YSAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gcXVlcnkgPT09IG51bGwgP1xuXHRcdFx0dGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5SWRzKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KSA6XG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5XG5cdFx0XHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsaW5rZWRUbzogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0XHRxdWVyeToge2lkOiBwYXJlbnRJZEFycmF5fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5wYXJzZSgpLFxuXHRcdFx0XHQvLyBzaG91bGQgY29udGFpbiBhIGRlcml2ZWQgY29sdW1uIHRoYXQgcmVmZXJzIHRvIHRoZSBwYXJlbnRcblx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdlbmVyYWwgd2F5IHRvIHByb2Nlc3MgYW4gQVBJIHJlc3BvbnNlLlxuXHQgKiBXaWxsIGNhbGwge0BsaW5rIENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZCBzZXRJdGVtQ3JlYXRlZH0gaWYgYW4gZW50cnkgZG9lc24ndCBleGlzdCB5ZXQsIGFuZCBvdGhlcndpc2Uge0BsaW5rIENoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZCBzZXRJdGVtVXBkYXRlZH0gaWYgaXQgZG9lcy5cblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzQXBpUmVzcG9uc2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbkV4cGFuc2lvbjogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IHZvaWQge1xuXHRcdC8vIFdlIHNob3VsZCByZS1jaGVjayBpZiBhbiBlbnRyeSBpcyBub3QgY3JlYXRlZCBpbiB0aGUgbWVhbnRpbWVcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGZpZWxkcyA9IHJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGaWVsZHMgbm90IGZvdW5kIGluIHJlc3BvbnNlIGZvciAke2l0ZW1UeXBlfToke2l0ZW1JZH1gKTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5fc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24ucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgcGFzc2VkIEl0ZW1UeXBlL0l0ZW1JZC9jb2x1bW5zLCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlIHJlcXVlc3RlZCBJdGVtRW50cnkvY29sdW1ucyBhcmUgYWxyZWFkeSBjYWNoZWQuXG5cdCAqIFdpbGwgY3JlYXRlIGEgbmV3IHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBpZiB0aGUgSXRlbUVudHJ5IGRpZG4ndCBleGlzdCB5ZXRcblx0ICovXG5cdHByaXZhdGUgZmV0Y2hJdGVtRW50cnlEYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uU3Vic2V0Q2FjaGUucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0Ly8gVGhlcmUgYWxyZWFkeSBpcyBhbiBlbnRyeSBhbmQgaXQgY29udGFpbnMgdGhlIGNvbHVtbnMgd2UgbmVlZCwgc28gd2UgY2FuIHNhZmVseSByZXR1cm4gaXRcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlJZChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUucmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBub29wLCBSbUNvcmUgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlRGVwZW5kZW5jeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRFbnRyeVBhcmVudCxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vLi4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgT25BZnRlckNyZWF0ZUNhbGxiYWNrIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc1Byb2Nlc3Nvcic7XG5pbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi8uLi9Db2x1bW5TZXQnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yIH0gZnJvbSAnLi4vQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlciB9IGZyb20gJy4vU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL1NlcnZlckl0ZW1IYW5kbGVyJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSB7QGxpbmsgU2VydmVyQ2FjaGUgU2VydmVyQ2FjaGV9IGlzIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyaWVzfVxuICogd2hpY2ggYXJlIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuXG4gKlxuICogSXQncyBiYXNpY2FsbHkgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YWJhc2VcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZlckNhY2hlXG5cdGV4dGVuZHMgQWJzdHJhY3RDYWNoZSB7XG5cblx0cHVibGljIHJlYWRvbmx5IGl0ZW1IYW5kbGVyOiBTZXJ2ZXJJdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcjtcblxuXHRwdWJsaWMgcGFyZW50OiBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGRlcGVuZGVuY2llczogU2VydmVyQ2FjaGVEZXBlbmRlbmN5SW50ZXJmYWNlLFxuXHRcdGNvcmU6IFJtQ29yZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRkZXBlbmRlbmNpZXMsXG5cdFx0XHRjb3JlLFxuXHRcdCk7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyID0gbmV3IFNlcnZlckl0ZW1IYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdGRlcGVuZGVuY2llcy5xdWVyeVNlcnZpY2UsXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlcixcblx0XHRcdGRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2x1bW5VdGlsLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmFwaUZvcm1hdHRlcixcblx0XHRcdGRlcGVuZGVuY2llcy5pdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyKFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGRlcGVuZGVuY2llcy5yZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdGRlcGVuZGVuY2llcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHRkZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLFxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlcixcblx0XHRcdGRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5xdWVyeVNlcnZpY2UsXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sdW1uVXRpbCxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NSZXNwb25zZSAoXG5cdFx0cmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yLFxuXHRcdHJlcXVlc3RDb2x1bW5NYXA6IEFwaVJlcXVlc3RDb2x1bW5NYXAsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEgPSB0aGlzLmNvcmUuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnNPYmplY3QgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2UuaXRlbXMpIHtcblx0XHRcdGxldCBjb2x1bW5TZXQ6IENvbHVtblNldDtcblxuXHRcdFx0aWYgKGl0ZW1UeXBlID09PSByZXNwb25zZS5pdGVtVHlwZSkge1xuXHRcdFx0XHRjb2x1bW5TZXQgPSB0aGlzLmNvcmUuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVxdWVzdENvbHVtbk1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zT2JqZWN0LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29sdW1uU2V0ID0gdGhpcy5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb3JlLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogY29sdW1uU2V0LnJlcXVlc3QsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUlkU3RyaW5nIGluIHJlc3BvbnNlLml0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZFN0cmluZyksXG5cdFx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGFuZ2VzRGVsdGEgY3JlYXRlZCBieSB0aGUgQVBJIGNhbGwgKHtAbGluayBDaGFuZ2VzUHJvY2Vzc29yIENoYW5nZXNQcm9jZXNzb3J9L3tAbGluayBTb2NrZXRNZXNzYWdlSGFuZGxlciBTb2NrZXRNZXNzYWdlSGFuZGxlcn0sIG9yIG1hbnVhbGx5IHRocm91Z2ggYSBtb2R1bGUgZnVuY3Rpb24pIG9uIGFsbCBjYWNoZXNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tUGFyZW50IChcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF0sXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcblx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBmaWVsZHMgcmVxdWlyZWQgdG8gc2V0IHRoZSBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyBnZXRMaW5rRmllbGRzQnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50LFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCk6IFBhcnRpYWw8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGxpbmtUcmVlID0gdGhpcy5kZXBlbmRlbmNpZXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cdFx0Y29uc3QgcmVzdWx0OiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRyZXN1bHRbbGlua1RyZWVFbnRyeS5maWVsZF0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQuaXRlbXR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgZW50cnkgdG8gZ2V0IHRoZSBwYXJlbnQgZnJvbVxuXHQgKiBAcGFyYW0gX2Zyb21Jbml0aWFsIFVudXNlZCBwYXJhbWV0ZXIsIHRoZXJlIGZvciBhbGlnbm1lbnQgd2l0aCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnRdXG5cdCAqIEBwYXJhbSBfcHJvdmlkZWRGaWVsZHMgVW51c2VkIHBhcmFtZXRlciwgdGhlcmUgZm9yIGFsaWdubWVudCB3aXRoIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudF1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBVc2Uge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5nZXRQYXJlbnQgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudH0gaW5zdGVhZCBvZiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnR9IGlmIHlvdSdyZSBnZXR0aW5nIHRoZSBwYXJlbnQgaW4gdGhlIG9uUmVtb3ZlIGNhbGxiYWNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRfZnJvbUluaXRpYWw6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdF9wcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXM7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdFx0Y2hhbmdlcyxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBObyBsb2NhbCBlbnRyeSBmb3VuZGApO1xuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvcihgTm8gbG9jYWwgZmllbGRzIGZvdW5kIGZvciBJdGVtRW50cnkgd2l0aCBJdGVtVHlwZSAnJHtpdGVtRW50cnkuaXRlbVR5cGV9J2ApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBPbmx5IHRha2VzIHRoZSBsb2NhbCBjaGFuZ2VzIGludG8gYWNjb3VudCwgdXNlZCBmb3Igc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IHtcblx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNoYW5nZXM6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXNcblx0fSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZ2V0IGEgbG9jYWwgSXRlbUVudHJ5IHdpdGggZW50cnlJZCAnJHtpdGVtRW50cnlJZH0nIGJ1dCBjb3VsZG4ndCBmaW5kIGl0YCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGVudHJ5OiBpdGVtRW50cnksXG5cdFx0XHRjaGFuZ2VzOiB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBJdGVtRW50cnlbXSB7XG5cdFx0Y29uc3QgZW50cnkgPSB0aGlzLmdldExvY2FsQ29sbGVjdGlvbkVudHJ5KGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRsZXQgY2hhbmdlcyA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRlbnRyeS5xdWVyeS5zdHJpbmcsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNoYW5nZXMgPSBbXTtcblxuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLnNldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdGVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdGVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY2hhbmdlcztcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIGxvY2FsIGNvbGxlY3Rpb24gaXRlbXMgZm91bmQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSW52YWxpZGF0ZXMgdGhlIGNvbXBsZXRlIHNlcnZlciBjYWNoZSwgYWxsIGl0ZW1zIHdpbGwgYmUgcmUtZmV0Y2hlZCB3aGVuZXZlciB0aGV5IGFyZSByZXF1ZXN0ZWRcblx0ICovXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ2FjaGUgKCk6IHZvaWQge1xuXHRcdC8vIHRoZSBpdGVtSGFuZGxlciBjYWNoZSBvbmx5IGNvbnRhaW5zIHJlbW90ZSBlbnRyaWVzXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LnF1ZXVlUmVsb2FkKCksXG5cdFx0KTtcblxuXHRcdC8vIHF1ZXVlUmVsb2FkIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciBlYWNoIGluZGl2aWR1YWwgaXRlbVxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5mb3JFYWNoKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IGNvbGxlY3Rpb25FbnRyeS5xdWV1ZVJlbG9hZCgpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoYW5nZXMgZnJvbSB0aGUgY2hpbGQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHNob3VsZG4ndCB0aGlzIGRvIGV2ZXJ5dGhpbmcgZnJvbSBUcmFuc2FjdGlvbkNhY2hlLnNhdmUgP1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdFx0YnJlYWtVcEJ5UGFyZW50LFxuXHRcdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHQpXG5cdFx0XHQuZXhlY3V0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIGNoYW5nZXMgdG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgaXRzIGNoaWxkcmVuXG5cdCAqIERpZmZlcnMgZnJvbSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhfSBpbiB0aGUgaGFuZGxpbmcgb2YgZGVsZXRlZCBlbnRyaWVzIGFuZCB0aGUgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBjYWxsXG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlDaGFuZ2VzRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlOiBib29sZWFuID0gdHJ1ZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKGNoYW5nZXNEZWx0YS5pc0VtcHR5KCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdFx0cm9sbGJhY2s6IG5vb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hVcGRhdGVkRGVyaXZlZFZhbHVlc0Zyb21EZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtyZXN1bHQsIGludGVybmFsQ2hhbmdlc0RlbHRhLCByb2xsYmFja0Z1bmN0aW9uc30gPSBzdXBlci5fYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb2xkQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRkZWxldGUgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9sZENoYW5nZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHRcdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0aXNDYWxsZWRBZnRlckFwaVNhdmUsXG5cdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5QnlRdWVyeVN0cmluZyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5UXVlcnlTdHJpbmcoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoY29sbGVjdGlvbkVudHJ5SWQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGNoYW5nZXNPYmplY3Q6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIGNoYW5nZXNPYmplY3Q7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbGxlY3Rpb25RdWVyeSwgSXRlbUVudHJ5TWFwLCBJdGVtRW50cnlQYXJlbnRJZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ2FjaGUge1xuXG5cdHByaXZhdGUgZW50cmllczogSXRlbUVudHJ5TWFwPGFueT4gPSB7fTtcblxuXHRwdWJsaWMgZW50cmllc0J5RW50cnlJZDoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdldEJ5RW50cnlJZCAoaXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnlJZF07XG5cdH1cblxuXHRzb21lIChjYWxsYmFjazogKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGlmIChjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Z2V0QnlJdGVtVHlwZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2l0ZW1JZF0pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBlbnRyaWVzW2l0ZW1JZF07XG5cblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5tYXRjaFF1ZXJ5KFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldExvY2FsQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXG5cdFx0XHRpZiAoIWl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLm1hdGNoUXVlcnkoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldEJ5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBlbnRyaWVzW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpO1xuXG5cdFx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0aWYgKHBhcmVudC5pdGVtVHlwZSA9PT0gcGFyZW50VHlwZSAmJiBwYXJlbnQuaXRlbUlkID09IHBhcmVudElkKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGJhdGNoR2V0TG9jYWxCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkczogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRhZGRpdGlvbmFsUXVlcnk6IGFueSxcblx0KTogSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIG9mIHBhcmVudElkcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IFtdO1xuXHRcdH1cblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhcmVudC5pdGVtVHlwZSAhPT0gcGFyZW50VHlwZSB8fCByZXN1bHRbcGFyZW50Lml0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFF1ZXJ5ID09PSBudWxsIHx8IHRoaXMubWF0Y2hRdWVyeShcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRhZGRpdGlvbmFsUXVlcnksXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdFtwYXJlbnQuaXRlbUlkXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZvckVhY2ggKFxuXHRcdGNhbGxiYWNrOiAoXG5cdFx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHQpID0+IHZvaWQsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qXHRmaWx0ZXIgKGNhbGxiYWNrOiAoaXRlbUVudHJ5OiBJdGVtRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IEl0ZW1FbnRyeU1hcCA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0IGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0IGlmIChjYWxsYmFjayhpdGVtRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdID0gaXRlbUVudHJ5O1xuXHQgfVxuXHQgfVxuXG5cdCB0aGlzLmVudHJpZXMgPSBmaWx0ZXJlZEVudHJpZXM7XG5cdCB9XG5cdCAqL1xuXHR0b0FycmF5ICgpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGFkZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnkuaWRdID0gaXRlbUVudHJ5O1xuXG5cdFx0cmV0dXJuIGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1FbnRyeS5pdGVtSWRdID0gaXRlbUVudHJ5O1xuXHR9XG5cblx0Z2V0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogdW5kZWZpbmVkIHwgSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHQvLyBzaG91bGQgYmUgZmFzdFxuXHRjb250YWlucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dXBkYXRlSXRlbUlkPFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55Pj4gKFxuXHRcdGl0ZW1FbnRyeTogVCxcblx0XHRvbGRJdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogVCB7XG5cdFx0Y29uc3QgZW50cnlNYXAgPSB0aGlzLmVudHJpZXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGRlbGV0ZSBlbnRyeU1hcFtvbGRJdGVtSWRdO1xuXHRcdHJldHVybiBlbnRyeU1hcFtpdGVtRW50cnkuaXRlbUlkXSA9IGl0ZW1FbnRyeTtcblx0fVxuXG5cdGNsZWFyIChpdGVtRW50cnk/OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5lbnRyaWVzID0ge307XG5cdFx0XHR0aGlzLmVudHJpZXNCeUVudHJ5SWQgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXJCeUl0ZW1JZChcblx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdGNsZWFyQnlJdGVtSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCFlbnRyaWVzLmhhc093blByb3BlcnR5KGl0ZW1JZCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRkZWxldGUgdGhpcy5lbnRyaWVzQnlFbnRyeUlkW2VudHJpZXNbaXRlbUlkXS5pZF07XG5cblx0XHRyZXR1cm4gZGVsZXRlIGVudHJpZXNbaXRlbUlkXTtcblx0fVxuXG5cdG1hdGNoUXVlcnkgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdHVwbGUgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKGl0ZW1FbnRyeS5pZCk7XG5cblx0XHRyZXR1cm4gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdCh0aGlzLnRyYW5zYWN0aW9uIGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpXG5cdFx0XHRcdFx0PyB0dXBsZS5jaGFuZ2VzXG5cdFx0XHRcdFx0OiB0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGl0ZW1FbnRyeSksXG5cdFx0XHQpXG5cdFx0XHQubWF0Y2hRdWVyeShxdWVyeS5vYmplY3QpID09PSB0cnVlOyAvLyBUT0RPOiBtYXliZT9cblx0fVxufVxuIiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBBTExfUEVSTUlTU0lPTlMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXV0aEludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0RW50cnlQYXJlbnQsXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0RmllbGRNYXAsXG5cdEl0ZW1FcnJvcixcblx0SXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1UeXBlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlTZXJ2aWNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIG1hdGNoUGFyZW50IChcblx0XHRvbGRQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG9sZFBhcmVudCA9PT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdChvbGRQYXJlbnQgPT09IG51bGwgJiYgbmV3UGFyZW50ICE9PSBudWxsKVxuXHRcdFx0fHwgKG9sZFBhcmVudCAhPT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGhleSBjYW4ndCBiZSBudWxsIGFueW1vcmUgaGVyZSByaWdodCA/XG5cdFx0cmV0dXJuIChcblx0XHRcdG9sZFBhcmVudCEuaXRlbVR5cGUgPT09IG5ld1BhcmVudCEuaXRlbVR5cGVcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHQmJiBvbGRQYXJlbnQhLml0ZW1JZCA9PSBuZXdQYXJlbnQhLml0ZW1JZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGZpZWxkcyByZXF1aXJlZCB0byBzZXQgdGhlIHBhcmVudFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldFBhcmVudEJ5RmllbGRzIEl0ZW1FbnRyeVNlcnZpY2UuZ2V0UGFyZW50QnlGaWVsZHN9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IFBhcnRpYWw8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4gPSB7fTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5LnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdHJlc3VsdFtsaW5rVHJlZUVudHJ5LmZpZWxkXSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdC5pdGVtdHlwZSA9IHBhcmVudC5pdGVtVHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtID0gcGFyZW50Lml0ZW1JZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIGFuIHtAbGluayBFbnRyeVBhcmVudCBFbnRyeVBhcmVudH0gb2JqZWN0IGZyb20gdGhlIGZpZWxkc1xuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudCBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudH1cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnRCeUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnRUeXBlXVtpdGVtRW50cnkuaXRlbVR5cGUgYXMgc3RyaW5nXTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm9uIGV4aXN0aW5nIGxpbmsgYmV0d2VlbiAnJHtwYXJlbnRUeXBlfSctPicke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBFbnRyeVBhcmVudCA9IHt9IGFzIEVudHJ5UGFyZW50O1xuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLkRJUkVDVCkge1xuXHRcdFx0cmVzdWx0Lml0ZW1UeXBlID0gcGFyZW50VHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHNbbGlua1RyZWVFbnRyeS5maWVsZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGFscmVhZHkga25vdyB0aGUgcGFyZW50VHlwZT9cblx0XHRcdHJlc3VsdC5pdGVtVHlwZSA9IGZpZWxkcy5pdGVtdHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHMuaXRlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGdldERpc3BsYXlOYW1lPEl0ZW1FbnRyeVR5cGUgZXh0ZW5kcyBJdGVtRW50cnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0KTogc3RyaW5nIHtcblxuXHRcdHN3aXRjaCAoaXRlbUVudHJ5Lml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdFx0cmV0dXJuIGZpZWxkcy50eXBlID09PSAnYmVkcmlqZidcblx0XHRcdFx0XHQ/IGZpZWxkcy5iZWRyaWpmXG5cdFx0XHRcdFx0OiB0aGlzLmdldEZ1bGxOYW1lKFxuXHRcdFx0XHRcdFx0ZmllbGRzLnZvb3JuYWFtLFxuXHRcdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0XHRmaWVsZHMubmFhbSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnTWVkZXdlcmtlcic6XG5cdFx0XHRjYXNlICdQZXJzb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRGdWxsTmFtZShcblx0XHRcdFx0XHRmaWVsZHMudm9vcm5hYW0sXG5cdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0ZmllbGRzLmFjaHRlcm5hYW0sXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmllbGRzW3RoaXMuZ2V0VGl0bGVGaWVsZChpdGVtRW50cnkuaXRlbVR5cGUpXTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9ucyAob3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UpOiBJdGVtRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHQvLyB0b2RvOiB0cmFuc2xhdGVcblx0Y3JlYXRlVW5mb3VuZFJlbW90ZUl0ZW1FcnJvciAoKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6ICdUaGUgcmVxdWVzdGVkIGl0ZW0gY291bGQgbm90IGJlIGZvdW5kIC8geW91ciBjdXJyZW50IHBlcm1pc3Npb25zIGFyZSBub3Qgc3VmZmljaWVudCd9O1xuXHR9XG5cblx0Y3JlYXRlVW5mb3VuZExvY2FsSXRlbUVycm9yIChpdGVtVHlwZTogSXRlbVR5cGUpOiBJdGVtRXJyb3Ige1xuXHRcdHJldHVybiB7bWVzc2FnZTogYEEgbG9jYWwgaXRlbSBvZiB0eXBlICR7aXRlbVR5cGV9IGNvdWxkIG5vdCBiZSBmb3VuZGB9O1xuXHR9XG5cblx0Y3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvciAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGl0ZW0gb2YgdHlwZSAke2l0ZW1UeXBlfSBub3QgYmUgY3JlYXRlZCwgdGhlIElEIGlzIGFscmVhZHkgaW4gdXNlYH07XG5cdH1cblxuXHRnZXRGdWxsTmFtZSAoXG5cdFx0Zmlyc3ROYW1lOiBzdHJpbmcgPSAnJyxcblx0XHRpbmZpeDogc3RyaW5nID0gJycsXG5cdFx0bGFzdE5hbWU6IHN0cmluZyA9ICcnLFxuXHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaXJzdE5hbWVcblx0XHRcdC50cmltKClcblx0XHRcdC5jb25jYXQoXG5cdFx0XHRcdCcgJyxcblx0XHRcdFx0aW5maXgsXG5cdFx0XHQpXG5cdFx0XHQudHJpbSgpXG5cdFx0XHQuY29uY2F0KFxuXHRcdFx0XHQnICcsXG5cdFx0XHRcdGxhc3ROYW1lLFxuXHRcdFx0KVxuXHRcdFx0LnRyaW0oKTtcblx0fVxuXG5cdGdldFRpdGxlRmllbGQgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHN0cmluZyB7XG5cdFx0c3dpdGNoIChpdGVtVHlwZSkge1xuXHRcdFx0Y2FzZSAnRXhlbXBsYWFyJzpcblx0XHRcdFx0cmV0dXJuICdzZXJpZW51bW1lcic7XG5cdFx0XHRjYXNlICdGYWN0dXVyJzpcblx0XHRcdFx0cmV0dXJuICdudW1tZXInO1xuXHRcdFx0Y2FzZSAnRmlsZXMnOlxuXHRcdFx0XHRyZXR1cm4gJ2ZyaWVuZGx5bmFtZSc7XG5cdFx0XHRjYXNlICdGdW5jdGllJzpcblx0XHRcdGNhc2UgJ1N0YW5kYWFyZGZ1bmN0aWUnOlxuXHRcdFx0XHRyZXR1cm4gJ25hYW1pbnRlcm4nO1xuXHRcdFx0Y2FzZSAnVm9vcnJhYWRtdXRhdGllJzpcblx0XHRcdFx0cmV0dXJuICdvbXNjaHJpanZpbmcnO1xuXHRcdFx0Y2FzZSAnQmFyY29kZSc6XG5cdFx0XHRcdHJldHVybiAnY29kZSc7XG5cdFx0XHRjYXNlICdCZXRhYWxtaWRkZWwnOlxuXHRcdFx0Y2FzZSAnQmV0YWxpbmdzY29uZGl0aWUnOlxuXHRcdFx0Y2FzZSAnQnJpZWZwYXBpZXInOlxuXHRcdFx0Y2FzZSAnVGF4Q2xhc3MnOlxuXHRcdFx0Y2FzZSAnVGF4U2NoZW1hJzpcblx0XHRcdGNhc2UgJ0NvbmRpdGlvbic6XG5cdFx0XHRjYXNlICdGYWN0dXVybW9tZW50Jzpcblx0XHRcdGNhc2UgJ0Z1bmN0aWVncm9lcCc6XG5cdFx0XHRjYXNlICdHcm9vdGJvZWsnOlxuXHRcdFx0Y2FzZSAnSW5odXVyJzpcblx0XHRcdGNhc2UgJ0luaHV1cmdyb2VwJzpcblx0XHRcdGNhc2UgJ0luaHV1cm1hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdNYXRlcmlhYWwnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsQ2F0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXJ0YXJpZWYnOlxuXHRcdFx0Y2FzZSAnTm90aXRpZSc6XG5cdFx0XHRjYXNlICdQbGFubmluZ21hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1N0YWZmZWxncm9lcCc6XG5cdFx0XHRjYXNlICdTdWJwcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1RhYWsnOlxuXHRcdFx0Y2FzZSAnVGFnJzpcblx0XHRcdGNhc2UgJ1RlbXBsYXRlJzpcblx0XHRcdGNhc2UgJ1RpamQnOlxuXHRcdFx0Y2FzZSAnVGl0ZWwnOlxuXHRcdFx0Y2FzZSAnVHlwZSc6XG5cdFx0XHRjYXNlICdWb2VydHVpZyc6XG5cdFx0XHRcdHJldHVybiAnbmFhbSc7XG5cdFx0XHQvLyBjYXNlICdDb250YWN0Jzpcblx0XHRcdC8vIGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Ly8gY2FzZSAnUGVyc29uJzpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIG9ubHkgdXNlIGRpc3BsYXluYW1lIGZvciBpdGVtcyB0aGF0IGRvbnQndCBoYXZlIGEgc2ltcGxlLCB3cml0YWJsZSBuYW1lIGZpZWxkXG5cdFx0XHRcdC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciB0ZW1wbGF0ZWQgaXRlbXNcblx0XHRcdFx0cmV0dXJuICdkaXNwbGF5bmFtZSc7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETzogd2UgY2FuIHJlbW92ZSB0aGVzZSBvbmNlIGFsbCBjb2x1bW5zIGFyZSByZXNwZWN0ZWQgZm9yIGxvY2FsIGl0ZW1zIFtSTTQtMTAzNzhdXG5cdHB1YmxpYyBnZXRMb2NhbERlZmF1bHRWYWx1ZXMgKCk6IEZpZWxkTWFwIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGVybWlzc2lvbnM6IEFMTF9QRVJNSVNTSU9OUyxcblx0XHRcdGNyZWF0b3I6IHRoaXMuYXV0aEludGVyZmFjZS5nZXRVc2VySWQoKSxcblx0XHRcdGNyZWF0ZWQ6IG1vbWVudCgpLFxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IERVUExJQ0FURV9LRVlXT1JELCBEVVBMSUNBVEVfUFJFRklYLCBORVdfS0VZV09SRCwgTkVXX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJdGVtSWQsIFN0YXRlS2V5LCBTdGF0ZUtleVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlTZXJ2aWNlIHtcblx0c2VwYXJhdG9yOiBzdHJpbmcgPSAnOic7XG5cblx0Y29uc3RydWN0b3IgKCkge31cblxuXHRnZXRTaW5nbGVLZXkgKGl0ZW1UeXBlOiBzdHJpbmcsIGl0ZW1JZDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gaXRlbVR5cGUgKyB0aGlzLnNlcGFyYXRvciArIGl0ZW1JZDtcblx0fVxuXG5cdGdldENzc0tleSAoLi4uYXJncyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFyZ3Muam9pbignXycpO1xuXHR9XG5cblx0cGFyc2VTdGF0ZUtleSAoc3RhdGVLZXk6IHN0cmluZyk6IFN0YXRlS2V5IHwgbnVsbCB7XG5cdFx0c3RhdGVLZXkgPSBzdGF0ZUtleS50b1N0cmluZygpO1xuXG5cdFx0aWYgKHN0YXRlS2V5LnN1YnN0cmluZygwLCBORVdfS0VZV09SRC5sZW5ndGgpID09PSBORVdfS0VZV09SRClcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IFN0YXRlS2V5VHlwZS5OZXcsXG5cdFx0XHRcdHRlbXBsYXRlOiBzdGF0ZUtleS5zdWJzdHJpbmcoTkVXX0tFWVdPUkQubGVuZ3RoKSAvLyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgdXNlZCwgcmVldmFsdWF0ZVxuXHRcdFx0fTtcblxuXHRcdGlmIChzdGF0ZUtleS5zdWJzdHJpbmcoMCwgRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKSA9PT0gRFVQTElDQVRFX0tFWVdPUkQpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBTdGF0ZUtleVR5cGUuRHVwbGljYXRlLFxuXHRcdFx0XHRpdGVtSWQ6ICtzdGF0ZUtleS5zdWJzdHJpbmcoRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKVxuXHRcdFx0fTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0RHVwbGljYXRlU3RhdGVLZXkgKGl0ZW1JZDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gRFVQTElDQVRFX0tFWVdPUkQgKyBpdGVtSWQ7XG5cdH1cblxuXHRnZXROZXdTdGF0ZUtleSAodGVtcGxhdGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBORVdfS0VZV09SRCArIHRlbXBsYXRlVHlwZTtcblx0fVxuXG5cdGdldExvY2FsSWQgKCk6IEl0ZW1JZCB7XG5cdFx0cmV0dXJuICsoTkVXX1BSRUZJWCArIHRoaXMuZ2V0UmFuZG9tU3RyaW5nKCkpO1xuXHR9XG5cblx0Z2V0TG9jYWxEdXBsaWNhdGVJZCAoKTogSXRlbUlkIHtcblx0XHRyZXR1cm4gKyhEVVBMSUNBVEVfUFJFRklYICsgdGhpcy5nZXRSYW5kb21TdHJpbmcoKSk7XG5cdH1cblxuXHRnZXRSYW5kb21TdHJpbmcgKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICgnJyArIE1hdGgucmFuZG9tKCkpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIDgpO1xuXHR9XG5cblx0Ly8gbm90ZTogdGhlIGNoYW5nZXMgY29tcGlsZXIgdXNlcyB0aGlzXG5cdC8vIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIHVuZGVmaW5lZCAoaXRlbUhhbmRsZXIuY3JlYXRlUmVxdWVzdClcblx0aXNMb2NhbElkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pc05ld0lkKGl0ZW1JZCkgfHwgdGhpcy5pc0R1cGxpY2F0ZUlkKGl0ZW1JZCkpO1xuXHR9XG5cblx0aXNOZXdJZCAoaXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gaXRlbUlkID09PSBORVdfS0VZV09SRCB8fCAoJycgKyBpdGVtSWQpLnN1YnN0cmluZygwLCBORVdfUFJFRklYLmxlbmd0aCkgPT09IE5FV19QUkVGSVg7XG5cdH1cblxuXHRpc0R1cGxpY2F0ZUlkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgPT09IERVUExJQ0FURV9LRVlXT1JEIHx8ICgnJyArIGl0ZW1JZCkuc3Vic3RyaW5nKDAsIERVUExJQ0FURV9QUkVGSVgubGVuZ3RoKSA9PT0gRFVQTElDQVRFX1BSRUZJWDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1NYXAsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBMb2NrVG9rZW4gPSB7aXNGb3JlaWduOiBmYWxzZSwgaWQ6IG51bWJlciwgdG9rZW46IHN0cmluZ30gfCB7aXNGb3JlaWduOiB0cnVlLCBtZXNzYWdlOiBzdHJpbmd9O1xuXG5leHBvcnQgY2xhc3MgTG9ja1NlcnZpY2Uge1xuXG5cdHByaXZhdGUgbG9ja0l0ZW1zOiBJdGVtTWFwPExvY2tUb2tlbj4gPSB7fTtcblx0cHJpdmF0ZSBwcm9taXNlczogSXRlbU1hcDxQcm9taXNlSW50ZXJmYWNlPExvY2tUb2tlbj4+ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGdldExvY2tzICgpOiBMb2NrU2VydmljZVsnbG9ja0l0ZW1zJ10ge1xuXHRcdHJldHVybiB0aGlzLmxvY2tJdGVtcztcblx0fVxuXG5cdHB1YmxpYyBoYXNMb2NrIChsb2NrVG9rZW5JZDogSXRlbUlkKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxvY2tJdGVtcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbG9ja0l0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBsb2NrSXRlbSA9IGxvY2tJdGVtc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRpZiAoIWxvY2tJdGVtLmlzRm9yZWlnbiAmJiBsb2NrSXRlbS5pZCA9PSBsb2NrVG9rZW5JZCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gc2hvdWxkIGJlIGZhc3QgKHdhdGNoZWQpXG5cdHB1YmxpYyBpc0xvY2tlZCAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxvY2tJdGVtID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMubG9ja0l0ZW1zLFxuXHRcdCk7XG5cblx0XHRpZiAobG9ja0l0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5pc0ZvcmVpZ247XG5cdH1cblxuXHRwdWJsaWMgZ2V0TWVzc2FnZSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG5cdFx0Y29uc3QgbG9ja0l0ZW0gPSB0aGlzLmdldFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0KTtcblxuXHRcdGlmIChsb2NrSXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmICghbG9ja0l0ZW0uaXNGb3JlaWduKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5tZXNzYWdlO1xuXHR9XG5cblx0Ly8gZG9lcyBub3QgcmVqZWN0IHdoZW4gYSBmb3JlaWduIGxvY2sgaXMgZW5jb3VudGVyZWRcblx0Ly8gaXMgYWxzbyB1c2VkIGJ5IGRlbGV0ZUxvY2tcblx0cHVibGljIGZldGNoQ2FjaGVkTG9jayAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8dW5kZWZpbmVkIHwgTG9ja1Rva2VuPiB7XG5cdFx0Y29uc3QgbG9jayA9IHRoaXMuZ2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHQpO1xuXG5cdFx0aWYgKGxvY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihsb2NrKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMucHJvbWlzZXMsXG5cdFx0KTtcblxuXHRcdGlmIChwcm9taXNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuZXJyb3JIYW5kbGVyO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWRMb2NrKGl0ZW1FbnRyeSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRsb2NrSXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKGxvY2tJdGVtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBsb2NrSXRlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TG9jayhpdGVtRW50cnkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGxvY2tJdGVtID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbG9ja0l0ZW0uaXNGb3JlaWduID9cblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QobG9ja0l0ZW0ubWVzc2FnZSkgOlxuXHRcdFx0XHRcdFx0bG9ja0l0ZW0udG9rZW47XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlcXVlc3RMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxMb2NrVG9rZW4+IHtcblx0XHRjb25zdCB7aXRlbVR5cGUsIGl0ZW1JZH0gPSBpdGVtRW50cnk7XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LmNyZWF0ZShcblx0XHRcdFx0J0xvY2t0b2tlbicsXG5cdFx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpdGVtdHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbTogaXRlbUlkLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wcm9taXNlc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFZhbHVlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5saW5rcy5Mb2NrdG9rZW5bMF0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3IgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnByb21pc2VzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgPT09IDMwMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlzRm9yZWlnbjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRwcm9taXNlLFxuXHRcdFx0dGhpcy5wcm9taXNlcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGRlbGV0ZUxvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5mZXRjaENhY2hlZExvY2soaXRlbUVudHJ5KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNhY2hlZExvY2sgPT4ge1xuXHRcdFx0XHRcdC8vIHVuZGVmaW5lZDogbm90IHJlcXVlc3RlZCB5ZXRcblx0XHRcdFx0XHRpZiAoY2FjaGVkTG9jayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGNhY2hlZExvY2suaXNGb3JlaWduKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmNsZWFyTG9jayhpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRbY2FjaGVkTG9jay5pZF0sXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY2xlYXJMb2NrKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChsb2NrSXRlbXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWxldGUgbG9ja0l0ZW1zW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRWYWx1ZTxUPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRtYXA6IEl0ZW1NYXA8VD4sXG5cdCk6IHVuZGVmaW5lZCB8IFQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtRW50cnkuaXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgc2V0VmFsdWU8VD4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0dmFsdWU6IFQsXG5cdFx0bWFwOiBJdGVtTWFwPFQ+LFxuXHQpOiBUIHtcblx0XHRyZXR1cm4gY3JlYXRlUGF0aChcblx0XHRcdG1hcCxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0SXRlbU1hcCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmNvbnN0IEVNUFRZX0VOVFJZID0ge307XG5cbmV4cG9ydCB0eXBlIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCA9IHtcblx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0aXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwXG59O1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblxuXHRwdWJsaWMgcGFyZW50TWFwOiBhbnkgPSB7fTtcblx0cHVibGljIGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0SXRlbU1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHByb2Nlc3MgKCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCB7XG5cdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBIFRyYW5zYWN0aW9uQ2FjaGUgcm9vdEl0ZW0gaXMgcmVxdWlyZWQgZm9yIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbicpO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyZW50TWFwID0gdGhpcy5jcmVhdGVQYXJlbnRNYXAoKTtcblxuXHRcdHRoaXMucHJvY2Vzc0l0ZW1zKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5yb290SXRlbS5pdGVtVHlwZSxcblx0XHRcdFt0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtXSxcblx0XHRcdHt9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQ6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbUlkLFxuXHRcdFx0aXRlbXM6IHRoaXMuZGVzdGluYXRpb24sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUGFyZW50TWFwICgpIHtcblx0XHRjb25zdCByZXN1bHQ6IHtcblx0XHRcdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtwYXJlbnRJZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gPSB7fTtcblxuXHRcdC8vIHRvZG86IGFsc28gaW5jbHVkZSBwYXJlbnQncyBlbnRyaWVzID8gcHJvYmFibHkgbm90Li4uXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblx0XHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHQvLyB3ZSBkb24ndCBjYXJlIGZvciBpdGVtcyB0aGF0IGFyZSBub3QgbGlua2VkIHRvIHRoZSByb290IGl0ZW1cblx0XHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHBhcmVudFR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRcdGNvbnN0IHBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFtwYXJlbnRUeXBlXVtwYXJlbnRJZF1baXRlbVR5cGVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdW2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0bGlua0FjY3VtdWxhdG9yOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0sXG5cdCkge1xuXHRcdGlmICh0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGxpbmtBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0Ly8gZWFjaCBpdGVtIG9ubHkgaGFzIGEgc2luZ2xlIHBhcmVudCwgc28gd2UgY2FuIHNhZmVseSBkbyB0aGlzXG5cdFx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSA9IHRoaXMucHJvY2Vzc0l0ZW0oaXRlbUVudHJ5KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0KToge3ZhbHVlcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sIGxpbmtzPzoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119fSB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHRjb25zdCBjaGlsZEl0ZW1zID0gdGhpcy5nZXRJdGVtc0J5UGFyZW50KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoaWxkQ29sbGVjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0Q29sbGVjdGlvbnNCeVBhcmVudChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZvcm1hdFJlcXVlc3QoaXRlbUVudHJ5KTtcblx0XHRjb25zdCBsaW5rcyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZFR5cGUgaW4gY2hpbGRJdGVtcykge1xuXHRcdFx0dGhpcy5wcm9jZXNzSXRlbXMoXG5cdFx0XHRcdGNoaWxkVHlwZSxcblx0XHRcdFx0Y2hpbGRJdGVtc1tjaGlsZFR5cGVdLFxuXHRcdFx0XHRsaW5rcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY2hpbGRDb2xsZWN0aW9ucykge1xuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLnF1ZXJ5ICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2Nlc3NJdGVtcyhcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkoY29sbGVjdGlvbkVudHJ5LmlkKSxcblx0XHRcdFx0bGlua3MsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhc1ZhbHVlcyA9IGhhc1Byb3BlcnRpZXModmFsdWVzKTtcblx0XHRjb25zdCBoYXNMaW5rcyA9IGhhc1Byb3BlcnRpZXMobGlua3MpO1xuXG5cdFx0aWYgKGhhc1ZhbHVlcyAmJiBoYXNMaW5rcykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dmFsdWVzOiB2YWx1ZXMsXG5cdFx0XHRcdGxpbmtzOiBsaW5rcyxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc1ZhbHVlcykge1xuXHRcdFx0cmV0dXJuIHt2YWx1ZXM6IHZhbHVlc307XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0xpbmtzKSB7XG5cdFx0XHRyZXR1cm4ge2xpbmtzOiBsaW5rc307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEVNUFRZX0VOVFJZO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRJdGVtc0J5UGFyZW50IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHQpIHtcblx0XHRjb25zdCBtYXBFbnRyeSA9IHRoaXMucGFyZW50TWFwW3BhcmVudFR5cGVdO1xuXG5cdFx0aWYgKG1hcEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cblx0XHRpZiAobWFwRW50cnlbcGFyZW50SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwRW50cnlbcGFyZW50SWRdO1xuXHR9XG59XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzLCBpbkFycmF5IH0gZnJvbSAnLi9VdGlsJztcblxuY29uc3QgTUFZQkUgPSAnbWF5YmUnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlNYXRjaGVyIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRwdWJsaWMgZmllbGRzOiBGaWVsZE1hcCxcblx0XHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpIHtcblxuXHR9XG5cblx0cHJpdmF0ZSBjb21wYXJlVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdHF1ZXJ5VmFsdWU6IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG1vbWVudC5pc01vbWVudChxdWVyeVZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVNb21lbnRPYmplY3RzKFxuXHRcdFx0XHRxdWVyeVZhbHVlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc0R1cmF0aW9uKHF1ZXJ5VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29tcGFyZUR1cmF0aW9ucyhcblx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHF1ZXJ5VmFsdWUgPT0gdmFsdWU7XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmN1c3RvbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0Ly8gbGlua2VkVG8gYWxzbyBjb250YWlucyAucXVlcnlcblx0XHRpZiAocXVlcnkubGlua2VkVG8gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubWF0Y2hMaW5rZWRUb1F1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkucXVlcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jb25kaXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoQ29tcGxleFF1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHRoaXMuZmllbGRzW3F1ZXJ5LmtleV0sXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5TWF0Y2hlcjogVW5zdXBwb3J0ZWQgcXVlcnkhIFBhcnNlZD8nKTtcblx0fVxuXG5cdHByaXZhdGUgbWF0Y2hMaW5rZWRUb1F1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnJldmVyc2UpIHtcblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblx0XHRsZXQgbWF0Y2g7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRtYXRjaCA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAocXVlcnkubGlua2VkVG8gIT09IHBhcmVudC5pdGVtVHlwZSkge1xuXHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2ggPSB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFtYXRjaCA6ICEhbWF0Y2g7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoQ29tcGxleFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3QgY29uZGl0aW9ucyA9IHF1ZXJ5LmNvbmRpdGlvbnM7XG5cblx0XHRsZXQgcmVzdWx0O1xuXHRcdGxldCB0ZXJtaW5hbDtcblxuXHRcdHN3aXRjaCAocXVlcnkub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgJ0FORCc6XG5cdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdHRlcm1pbmFsID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnT1InOlxuXHRcdFx0XHRyZXN1bHQgPSBmYWxzZTtcblx0XHRcdFx0dGVybWluYWwgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBvcGVyYXRvcicpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaFF1ZXJ5KGNvbmRpdGlvbik7XG5cblx0XHRcdGlmIChtYXRjaCA9PT0gdGVybWluYWwpIHtcblx0XHRcdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICF0ZXJtaW5hbCA6IHRlcm1pbmFsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRcdHJlc3VsdCA9IE1BWUJFO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZXN1bHQgPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFyZXN1bHQgOiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoU2ltcGxlUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3Qga2V5ID0gcXVlcnkua2V5O1xuXHRcdGxldCBxdWVyeVZhbHVlID0gcXVlcnkudmFsdWU7XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSAvLyBDb3VsZCBiZSBsaW5rZWRUbyBhbiBlbXB0eSBvYmplY3Rcblx0XHR7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnUmVxdWlyZWQgZmllbGQnLFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdCdub3QgZm91bmQgZm9yJyxcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnlWYWx1ZSA9PT0gJ05PVycpIHtcblx0XHRcdHF1ZXJ5VmFsdWUgPSBtb21lbnQoKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHF1ZXJ5LmNvbXBhcmF0b3IpIHtcblx0XHRcdGNhc2UgJz0nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICchPSc6XG5cdFx0XHRcdHJldHVybiAhdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICc8Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDwgcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJzw9Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDw9IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICc+Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID4gcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJz49Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID49IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICdJTic6XG5cdFx0XHRcdC8vIE9ubHkgSU4gc3VwcG9ydHMgTk9ULCBhbGwgb3RoZXIgY29tcGFyYXRvcnMgYXJlIGZsaXBwZWQgaW4gdGhlIFF1ZXJ5UGFyc2VyXG5cdFx0XHRcdGNvbnN0IHJlcyA9IGluQXJyYXkoXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZXR1cm4gcXVlcnkubm90ID8gIXJlcyA6IHJlcztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBjb21wYXJhdG9yOiAnICsgcXVlcnkuY29tcGFyYXRvciArICcgaW4gcXVlcnkgJyArIHF1ZXJ5KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENPTVBBUkFUT1JTLCBPUEVSQVRPUlMsIE9QRVJBVE9SU19UWVBFLCBRdWVyeVBhcnNlckJhc2UgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyQmFzZSc7XG5cbmV4cG9ydCBlbnVtIENPTlNUQU5UUyB7XG5cdE9CSiA9IDAsXG5cdFNUUiA9IDEsXG5cdFNFUCA9ICc6J1xufVxuXG5jb25zdCBWQUxJRF9DT01QQVJBVE9SUyA9IE9iamVjdC5rZXlzKENPTVBBUkFUT1JTKVxuXHQubWFwKFxuXHRcdGtleSA9PiBDT01QQVJBVE9SU1trZXldLFxuXHQpO1xuXG5leHBvcnQgdHlwZSBDT01QQVJBVE9SU19UWVBFID0gJz0nIHwgJyE9JyB8ICc8JyB8ICc+JyB8ICc8PScgfCAnPj0nIHwgJ0lOJyB8IENPTVBBUkFUT1JTO1xuXG5jb25zdCBPUFBPU0lURV9DT01QQVJBVE9SX01BUDogeyBba2V5IGluIENPTVBBUkFUT1JTXTogQ09NUEFSQVRPUlMgfSA9IHtcblx0W0NPTVBBUkFUT1JTLkVRVUFMU106IENPTVBBUkFUT1JTLk5PVF9FUVVBTFMsXG5cdFtDT01QQVJBVE9SUy5OT1RfRVFVQUxTXTogQ09NUEFSQVRPUlMuRVFVQUxTLFxuXHRbQ09NUEFSQVRPUlMuTU9SRV9USEFOXTogQ09NUEFSQVRPUlMuTEVTU19PUl9FUVVBTF9USEFOLFxuXHRbQ09NUEFSQVRPUlMuTEVTU19USEFOXTogQ09NUEFSQVRPUlMuRVFVQUxfT1JfTU9SRV9USEFOLFxuXHRbQ09NUEFSQVRPUlMuTEVTU19PUl9FUVVBTF9USEFOXTogQ09NUEFSQVRPUlMuTU9SRV9USEFOLFxuXHRbQ09NUEFSQVRPUlMuRVFVQUxfT1JfTU9SRV9USEFOXTogQ09NUEFSQVRPUlMuTEVTU19USEFOLFxuXHQvLyBJbiB1c2VzICdub3Q6IHRydWUnIGluc3RlYWQgb2YgcmV2ZXJzaW5nIHRoZSBxdWVyeVxuXHRbQ09NUEFSQVRPUlMuSU5dOiBDT01QQVJBVE9SUy5JTixcbn07XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVBhcnNlclxuXHRleHRlbmRzIFF1ZXJ5UGFyc2VyQmFzZTxbb2JqZWN0LCBzdHJpbmddPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRwcml2YXRlIHBhcmFtZXRlcnM6IG9iamVjdCxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlRW1wdHlRdWVyeSAoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHt9LFxuXHRcdFx0J3t9Jyxcblx0XHRdIGFzIFtvYmplY3QsIHN0cmluZ107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnBhcnNlKHN1YlF1ZXJ5KTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGtleSxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgJ3N1YicgKyBDT05TVEFOVFMuU0VQICsga2V5ICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcgPSAnJyxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUgPSAnJyxcblx0XHRmaWVsZDogc3RyaW5nID0gJycsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2UocXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdHF1ZXJ5OiBwYXJzZWRRdWVyeVtDT05TVEFOVFMuT0JKXSxcblx0XHRcdFx0bm90LFxuXHRcdFx0fSxcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcblx0XHRcdCdbJyArICdzdWJGaWVsZCcgKyBDT05TVEFOVFMuU0VQICsga2V5ICsgQ09OU1RBTlRTLlNFUCArIGl0ZW1UeXBlICsgQ09OU1RBTlRTLlNFUCArIGZpZWxkICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2VhcmNoUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRzZWFyY2g6IHZhbHVlW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgJ3NlYXJjaCcgKyBDT05TVEFOVFMuU0VQICsgdmFsdWVbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDdXN0b21RdWVyeSAoXG5cdFx0Y3VzdG9tOiBzdHJpbmcsXG5cdFx0cGFyYW1ldGVyczogYW55LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRpZiAocGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y3VzdG9tLFxuXHRcdFx0XHRcdG5vdCxcblx0XHRcdFx0fSxcblx0XHRcdFx0J1snICsgY3VzdG9tICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRcdF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyc2VkUGFyYW1ldGVycyA9IHRoaXMucGFyc2VDdXN0b21QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0Y3VzdG9tLFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJzZWRQYXJhbWV0ZXJzW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgY3VzdG9tICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFBhcmFtZXRlcnNbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDdXN0b21QYXJhbWV0ZXJzIChwYXJhbWV0ZXJzOiBhbnkpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVycylcblx0XHRcdC5zb3J0KCk7XG5cblx0XHRjb25zdCBxdWVyeTogQXBpUXVlcnkgPSB7fSBhcyBBcGlRdWVyeTtcblx0XHRsZXQgc3RyaW5nID0gJyc7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbaV07XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUocGFyYW1ldGVyc1trZXldKTtcblxuXHRcdFx0cXVlcnlba2V5XSA9IHZhbHVlW0NPTlNUQU5UUy5PQkpdO1xuXG5cdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0c3RyaW5nICs9IENPTlNUQU5UUy5TRVA7XG5cdFx0XHR9XG5cblx0XHRcdHN0cmluZyArPSB2YWx1ZVtDT05TVEFOVFMuU1RSXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0cXVlcnksXG5cdFx0XHRzdHJpbmcsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVNpbXBsZVF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHRcdGNvbXBhcmF0b3I/OiBDT01QQVJBVE9SU19UWVBFLFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHR2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUodmFsdWUpO1xuXG5cdFx0aWYgKGNvbXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29tcGFyYXRvciA9IEFycmF5LmlzQXJyYXkodmFsdWVbQ09OU1RBTlRTLk9CSl0pID8gQ09NUEFSQVRPUlMuSU4gOiBDT01QQVJBVE9SUy5FUVVBTFM7XG5cdFx0fVxuXG5cdFx0aWYgKFZBTElEX0NPTVBBUkFUT1JTLmluZGV4T2YoY29tcGFyYXRvcikgPT09IC0xKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tcGFyYXRvciAnJHtjb21wYXJhdG9yfScsIGl0IG1pZ2h0IGJlIHRoYXQgdGhlIGJhY2tlbmQgc3VwcG9ydHMgaXQgYnV0IHRoZSBmcm9udGVuZCBkb2Vzbid0ICFgKTtcblx0XHR9XG5cblx0XHRpZiAobm90KSB7XG5cdFx0XHRjb21wYXJhdG9yID0gT1BQT1NJVEVfQ09NUEFSQVRPUl9NQVBbY29tcGFyYXRvcl07XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIG90aGVyIGNvbXBhcmF0b3JzIGNhbiBiZSBpbnZlcnRlZFxuXHRcdGNvbnN0IGlzTm90SW4gPSBjb21wYXJhdG9yID09PSBDT01QQVJBVE9SUy5JTiAmJiBub3Q7XG5cblx0XHRjb25zdCByZXN1bHQ6IFtvYmplY3QsIHN0cmluZ10gPSBbXG5cdFx0XHR7XG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRjb21wYXJhdG9yLFxuXHRcdFx0XHRub3Q6IGlzTm90SW4sXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgY29tcGFyYXRvciArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgdmFsdWVbQ09OU1RBTlRTLlNUUl0gKyAnXScsXG5cdFx0XTtcblxuXHRcdGlmIChpc05vdEluKSB7XG5cdFx0XHRyZXN1bHRbMV0gPSByZXN1bHRbMV0uc2xpY2UoXG5cdFx0XHRcdDAsXG5cdFx0XHRcdC0xLFxuXHRcdFx0KTtcblx0XHRcdHJlc3VsdFsxXSArPSBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VMaW5rZWRUb1F1ZXJ5IChcblx0XHRsaW5rZWRUbzogYW55LFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5LFxuXHRcdHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnBhcnNlKHF1ZXJ5KTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGxpbmtlZFRvOiBsaW5rZWRUbyxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRyZXZlcnNlOiByZXZlcnNlLFxuXHRcdFx0XHRub3Q6IG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnbGlua2VkVG8nICsgQ09OU1RBTlRTLlNFUCArIGxpbmtlZFRvICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIHJldmVyc2UgKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDb21wbGV4UXVlcnkgKFxuXHRcdGNvbmRpdGlvbnM6IGFueVtdLFxuXHRcdG9wZXJhdG9yOiBPUEVSQVRPUlNfVFlQRSA9IE9QRVJBVE9SUy5BTkQsXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdG9wZXJhdG9yID0gb3BlcmF0b3IudG9VcHBlckNhc2UoKSBhcyBPUEVSQVRPUlM7XG5cblx0XHRjb25zdCBwYXJzZWRDb25kaXRpb25zID0gdGhpcy5wYXJzZUNvbmRpdGlvbnMoY29uZGl0aW9ucyk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRjb25kaXRpb25zOiBwYXJzZWRDb25kaXRpb25zW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRvcGVyYXRvcixcblx0XHRcdFx0bm90LFxuXHRcdFx0fSxcblx0XHRcdCdbJyArIG9wZXJhdG9yICsgcGFyc2VkQ29uZGl0aW9uc1tDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VDb25kaXRpb25zIChjb25kaXRpb25zOiBhbnlbXSk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGxldCBwYXJzZWRDb25kaXRpb25zOiBBcnJheTxbb2JqZWN0LCBzdHJpbmddPiA9IFtdO1xuXHRcdGNvbnN0IHF1ZXJ5OiBvYmplY3RbXSA9IFtdO1xuXHRcdGxldCBzdHJpbmcgPSAnJztcblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdHBhcnNlZENvbmRpdGlvbnMucHVzaCh0aGlzLnBhcnNlKGNvbmRpdGlvbikpO1xuXHRcdH1cblxuXHRcdHBhcnNlZENvbmRpdGlvbnMgPSBwYXJzZWRDb25kaXRpb25zLnNvcnQoKFxuXHRcdFx0YSxcblx0XHRcdGIsXG5cdFx0KSA9PiB0aGlzLmNvbXBhcmVQYXJzZWRRdWVyaWVzKFxuXHRcdFx0YSxcblx0XHRcdGIsXG5cdFx0KSk7XG5cblx0XHRmb3IgKGNvbnN0IHBhcnNlZENvbmRpdGlvbiBvZiBwYXJzZWRDb25kaXRpb25zKSB7XG5cdFx0XHRxdWVyeS5wdXNoKHBhcnNlZENvbmRpdGlvbltDT05TVEFOVFMuT0JKXSk7XG5cdFx0XHRzdHJpbmcgKz0gcGFyc2VkQ29uZGl0aW9uW0NPTlNUQU5UUy5TVFJdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHRxdWVyeSxcblx0XHRcdHN0cmluZyxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXRWYWx1ZTxUPiAodmFsdWU6IFQpOiBbVCwgc3RyaW5nXSB7XG5cdFx0bGV0IHByb2Nlc3NlZFZhbHVlO1xuXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuY2hhckF0KDApID09PSAnJicpIHtcblx0XHRcdGNvbnN0IGtleSA9IHZhbHVlLnN1YnN0cmluZygxKTtcblxuXHRcdFx0dmFsdWUgPSB0aGlzLnBhcmFtZXRlcnNba2V5XTtcblxuXHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdxdWVyeVBhcnNlcjogVW5kZWZpbmVkIHRlbXBsYXRlIHBhcmFtZXRlciBcXCcnICsga2V5ICsgJ1xcJycpO1xuXHRcdFx0fVxuXG5cdFx0XHRwcm9jZXNzZWRWYWx1ZSA9IHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlKTtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0cHJvY2Vzc2VkVmFsdWUsXG5cdFx0XHRcdGtleSArICc+JyArIHZhbHVlLFxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHRwcm9jZXNzZWRWYWx1ZSA9IHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRwcm9jZXNzZWRWYWx1ZSxcblx0XHRcdCcnICsgcHJvY2Vzc2VkVmFsdWUsXG5cdFx0XTtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlPFQ+ICh2YWx1ZTogVFtdKTogVFtdO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBtb21lbnQuTW9tZW50O1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZSAodmFsdWU6IG1vbWVudC5EdXJhdGlvbik6IG1vbWVudC5EdXJhdGlvbjtcblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUKTogVDtcblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUIHwgVFtdIHwgbW9tZW50Lk1vbWVudCB8IG1vbWVudC5EdXJhdGlvbikge1xuXHRcdC8vIGFsZ29yaXRobSBpcyBub3QgaW1wb3J0YW50LCBhcyBsb25nIGFzIGFsbCBhcnJheXMgYXJlIHNvcnRlZCB0aGUgc2FtZSB3YXlcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHQuc2xpY2UoKVxuXHRcdFx0XHQuc29ydCgpO1xuXHRcdH1cblxuXHRcdGlmIChtb21lbnQuaXNNb21lbnQodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKTtcblx0XHR9XG5cblx0XHRpZiAobW9tZW50LmlzRHVyYXRpb24odmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRwcml2YXRlIGNvbXBhcmVQYXJzZWRRdWVyaWVzIChcblx0XHRhOiBbb2JqZWN0LCBzdHJpbmddLFxuXHRcdGI6IFtvYmplY3QsIHN0cmluZ10sXG5cdCkge1xuXHRcdGlmIChhW0NPTlNUQU5UUy5TVFJdID09PSBiW0NPTlNUQU5UUy5TVFJdKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYVtDT05TVEFOVFMuU1RSXSA+IGJbQ09OU1RBTlRTLlNUUl0gPyAxIDogLTE7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEl0ZW1JZCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENPTVBBUkFUT1JTLCBPUEVSQVRPUlMgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVNlcnZpY2Uge1xuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdH1cblxuXHRhZGRBbmRDb25kaXRpb24gKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRjb25kaXRpb246IEFwaVF1ZXJ5LFxuXHQpOiBBcGlRdWVyeSB7XG5cdFx0aWYgKHF1ZXJ5LmNvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5vcGVyYXRvciA9PT0gT1BFUkFUT1JTLk9SKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjb25kaXRpb25zOiBbXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0XHRdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIGFuICdhbmQnIGNvbmRpdGlvblxuXHRcdHJldHVybiB7Y29uZGl0aW9uczogcXVlcnkuY29uZGl0aW9ucy5jb25jYXQoY29uZGl0aW9uKX07XG5cdH1cblxuXHRhZGRPckNvbmRpdGlvbiAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbmRpdGlvbjogQXBpUXVlcnksXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRpZiAocXVlcnkub3BlcmF0b3IgPT09IE9QRVJBVE9SUy5PUikge1xuXHRcdFx0cmV0dXJuIHtjb25kaXRpb25zOiBxdWVyeS5jb25kaXRpb25zLmNvbmNhdChjb25kaXRpb24pfTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIGFuICdhbmQnIGNvbmRpdGlvblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb25kaXRpb25zOiBbXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRdLFxuXHRcdFx0b3BlcmF0b3I6IE9QRVJBVE9SUy5PUixcblx0XHR9O1xuXHR9XG5cblx0YWRkUGFyZW50Q29uZGl0aW9uIChcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRsZXQgbGlua2VkVG9RdWVyeTtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBxdWVyeTtcblx0XHR9XG5cblx0XHRsaW5rZWRUb1F1ZXJ5ID0ge1xuXHRcdFx0bGlua2VkVG86IHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdHF1ZXJ5OiBwYXJlbnQuaXRlbUlkLFxuXHRcdH07XG5cblx0XHRyZXR1cm4gcXVlcnkgPT09IG51bGwgPyBsaW5rZWRUb1F1ZXJ5IDogdGhpcy5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRxdWVyeSxcblx0XHRcdGxpbmtlZFRvUXVlcnksXG5cdFx0KTtcblx0fVxuXG5cdGNyZWF0ZU5vdEluIChpZEFycmF5OiBJdGVtSWRbXSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb21wYXJhdG9yOiBDT01QQVJBVE9SUy5JTixcblx0XHRcdGtleTogJ2lkJyxcblx0XHRcdHZhbHVlOiBpZEFycmF5LFxuXHRcdFx0bm90OiB0cnVlXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0LCBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbnR5cGUgUmVxdWVzdENvbHVtbk1hcCA9IHtbaXRlbVR5cGU6IHN0cmluZ106IEFwaVJlcXVlc3RDb2x1bW5zfTtcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24ge1xuXHRwcml2YXRlIGNvbHVtbnM6IFJlcXVlc3RDb2x1bW5NYXAgPSB7fTtcblx0cHJpdmF0ZSBjb2x1bW5TZXRJZE1hcDoge1tjb2x1bW5TZXRJZDogbnVtYmVyXTogYm9vbGVhbn0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRXaXRoUmVxdWVzdENvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cblx0XHRpZiAoY29sdW1uc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uVXRpbFxuXHRcdFx0Lm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC5tZXJnZWQ7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kPFQgZXh0ZW5kcyBDb2x1bW5TZXQ8SXRlbVR5cGU+PiAoY29sdW1uU2V0OiBUKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY29sdW1uU2V0SWRNYXBbY29sdW1uU2V0LmlkXSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2x1bW5TZXQuaXRlbVR5cGU7XG5cblx0XHRpZiAoY29sdW1uc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uVXRpbFxuXHRcdFx0Lm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRjb2x1bW5TZXQucmVxdWVzdCxcblx0XHRcdClcblx0XHRcdC5tZXJnZWQ7XG5cblx0XHR0aGlzLmNvbHVtblNldElkTWFwW2NvbHVtblNldC5pZF0gPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGdldCAoKTogUmVxdWVzdENvbHVtbk1hcCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1ucztcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksIFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbk1hdGNoUmVzdWx0LFxuXHRGaWVsZE1hcCxcblx0RnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2UsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFJlc3BvbnNlQ29sdW1uLFxuXHRTb2NrZXRNZXNzYWdlLFxuXHRTb2NrZXRNZXNzYWdlQ3JlYXRlLFxuXHRTb2NrZXRNZXNzYWdlRGVsZXRlLFxuXHRTb2NrZXRNZXNzYWdlTGlua1RvLFxuXHRTb2NrZXRNZXNzYWdlVXBkYXRlLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcblxuZXhwb3J0IHR5cGUgU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7W2l0ZW1JZDogbnVtYmVyXTogQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT59O1xuXG5leHBvcnQgY2xhc3MgU29ja2V0TWVzc2FnZUhhbmRsZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb25DYWNoZUZhY3Rvcnk6IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBvbk1lc3NhZ2VSZWNlaXZlZCAobWVzc2FnZTogU29ja2V0TWVzc2FnZSk6IGFueSB7XG5cdFx0c3dpdGNoIChtZXNzYWdlLmJvZHkuZXZlbnRUeXBlKSB7XG5cdFx0XHRjYXNlICd1cGRhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVVcGRhdGUobWVzc2FnZSk7XG5cdFx0XHRjYXNlICdjcmVhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVDcmVhdGUobWVzc2FnZSk7XG5cdFx0XHRjYXNlICdkZWxldGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVEZWxldGUobWVzc2FnZSk7XG5cdFx0XHRjYXNlICdsaW5rVG8nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5oYW5kbGVMaW5rTW92ZShtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGZvcm1hdE1lc3NhZ2VWYWx1ZXMgKFxuXHRcdHZhbHVlczogYW55LFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCByZXN1bHQ6IEZpZWxkTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNvbHVtbnMpIHtcblx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0XHRjb2x1bW5zW2NvbHVtbklkXS50eXBlLFxuXHRcdFx0XHR2YWx1ZXNbY29sdW1uSWRdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtczoge1tpdGVtSWQ6IG51bWJlcl06IGFueX0sXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0KTogU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCByZXN1bHQ6IFNvY2tldENvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbXMpIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSBpdGVtc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gaXRlbS5wYXJlbnQgIT09IG51bGwgPyBpdGVtLnBhcmVudCA6IHt9O1xuXHRcdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5mb3JtYXRNZXNzYWdlVmFsdWVzKFxuXHRcdFx0XHRpdGVtLnZhbHVlcyxcblx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdCk7XG5cblx0XHRcdHJlc3VsdFtpdGVtSWRdID0gc2VydmVyQ2FjaGUuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUZpdHRpbmdJdGVtKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dmFsdWVzLFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGdldFJlcXVlc3RDb2x1bW5zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2xsZWN0aW9uTWFwOiBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBjb2xsZWN0aW9uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9ucyA9IGNvbGxlY3Rpb25NYXBbaXRlbUlkXTtcblx0XHRcdGNvbnN0IGZpdHRpbmdDb2xsZWN0aW9ucyA9IGNvbGxlY3Rpb25zLmZpdHRpbmc7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgZml0dGluZ0NvbGxlY3Rpb24gb2YgZml0dGluZ0NvbGxlY3Rpb25zKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoZml0dGluZ0NvbGxlY3Rpb24uY29sdW1ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24uZXhwYW5kKGl0ZW1FbnRyeS5jb2x1bW5zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzTWVzc2FnZTxUIGV4dGVuZHMgU29ja2V0TWVzc2FnZVsnYm9keSddPiAoXG5cdFx0Ym9keTogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBib2R5Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IHJlcXVlc3RJZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWFwID0gdGhpcy5jcmVhdGVDb2xsZWN0aW9uTWFwKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRib2R5Lml0ZW1zW2l0ZW1UeXBlXSxcblx0XHRcdGJvZHkuY29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0KTtcblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5nZXRSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbk1hcCxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWRTdHJpbmcgaW4gY29sbGVjdGlvbk1hcCkge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWRTdHJpbmcsXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCBpdGVtSWQgPSAraXRlbUlkU3RyaW5nO1xuXG5cdFx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVxdWVzdElkcy5wdXNoKGl0ZW1JZCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uTWFwW2l0ZW1JZF0uZml0dGluZy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3RJZHMucHVzaChpdGVtSWQpO1xuXHRcdH1cblxuXHRcdGlmIChyZXF1ZXN0SWRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQucXVlcnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0XHRcdGNvbXBhcmF0b3I6ICdJTicsXG5cdFx0XHRcdFx0dmFsdWU6IHJlcXVlc3RJZHMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gc2VydmVyQ2FjaGUucHJvY2Vzc1Jlc3BvbnNlKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZTxUIGV4dGVuZHMgU29ja2V0TWVzc2FnZVsnYm9keSddPiAoXG5cdFx0Ym9keTogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBpdGVtcyA9IGJvZHkuaXRlbXMuRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZTtcblx0XHRjb25zdCByZXF1ZXN0SWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbXMpIHtcblx0XHRcdGNvbnN0IGZ1bmN0aW9uSWQgPSBpdGVtc1tpdGVtSWRdLnBhcmVudC5pdGVtSWQ7XG5cdFx0XHRjb25zdCBmdW5jdGlvbkVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0ZnVuY3Rpb25JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0ZnVuY3Rpb25FbnRyeSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdHx8IGZ1bmN0aW9uRW50cnkuY29sdW1ucy5yZXNwb25zZS5GdW5jdGllLm5ld2NoYW5nZXMgPT09IHVuZGVmaW5lZFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0SWRzLnB1c2goZnVuY3Rpb25JZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RJZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdC5mZXRjaEJ5SWRzKFxuXHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdHJlcXVlc3RJZHMsXG5cdFx0XHRcdFsnbmV3Y2hhbmdlcyddLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGJ1ZmZlclJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBpc24ndCB0aGlzIGFscmVhZHkgaGFuZGxlZCBpbiB0aGUgUmVxdWVzdEJ1ZmZlciA/XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlSWRzID0gYnVmZmVyUmVzcG9uc2UucmVzcG9uc2UubGlua3MuRnVuY3RpZTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIHJlc3BvbnNlSWRzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0J0Z1bmN0aWUnLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdFx0Y29uc3QgcHJldmlvdXMgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRjb25zdCByZXNwb25zZVZhbHVlcyA9IGJ1ZmZlclJlc3BvbnNlLnJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlVmFsdWVzID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VWYWx1ZXMubmV3Y2hhbmdlcyA9PT0gcHJldmlvdXMubmV3Y2hhbmdlc1xuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e25ld2NoYW5nZXM6IHJlc3BvbnNlVmFsdWVzLm5ld2NoYW5nZXN9LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5ub3RpZnlFcnJvcixcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGlzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZU1lc3NhZ2UgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2UpOiBtZXNzYWdlIGlzIEZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmVTb2NrZXRNZXNzYWdlIHtcblx0XHRyZXR1cm4gbWVzc2FnZS5ib2R5Lml0ZW1UeXBlID09PSAnRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZSc7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZSAobWVzc2FnZTogRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2UpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+O1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZUNyZWF0ZSk6IFByb21pc2VJbnRlcmZhY2U8bnVsbD47XG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlKTogYW55IHtcblx0XHRjb25zdCBib2R5ID0gbWVzc2FnZS5ib2R5O1xuXG5cdFx0aWYgKHRoaXMuaXNGdW5jdGlvbkNoYW5nZXNSZXNvbHZlTWVzc2FnZShtZXNzYWdlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvY2Vzc0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmUoYm9keSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5wcm9jZXNzTWVzc2FnZShib2R5KVxuXHRcdFx0LmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlVXBkYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlVXBkYXRlKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5wcm9jZXNzTWVzc2FnZShtZXNzYWdlLmJvZHkpXG5cdFx0XHQuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IpO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVEZWxldGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VEZWxldGUpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGJvZHkgPSBtZXNzYWdlLmJvZHk7XG5cdFx0Y29uc3QgZW50cmllc1RvQmVEZWxldGVkOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgYm9keS5pdGVtcykge1xuXHRcdFx0Y29uc3QgY2FjaGVkRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0Ym9keS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGVudHJpZXNUb0JlRGVsZXRlZC5wdXNoKGNhY2hlZEVudHJ5KTtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbXNEZWxldGVkKGVudHJpZXNUb0JlRGVsZXRlZCk7XG5cblx0XHRzZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHR0cnVlLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUxpbmtNb3ZlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlTGlua1RvKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc01lc3NhZ2UobWVzc2FnZS5ib2R5KVxuXHRcdFx0LmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yKTtcblx0fVxuXG5cdC8qXHRoYW5kbGVMaW5rTW92ZSAobWVzc2FnZSkge1xuXHQgcHJvY2Vzc01lc3NhZ2UoXG5cdCBtZXNzYWdlLFxuXHQgZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGl0ZW1FbnRyaWVzKSB7XG5cdCAvLyBmaXRzIGluIHRoaXMgY29sbGVjdGlvbiwgdG9kbzogZ2V0IHRoZSBvbGQgY29sbGVjdGlvbiBpdCBiZWxvbmdlZCB0b1xuXHQgY29sbGVjdGlvbi5tb3ZlSXRlbXMoaXRlbUVudHJpZXMsIG51bGwsIHRydWUpO1xuXHQgfSxcblx0IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBpdGVtRW50cmllcykge1xuXHQgLy8gbWF5YmUgZml0c1xuXHQgLy8gdG9kbzogYWxzbyByZW1vdmUgdGhlbSBmcm9tIHRoZSBvbGQgY29sbGVjdGlvblxuXHQgY29sbGVjdGlvbi5leHRlbmQoYW5ndWxhci5pZGVudGl0eSwgZmFsc2UsIGZhbHNlKTtcblx0IH0sXG5cdCBmdW5jdGlvbiAoY29sbGVjdGlvbiwgaWRzKSB7XG5cdCAvLyBub3QgZml0dGluZyBpbiB0aGlzIGNvbGxlY3Rpb24sIHJlbW92ZSBpdCA/XG5cdCBjb2xsZWN0aW9uLnJlbW92ZUl0ZW1zKGlkcywgbnVsbCwgbWVzc2FnZSk7XG5cdCB9XG5cdCApO1xuXHQgfVxuXHQgKi9cbn1cbiIsImltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q2hhbmdlc0RlbHRhLFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uUXVlcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbnZlcnNpb25NYXAsXG5cdGlzRnVuY3Rpb24sXG5cdEl0ZW1FbnRyeU9wdGlvbnMsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdE1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyRGVwZW5kZW5jeUludGVyZmFjZSxcblx0VHJhbnNhY3Rpb25JdGVtSGFuZGxlcixcbn0gZnJvbSAnLi4vLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1UeXBlLFxuXHRRdWVyeUNhbGxiYWNrLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciB9IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXJcblx0ZXh0ZW5kcyBDb2xsZWN0aW9uSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyBjb2xsZWN0aW9uUmVzb3VyY2VzOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uUmVzb3VyY2VbXVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZGVwZW5kZW5jaWVzOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyRGVwZW5kZW5jeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGl0ZW1IYW5kbGVyOiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRkZXBlbmRlbmNpZXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGRlcGVuZGVuY2llcy5jb2x1bW5VdGlsLFxuXHRcdFx0ZGVwZW5kZW5jaWVzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0ZGVwZW5kZW5jaWVzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGlmICghdGhpcy5pc0xvY2FsKG9wdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0LmZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbHVtbnM6IG9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0XHRcdHBhcmVudDogb3B0aW9ucy5wYXJlbnQsXG5cdFx0XHRcdFx0XHRxdWVyeTogcXVlcnksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmddLFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cmllcztcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHF1ZXJ5U3RyaW5nIGluIHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsQ29sbGVjdGlvbkVudHJ5QnlRdWVyeVN0cmluZyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5U3RyaW5nLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkICYmIGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSA9PT0gaXRlbVR5cGUpIHtcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXMucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2xsZWN0aW9uRW50cmllcztcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAoIXRoaXMuaXNMb2NhbChvcHRpb25zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHRcdC5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3VwZXIuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENhbGxzIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy5vbkl0ZW1zQ3JlYXRlZCBvbkl0ZW1zQ3JlYXRlZH0gY2FsbGJhY2sgd2hlbmV2ZXIgYSBjcmVhdGUgcmVxdWVzdCBpcyBkb25lIG9uIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZml0IGluIHRoZSBjb2xsZWN0aW9uXG5cdCAqIENhbiBiZSB1c2VkIHRvIHVwZGF0ZSBtYXBzIHRoYXQgdXNlIHtAbGluayBJdGVtRW50cnkuaXRlbUlkIEl0ZW1FbnRyeS5pdGVtSWR9XG5cdCAqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFlvdSBzaG91bGQgdXNlIHJlZ2lzdGVyIGEge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUucmVnaXN0ZXJGaWVsZENoYW5nZUNhbGxiYWNrIGZpZWxkIGNoYW5nZSBjYWxsYmFja30gYW5kIGNvbXBhcmUgcHJldmlvdXMuaWQgd2l0aCBmaWVsZHMuaWRcblx0ICovXG5cdHB1YmxpYyBvbkl0ZW1FbnRyaWVzQ3JlYXRlZCAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0Y29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRpZiAocmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkl0ZW1zQ3JlYXRlZChjb252ZXJzaW9uTWFwKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjbGVhckVudHJ5IChlbnRyeTogQ29sbGVjdGlvbkVudHJ5KTogdm9pZCB7XG5cdFx0dGhpcy5lbnRyaWVzLmNsZWFyKGVudHJ5KTtcblxuXHRcdGRlbGV0ZSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbZW50cnkuaWRdO1xuXHRcdC8vIHRvZG9bY2FjaGVdIGZpZ3VyZSBvdXQgd2hlbiB3ZSB3YW50IHRvIGRlbGV0ZSBxdWVyeSBtYXRjaGVzXG5cdFx0Ly8gZGVsZXRlIHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbZW50cnkucXVlcnkuc3RyaW5nXTtcblx0fVxuXG5cdHB1YmxpYyBhZGRSZXNvdXJjZSAocmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGxldCByZXNvdXJjZUFycmF5ID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZUFycmF5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc291cmNlQXJyYXkgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdID0gW107XG5cdFx0fVxuXG5cdFx0cmVzb3VyY2VBcnJheS5wdXNoKHJlc291cmNlKTtcblx0fVxuXG5cdHB1YmxpYyBjbGVhclJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblx0XHRjb25zdCBpbmRleCA9IHJlc291cmNlcy5pbmRleE9mKHJlc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJlc291cmNlcy5zcGxpY2UoXG5cdFx0XHRcdGluZGV4LFxuXHRcdFx0XHQxLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0ZGVsZXRlIHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBwYXJlbnRzIG9mIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30sIHJldHVybnMgYHZvaWRgIGJlY2F1c2UgeW91IHNob3VsZCB1c2UgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLm9uQWRkIG9uQWRkfSBhbmQge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMub25SZW1vdmUgb25SZW1vdmV9IGNhbGxiYWNrc1xuXHQgKi9cblx0cHVibGljIG1vdmVJdGVtczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0c291cmNlQ29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoc291cmNlQ29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlICE9PSBkZXN0aW5hdGlvbkNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlOiBDYW5ub3QgbW92ZSBpdGVtczogaXRlbVR5cGUgbWlzbWF0Y2gnKTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmRlcGVuZGVuY2llcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gcGFyZW50IG51bGwgP1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5LnBhcmVudCEsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXh0ZW5kQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRzb3VyY2VFbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge30sXG5cdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2s/OiBNb2RpZnlGaWVsZHNDYWxsYmFjayxcblx0KTogdm9pZCB7XG5cdFx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHdlIGNhbGwgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSBpbiBjYXNlIHRoZSBzb3VyY2VFbnRyeSB3YXNuJ3Qgb24gdGhpcyB0cmFuc2FjdGlvbiA/XG5cdFx0Y29uc3Qgc291cmNlSXRlbUVudHJpZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRzb3VyY2VFbnRyeS5pZCxcblx0XHQpO1xuXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5jbG9uZUl0ZW1FbnRyaWVzKFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0c291cmNlSXRlbUVudHJpZXMsXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKCF0aGlzLmlzTG9jYWwob3B0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZGVwZW5kZW5jaWVzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRsZXQgY29sbGVjdGlvbkVudHJ5O1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0X2NvbGxlY3Rpb25FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gX2NvbGxlY3Rpb25FbnRyeTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gY29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10gfCAoKCkgPT4gSXRlbUlkW10pLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKGlzRnVuY3Rpb248KCkgPT4gSXRlbUlkW10+KHBhcmVudElkQXJyYXkpKSB7XG5cdFx0XHRwYXJlbnRJZEFycmF5ID0gcGFyZW50SWRBcnJheSgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW90ZVBhcmVudElkczogSXRlbUlkW10gPSBbXTtcblx0XHRjb25zdCBsb2NhbFBhcmVudElkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIHBhcmVudElkQXJyYXkpIHtcblx0XHRcdGlmICh0aGlzLmRlcGVuZGVuY2llcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRcdGxvY2FsUGFyZW50SWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW90ZVBhcmVudElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHtcblx0XHRcdFx0cmVtb3RlOiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0XHQuZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRyZW1vdGVQYXJlbnRJZHMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0bG9jYWw6IHRoaXMuZmV0Y2hMaW5rZWRMb2NhbENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0bG9jYWxQYXJlbnRJZHMsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdH0pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzdWx0ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0Li4ucmVzdWx0LnJlbW90ZSxcblx0XHRcdFx0XHRcdC4uLnJlc3VsdC5sb2NhbCxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4ge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXhwYW5kQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2xsZWN0aW9ucyxcblx0XHRcdFx0bmV3Q29sdW1ucyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kQ29sbGVjdGlvbkVudHJpZXM8VCBleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0XHRjb2xsZWN0aW9uczogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHRlbmRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHRcdGNvbGxlY3Rpb25zLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXM8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdHN1cGVyLl9hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdCgpID0+IGZhbHNlLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMgfCBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMua2V5U2VydmljZS5pc0xvY2FsSWQocGFyZW50Lml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5VHlwZT4ge1xuXHRcdGNvbnN0IHtkaWZmZXJlbmNlfSA9IGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zLm1lcmdlUmVxdWVzdENvbHVtbnMobmV3Q29sdW1ucyk7XG5cblx0XHRpZiAoZGlmZmVyZW5jZSAhPT0gdHJ1ZSAmJiBkaWZmZXJlbmNlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5IYW5kbGVyXG5cdFx0XHQuZmV0Y2goXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRkaWZmZXJlbmNlLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdFx0XHRcdC5leHBhbmRMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRcdFx0XHQpISxcblx0XHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmRlcGVuZGVuY2llcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5leHBhbmRDb2x1bW5zKGNvbHVtbkV4cGFuc2lvbik7XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFdoZW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYXJlIGFkZGVkIHRvIHRoZSBjaGFuZ2VzIG9mIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFsbCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZXN9XG5cdCAqIHNob3VsZCBnZXQgbmV3IHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gZm9yIHRoZSBuZXdseSBhZGRlZCBlbnRyaWVzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaGFuZGxlQWRkZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0YWRkZWRFbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHQvLyBXaGVuIHRoZXJlIGFyZSBubyBDb2xsZWN0aW9uUmVzb3VyY2VzIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBJdGVtUmVzb3VyY2VzXG5cdFx0aWYgKFxuXHRcdFx0YWRkZWRFbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZS5hZGRJdGVtUmVzb3VyY2VzKGFkZGVkRW50cmllcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaGVuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFyZSByZW1vdmVkIGZyb20gdGhlIGNoYW5nZXMgb2YgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gb2YgdGhlIEl0ZW1FbnRyaWVzIHNob3VsZCBiZSByZW1vdmVkIGZyb20gYWxsIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlc31cblx0ICovXG5cdHByb3RlY3RlZCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvblJlc291cmNlcyA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKFxuXHRcdFx0cmVtb3ZlZEl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHJlbW92ZWRSZXNvdXJjZXMgPSBjb2xsZWN0aW9uUmVzb3VyY2UucmVtb3ZlSXRlbVJlc291cmNlcyhyZW1vdmVkSXRlbUVudHJpZXMpO1xuXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2UuY2FsbE9uUmVtb3ZlKHJlbW92ZWRSZXNvdXJjZXMpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZmV0Y2hDb2xsZWN0aW9uRGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRjb2xsZWN0aW9uUXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNhY2hlZENvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllcy5nZXRCeVF1ZXJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uUXVlcnksXG5cdFx0KTtcblxuXHRcdGlmIChjYWNoZWRDb2xsZWN0aW9uRW50cnkgIT09IG51bGwpIHtcblx0XHRcdC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gZW50cnkgYW5kIGl0IGNvbnRhaW5zIHRoZSBjb2x1bW5zIHdlIG5lZWQsIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIGl0XG5cblx0XHRcdGlmIChjb2x1bW5TdWJzZXRDYWNoZS5ydW4oY2FjaGVkQ29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5wcm9taXNlU2VydmljZS53aGVuKGNhY2hlZENvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmV4cGFuZENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRjYWNoZWRDb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmNvbHVtbkhhbmRsZXJcblx0XHRcdC5mZXRjaChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zID0gdGhpcy50cmFuc2FjdGlvbi5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyaWVzfSBvZiB3aGljaCB0aGUgcGFyZW50cyBhcmUgbG9jYWxcblx0ICovXG5cdHByaXZhdGUgZmV0Y2hMaW5rZWRMb2NhbENvbGxlY3Rpb25FbnRyaWVzIChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KSB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5kZXBlbmRlbmNpZXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCBwcm9taXNlczoge1twYXJlbnRJZDogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRjb25zdCBuZXdPcHRpb25zID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogcGFyZW50SWQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShuZXdPcHRpb25zKTtcblxuXHRcdFx0dGhpcy5leHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ld09wdGlvbnMsXG5cdFx0XHRcdHBhcnNlZFF1ZXJ5Lm9iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5kZXBlbmRlbmNpZXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChuZXdPcHRpb25zLmNvbHVtbnMpO1xuXG5cdFx0XHRwcm9taXNlc1twYXJlbnRJZF0gPSB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwID0+IHtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9pbmRleCc7XG5pbXBvcnQgeyBpc1Byb21pc2VMaWtlIH0gZnJvbSAnLi4vLi4vVXRpbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlLCBUcmFuc2FjdGlvbkVycm9yTGV2ZWwgfSBmcm9tICcuL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSB7XG5cdGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IFRyYW5zYWN0aW9uVmFsaWRhdG9yO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25WYWxpZGF0b3Ige1xuXG5cdHByaXZhdGUgbGFzdENhbGxJZDoge1xuXHRcdGdsb2JhbDoge1xuXHRcdFx0W2tleTogc3RyaW5nXTogc3RyaW5nXG5cdFx0fSxcblx0XHRpdGVtOiB7XG5cdFx0XHRbaXRlbUVudHJ5SWQ6IHN0cmluZ106IHN0cmluZ1xuXHRcdH1cblx0fSA9IHtcblx0XHRnbG9iYWw6IHt9LFxuXHRcdGl0ZW06IHt9LFxuXHR9O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaWxsIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9LCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tQ2hpbGQgYXBwbHlDaGFuZ2VzRnJvbUNoaWxkfSBvciB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX0gaXMgY2FsbGVkXG5cdCAqIEFsbG93cyB5b3UgdG8gc2V0IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmVycm9ycyBnbG9iYWwgZXJyb3JzfVxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IHZhbGlkYXRlVHJhbnNhY3Rpb24gKCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGlzIGNoYW5nZWQsIGFsbG93cyB5b3UgdG8gc2V0IGVycm9ycyBvbiB0aGUgdHJhbnNhY3Rpb25cblx0ICogQHBhcmFtIGl0ZW1FbnRyeVxuXHQgKiBAcGFyYW0gZmllbGRzXG5cdCAqIEBwYXJhbSBwcmV2aW91c1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IHZhbGlkYXRlSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkO1xuXG5cdHByb3RlY3RlZCBzZXRHbG9iYWxFcnJvciAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0aXNJbnZhbGlkOiBib29sZWFuIHwgUHJvbWlzZUludGVyZmFjZTxib29sZWFuPixcblx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuOiAoKSA9PiBzdHJpbmcsXG5cdFx0bGV2ZWw6IFRyYW5zYWN0aW9uRXJyb3JMZXZlbCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmFuZElkID0gdGhpcy5nZXRSYW5kb21JZCgpO1xuXG5cdFx0dGhpcy5sYXN0Q2FsbElkLmdsb2JhbFtrZXldID0gcmFuZElkO1xuXG5cdFx0aWYgKCFpc1Byb21pc2VMaWtlKGlzSW52YWxpZCkpIHtcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uX3NldEdsb2JhbEVycm9yKFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdGlzSW52YWxpZCxcblx0XHRcdFx0c2F2ZUJ1dHRvbkVycm9yVHJhbnNsYXRpb25Gbixcblx0XHRcdFx0bGV2ZWwsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIHRyYW5zYWN0aW9uIGlzIGludmFsaWQgd2hpbGUgaXQncyBwZW5kaW5nXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5pc1ZhbGlkID0gZmFsc2U7XG5cblx0XHRpc0ludmFsaWQudGhlbihcblx0XHRcdGlzSW52YWxpZFJlc3VsdCA9PiB7XG5cdFx0XHRcdGlmIChyYW5kSWQgIT09IHRoaXMubGFzdENhbGxJZC5nbG9iYWxba2V5XSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmxhc3RDYWxsSWQuZ2xvYmFsW2tleV07XG5cblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5fc2V0R2xvYmFsRXJyb3IoXG5cdFx0XHRcdFx0a2V5LFxuXHRcdFx0XHRcdGlzSW52YWxpZFJlc3VsdCxcblx0XHRcdFx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRcdGxldmVsLFxuXHRcdFx0XHQpO1xuXHRcdFx0fSxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5fc2V0SXNWYWxpZCgpO1xuXHRcdFx0fSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHNldEl0ZW1FcnJvciAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHRcdGVycm9yS2V5OiBzdHJpbmcsXG5cdFx0aXNJbnZhbGlkOiBib29sZWFuIHwgUHJvbWlzZUludGVyZmFjZTxib29sZWFuPixcblx0XHRmaWVsZEVycm9yVHJhbnNsYXRpb25GbjogKCkgPT4gc3RyaW5nLFxuXHRcdHNhdmVCdXR0b25FcnJvclRyYW5zbGF0aW9uRm46ICgpID0+IHN0cmluZyxcblx0XHRsZXZlbDogVHJhbnNhY3Rpb25FcnJvckxldmVsLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCByYW5kSWQgPSB0aGlzLmdldFJhbmRvbUlkKCk7XG5cblx0XHR0aGlzLmxhc3RDYWxsSWQuaXRlbVtpdGVtRW50cnlJZF0gPSByYW5kSWQ7XG5cblx0XHRpZiAoIWlzUHJvbWlzZUxpa2UoaXNJbnZhbGlkKSkge1xuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5fc2V0SXRlbUVycm9yKFxuXHRcdFx0XHRpdGVtRW50cnlJZCxcblx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdGVycm9yS2V5LFxuXHRcdFx0XHRpc0ludmFsaWQsXG5cdFx0XHRcdGZpZWxkRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRzYXZlQnV0dG9uRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRsZXZlbCxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnRyYW5zYWN0aW9uLmlzVmFsaWQgPSBmYWxzZTtcblxuXHRcdGlzSW52YWxpZC50aGVuKFxuXHRcdFx0aXNJbnZhbGlkUmVzdWx0ID0+IHtcblx0XHRcdFx0aWYgKHJhbmRJZCAhPT0gdGhpcy5sYXN0Q2FsbElkLml0ZW1baXRlbUVudHJ5SWRdKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMubGFzdENhbGxJZC5pdGVtW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLl9zZXRJdGVtRXJyb3IoXG5cdFx0XHRcdFx0aXRlbUVudHJ5SWQsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0ZXJyb3JLZXksXG5cdFx0XHRcdFx0aXNJbnZhbGlkUmVzdWx0LFxuXHRcdFx0XHRcdGZpZWxkRXJyb3JUcmFuc2xhdGlvbkZuLFxuXHRcdFx0XHRcdHNhdmVCdXR0b25FcnJvclRyYW5zbGF0aW9uRm4sXG5cdFx0XHRcdFx0bGV2ZWwsXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLl9zZXRJc1ZhbGlkKCk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGdldFJhbmRvbUlkICgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBNYXRoXG5cdFx0XHQucmFuZG9tKClcblx0XHRcdC50b1N0cmluZygpXG5cdFx0XHQuc3BsaXQoJy4nKVsxXTtcblx0fVxuXG59XG4iLCJleHBvcnQgKiBmcm9tICcuL0FwaUZvcm1hdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzQ29tcGlsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzUHJvY2Vzc29yJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblJlc291cmNlU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uRXhwYW5zaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkluZm8nO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5TZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5TdWJzZXRDYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9Db252ZXJzaW9uTWFwU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vS2V5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uRXZlbnRIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vTG9ja1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeU1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeVBhcnNlcic7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Tb2NrZXRNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvblZhbGlkYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzRGVsdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdEJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1DcmVhdGVTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlZENoYW5nZXNEZWx0YSc7XG4iLCJpbXBvcnQgeyBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFudGlhdGVPcHRpb25zIChcblx0b3B0aW9uczoge1trZXk6IHN0cmluZ106IGFueX0sXG5cdHZhbHVlczogb2JqZWN0LFxuKTogdm9pZCB7XG5cdGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykge1xuXHRcdGlmICghKGtleSBpbiBvcHRpb25zKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKHZhbHVlc1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdG9wdGlvbnNba2V5XSA9IHZhbHVlc1trZXldO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93TWVyZ2UgKFxuXHRvYmplY3QsXG5cdGRlZmF1bHRzLFxuKSB7XG5cdGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBkZWZhdWx0cztcblx0fVxuXG5cdGNvbnN0IHJlc3VsdCA9IHt9O1xuXG5cdGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG5cdFx0cmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdGRlZmF1bHRzW2tleV0gOiBvYmplY3Rba2V5XTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0aWVzIChvYmplY3QpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0UHJvcGVydHkgKG9iamVjdCkge1xuXHRpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuXHRcdHJldHVybiBrZXk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluQXJyYXkgKFxuXHRuZWVkbGUsXG5cdGhheXN0YWNrLFxuKSB7XG5cdGZvciAoY29uc3QgaGF5IG9mIGhheXN0YWNrKSB7XG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRpZiAobmVlZGxlID09IGhheSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQXJyYXk8VD4gKFxuXHRzb3VyY2U6IFRbXSxcblx0Y2FsbGJhY2s6IChlbGVtOiBUKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpbHRlcmVkOiBUW10gPSBbXTtcblxuXHRmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2UpIHtcblx0XHRpZiAoY2FsbGJhY2soc3JjKSkge1xuXHRcdFx0ZmlsdGVyZWQucHVzaChzcmMpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IHNvdXJjZS5sZW5ndGgpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRlbXB0eUFycmF5KHNvdXJjZSk7XG5cblx0Zm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVyZWQpIHtcblx0XHRzb3VyY2UucHVzaChmaWx0ZXIpO1xuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eUFycmF5IChhcnJheSk6IHZvaWQge1xuXHRhcnJheS5zcGxpY2UoMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRXhpc3RzIChcblx0c291cmNlLFxuXHRwYXRoLFxuKSB7XG5cdGlmICh0eXBlb2Ygc291cmNlID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG5cdFx0aWYgKHR5cGVvZiBzb3VyY2VbcF0gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c291cmNlID0gc291cmNlW3BdO1xuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRoPFQ+IChcblx0b2JqZWN0OiBhbnksXG5cdHBhdGg6IEFycmF5PG51bWJlciB8IHN0cmluZz4sXG5cdGRlZmF1bHRzOiBhbnlbXSxcbik6IFQge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCB2YWx1ZSA9IHBhdGhbaV07XG5cblx0XHRpZiAob2JqZWN0W3ZhbHVlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvYmplY3RbdmFsdWVdID0gZGVmYXVsdHNbaV07XG5cdFx0fVxuXG5cdFx0b2JqZWN0ID0gb2JqZWN0W3ZhbHVlXTtcblx0fVxuXG5cdHJldHVybiBvYmplY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoIChcblx0b2JqZWN0OiB7fSxcblx0cGF0aDogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPixcblx0Y3JlYXRlOiBib29sZWFuID0gZmFsc2UsXG4pOiBhbnkge1xuXHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Zm9yIChjb25zdCBwIG9mIHBhdGgpIHtcblx0XHRvYmplY3QgPSBvYmplY3RbcF07IC8vIHdvbid0IGFsdGVyIHRoZSBjYWxsZXIncyB2YXJcblxuXHRcdGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCAmJiAhY3JlYXRlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8vIFRha2VuIGZyb20gQW5ndWxhckpTLCBhZGRlZCBjb21tZW50cyB0byBpZ25vcmUgVHlwZVNjcmlwdCBlcnJvcnNcbmZ1bmN0aW9uIGJhc2VFeHRlbmQgKFxuXHRkc3QsXG5cdG9ianMsXG5cdGRlZXAsXG4pIHtcblx0Zm9yIChsZXQgaSA9IDAsIGlpID0gb2Jqcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG5cdFx0Y29uc3Qgb2JqID0gb2Jqc1tpXTtcblxuXHRcdGlmICghaXNPYmplY3Qob2JqKSAmJiAhaXNGdW5jdGlvbihvYmopKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblxuXHRcdGZvciAobGV0IGogPSAwLCBqaiA9IGtleXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuXHRcdFx0Y29uc3Qga2V5ID0ga2V5c1tqXTtcblx0XHRcdGNvbnN0IHNyYyA9IG9ialtrZXldO1xuXG5cdFx0XHRpZiAoZGVlcCAmJiBpc09iamVjdChzcmMpKSB7XG5cdFx0XHRcdGlmIChpc0RhdGUoc3JjKSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gbmV3IERhdGUoc3JjLnZhbHVlT2YoKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNSZWdFeHAoc3JjKSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gbmV3IFJlZ0V4cChzcmMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNyYy5ub2RlTmFtZSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gc3JjLmNsb25lTm9kZSh0cnVlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0VsZW1lbnQoc3JjKSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gc3JjLmNsb25lKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCFpc09iamVjdChkc3Rba2V5XSkpIHtcblx0XHRcdFx0XHRcdGRzdFtrZXldID0gaXNBcnJheShzcmMpID8gW10gOiB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRiYXNlRXh0ZW5kKFxuXHRcdFx0XHRcdFx0ZHN0W2tleV0sXG5cdFx0XHRcdFx0XHRbc3JjXSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZHN0W2tleV0gPSBzcmM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGRzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCAoXG5cdGRzdCxcblx0Li4uYXJnc1xuKSB7XG5cdHJldHVybiBiYXNlRXh0ZW5kKFxuXHRcdGRzdCxcblx0XHRhcmdzLFxuXHRcdGZhbHNlLFxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UgKFxuXHRkc3QsXG5cdC4uLmFyZ3Ncbikge1xuXHRyZXR1cm4gYmFzZUV4dGVuZChcblx0XHRkc3QsXG5cdFx0YXJncyxcblx0XHR0cnVlLFxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QgKHZhbHVlKSB7XG5cdC8vIGh0dHA6Ly9qc3BlcmYuY29tL2lzb2JqZWN0NFxuXHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQmxhbmtPYmplY3QgKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcgKHZhbHVlKSB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIgKHZhbHVlKSB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlICh2YWx1ZSkge1xuXHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZXhwb3J0IGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbjxUPiAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFQge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlTGlrZTxUID0gYW55PiAob2JqOiBhbnkpOiBvYmogaXMgUHJvbWlzZUludGVyZmFjZTxUPiB7XG5cdHJldHVybiBvYmogJiYgaXNGdW5jdGlvbihvYmoudGhlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ0V4cCAodmFsdWUpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50IChub2RlKSB7XG5cdHJldHVybiAhIShub2RlICYmXG5cdFx0KFxuXHRcdFx0bm9kZS5ub2RlTmFtZSAgLy8gV2UgYXJlIGEgZGlyZWN0IGVsZW1lbnQuXG5cdFx0XHR8fCAobm9kZS5wcm9wICYmIG5vZGUuYXR0ciAmJiBub2RlLmZpbmQpXG5cdFx0KVxuXHQpOyAgLy8gV2UgaGF2ZSBhbiBvbiBhbmQgZmluZCBtZXRob2QgcGFydCBvZiBqUXVlcnkgQVBJLlxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3cgKG9iaikge1xuXHRyZXR1cm4gb2JqICYmIG9iai53aW5kb3cgPT09IG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZCAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMgKFxuXHRvMSxcblx0bzIsXG4pIHtcblx0aWYgKG8xID09PSBvMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKG8xID09PSBudWxsIHx8IG8yID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuXHRpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IC8vIE5hTiA9PT0gTmFOXG5cblx0Y29uc3QgdDEgPSB0eXBlb2YgbzE7XG5cdGNvbnN0IHQyID0gdHlwZW9mIG8yO1xuXG5cdGxldCBsZW5ndGg7XG5cdGxldCBrZXk7XG5cdGxldCBrZXlTZXQ7XG5cblx0aWYgKHQxID09PSB0MiAmJiB0MSA9PT0gJ29iamVjdCcpIHtcblx0XHRpZiAoaXNBcnJheShvMSkpIHtcblx0XHRcdGlmICghaXNBcnJheShvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZW5ndGggPSBvMS5sZW5ndGg7XG5cblx0XHRcdGlmIChvMS5sZW5ndGggPT09IG8yLmxlbmd0aCkge1xuXHRcdFx0XHRmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHtcblx0XHRcdFx0XHRpZiAoIWVxdWFscyhcblx0XHRcdFx0XHRcdG8xW2tleV0sXG5cdFx0XHRcdFx0XHRvMltrZXldLFxuXHRcdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzRGF0ZShvMSkpIHtcblx0XHRcdGlmICghaXNEYXRlKG8yKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaW1wbGVDb21wYXJlKFxuXHRcdFx0XHRvMS5nZXRUaW1lKCksXG5cdFx0XHRcdG8yLmdldFRpbWUoKSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChpc1JlZ0V4cChvMSkpIHtcblx0XHRcdGlmICghaXNSZWdFeHAobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG8xLnRvU3RyaW5nKCkgPT09IG8yLnRvU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChpc1dpbmRvdyhvMSkgfHwgaXNXaW5kb3cobzIpIHx8IGlzQXJyYXkobzIpIHx8IGlzRGF0ZShvMikgfHwgaXNSZWdFeHAobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0a2V5U2V0ID0gY3JlYXRlTWFwKCk7XG5cdFx0XHRmb3IgKGtleSBpbiBvMSkge1xuXHRcdFx0XHRpZiAoaXNGdW5jdGlvbihvMVtrZXldKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFlcXVhbHMoXG5cdFx0XHRcdFx0bzFba2V5XSxcblx0XHRcdFx0XHRvMltrZXldLFxuXHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5U2V0W2tleV0gPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGtleSBpbiBvMikge1xuXHRcdFx0XHRpZiAoIShrZXkgaW4ga2V5U2V0KSAmJiBpc0RlZmluZWQobzJba2V5XSkgJiYgIWlzRnVuY3Rpb24obzJba2V5XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXAgKCkge1xuXHRyZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuZnVuY3Rpb24gc2ltcGxlQ29tcGFyZSAoXG5cdGEsXG5cdGIsXG4pIHtcblx0cmV0dXJuIGEgPT09IGIgfHwgKGEgIT09IGEgJiYgYiAhPT0gYik7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRPYmplY3RNYXhEZXB0aCAobWF4RGVwdGgpIHtcblx0cmV0dXJuIGlzTnVtYmVyKG1heERlcHRoKSAmJiBtYXhEZXB0aCA+IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5IChcblx0c291cmNlLFxuXHRkZXN0aW5hdGlvbj8sXG5cdG1heERlcHRoPyxcbikge1xuXHRjb25zdCBzdGFja1NvdXJjZSA9IFtdO1xuXHRjb25zdCBzdGFja0Rlc3QgPSBbXTtcblxuXHRtYXhEZXB0aCA9IGlzVmFsaWRPYmplY3RNYXhEZXB0aChtYXhEZXB0aCkgPyBtYXhEZXB0aCA6IE5hTjtcblxuXHRpZiAoZGVzdGluYXRpb24pIHtcblx0XHRpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNvcHkhIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGlkZW50aWNhbC4nKTtcblx0XHR9XG5cblx0XHQvLyBFbXB0eSB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG5cdFx0aWYgKGlzQXJyYXkoZGVzdGluYXRpb24pKSB7XG5cdFx0XHRkZXN0aW5hdGlvbi5sZW5ndGggPSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBkZXN0aW5hdGlvbikge1xuXHRcdFx0XHRkZWxldGUgZGVzdGluYXRpb25ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0c3RhY2tTb3VyY2UucHVzaChzb3VyY2UpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja0Rlc3QucHVzaChkZXN0aW5hdGlvbik7XG5cblx0XHRyZXR1cm4gY29weVJlY3Vyc2UoXG5cdFx0XHRzb3VyY2UsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdG1heERlcHRoLFxuXHRcdCk7XG5cdH1cblxuXHRyZXR1cm4gY29weUVsZW1lbnQoXG5cdFx0c291cmNlLFxuXHRcdG1heERlcHRoLFxuXHQpO1xuXG5cdGZ1bmN0aW9uIGNvcHlSZWN1cnNlIChcblx0XHRfc291cmNlLFxuXHRcdF9kZXN0aW5hdGlvbixcblx0XHRfbWF4RGVwdGgsXG5cdCkge1xuXHRcdF9tYXhEZXB0aC0tO1xuXG5cdFx0aWYgKF9tYXhEZXB0aCA8IDApIHtcblx0XHRcdHJldHVybiAnLi4uJztcblx0XHR9XG5cblx0XHRpZiAoaXNBcnJheShfc291cmNlKSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGlpID0gX3NvdXJjZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdFx0XHRcdF9kZXN0aW5hdGlvbi5wdXNoKGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdF9zb3VyY2VbaV0sXG5cdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHQpKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzQmxhbmtPYmplY3QoX3NvdXJjZSkpIHtcblx0XHRcdC8vIGNyZWF0ZU1hcCgpIGZhc3QgcGF0aCAtLS0gU2FmZSB0byBhdm9pZCBoYXNPd25Qcm9wZXJ0eSBjaGVjayBiZWNhdXNlIHByb3RvdHlwZSBjaGFpbiBpcyBlbXB0eVxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gX3NvdXJjZSkge1xuXHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdF9zb3VyY2Vba2V5XSxcblx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChfc291cmNlICYmIHR5cGVvZiBfc291cmNlLmhhc093blByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvLyBTbG93IHBhdGgsIHdoaWNoIG11c3QgcmVseSBvbiBoYXNPd25Qcm9wZXJ0eVxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gX3NvdXJjZSkge1xuXHRcdFx0XHRpZiAoX3NvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0X2Rlc3RpbmF0aW9uW2tleV0gPSBjb3B5RWxlbWVudChcblx0XHRcdFx0XHRcdF9zb3VyY2Vba2V5XSxcblx0XHRcdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFNsb3dlc3QgcGF0aCAtLS0gaGFzT3duUHJvcGVydHkgY2FuJ3QgYmUgY2FsbGVkIGFzIGEgbWV0aG9kXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG5cdFx0XHRcdFx0X3NvdXJjZSxcblx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gX2Rlc3RpbmF0aW9uO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29weUVsZW1lbnQgKFxuXHRcdF9zb3VyY2UsXG5cdFx0X21heERlcHRoID0gNSxcblx0KSB7XG5cdFx0Ly8gU2ltcGxlIHZhbHVlc1xuXHRcdGlmICghaXNPYmplY3QoX3NvdXJjZSkpIHtcblx0XHRcdHJldHVybiBfc291cmNlO1xuXHRcdH1cblxuXHRcdC8vIEFscmVhZHkgY29waWVkIHZhbHVlc1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRjb25zdCBpbmRleCA9IHN0YWNrU291cmNlLmluZGV4T2YoX3NvdXJjZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gc3RhY2tEZXN0W2luZGV4XTtcblx0XHR9XG5cblx0XHRpZiAoaXNXaW5kb3coX3NvdXJjZSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjb3B5ISBNYWtpbmcgY29waWVzIG9mIFdpbmRvdyBpbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcblx0XHR9XG5cblx0XHRsZXQgbmVlZHNSZWN1cnNlID0gZmFsc2U7XG5cdFx0bGV0IF9kZXN0aW5hdGlvbiA9IGNvcHlUeXBlKF9zb3VyY2UpO1xuXG5cdFx0aWYgKF9kZXN0aW5hdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRfZGVzdGluYXRpb24gPSBpc0FycmF5KF9zb3VyY2UpID8gW10gOiBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihfc291cmNlKSk7XG5cdFx0XHRuZWVkc1JlY3Vyc2UgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja1NvdXJjZS5wdXNoKF9zb3VyY2UpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja0Rlc3QucHVzaChfZGVzdGluYXRpb24pO1xuXG5cdFx0cmV0dXJuIG5lZWRzUmVjdXJzZVxuXHRcdFx0PyBjb3B5UmVjdXJzZShcblx0XHRcdFx0X3NvdXJjZSxcblx0XHRcdFx0X2Rlc3RpbmF0aW9uLFxuXHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHQpXG5cdFx0XHQ6IF9kZXN0aW5hdGlvbjtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvcHlUeXBlIChfc291cmNlKSB7XG5cdFx0c3dpdGNoICh0b1N0cmluZy5jYWxsKF9zb3VyY2UpKSB7XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDhBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBJbnQxNkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDMyQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRmxvYXQzMkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBVaW50OEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQxNkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQzMkFycmF5XSc6XG5cdFx0XHRcdHJldHVybiBuZXcgX3NvdXJjZS5jb25zdHJ1Y3Rvcihcblx0XHRcdFx0XHRjb3B5RWxlbWVudChfc291cmNlLmJ1ZmZlciksXG5cdFx0XHRcdFx0X3NvdXJjZS5ieXRlT2Zmc2V0LFxuXHRcdFx0XHRcdF9zb3VyY2UubGVuZ3RoLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEFycmF5QnVmZmVyXSc6XG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTBcblx0XHRcdFx0aWYgKCFfc291cmNlLnNsaWNlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgd2UncmUgaW4gdGhpcyBjYXNlIHdlIGtub3cgdGhlIGVudmlyb25tZW50IHN1cHBvcnRzIEFycmF5QnVmZmVyXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cblx0XHRcdFx0XHRjb25zdCBjb3BpZWQgPSBuZXcgQXJyYXlCdWZmZXIoX3NvdXJjZS5ieXRlTGVuZ3RoKTtcblx0XHRcdFx0XHRuZXcgVWludDhBcnJheShjb3BpZWQpLnNldChuZXcgVWludDhBcnJheShfc291cmNlKSk7XG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSAqL1xuXHRcdFx0XHRcdHJldHVybiBjb3BpZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIF9zb3VyY2Uuc2xpY2UoMCk7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBOdW1iZXJdJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IERhdGVdJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKF9zb3VyY2UudmFsdWVPZigpKTtcblxuXHRcdFx0Y2FzZSAnW29iamVjdCBSZWdFeHBdJzpcblx0XHRcdFx0Y29uc3QgcmUgPSBuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdF9zb3VyY2UuX3NvdXJjZSxcblx0XHRcdFx0XHRfc291cmNlLnRvU3RyaW5nKClcblx0XHRcdFx0XHRcdC5tYXRjaCgvW14vXSokLylbMF0sXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0cmUubGFzdEluZGV4ID0gX3NvdXJjZS5sYXN0SW5kZXg7XG5cblx0XHRcdFx0cmV0dXJuIHJlO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEJsb2JdJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKFxuXHRcdFx0XHRcdFtfc291cmNlXSxcblx0XHRcdFx0XHR7dHlwZTogX3NvdXJjZS50eXBlfSxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoaXNGdW5jdGlvbihfc291cmNlLmNsb25lTm9kZSkpIHtcblx0XHRcdHJldHVybiBfc291cmNlLmNsb25lTm9kZSh0cnVlKTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEVudHJ5UGFyZW50TnVsbCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSA9IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz47XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlPcHRpb25zIHtcblx0cHVibGljIGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gdHJ1ZTtcblx0cHVibGljIHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0cHVibGljIHRlbXBsYXRlT3B0aW9uczogYW55ID0ge307IC8vIFRPRE9cblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBJdGVtRW50cnlPcHRpb25zSW50ZXJmYWNlKSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKFxuXHRcdFx0dGhpcyxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgaWQ6IG51bWJlciA9ICsrY3VycmVudElkO1xuXHRwdWJsaWMgcmVsb2FkUXVldWVkOiBib29sZWFuID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgaXRlbUlkOiBJdGVtSWQsXG5cdFx0cHVibGljIGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBxdWV1ZVJlbG9hZCAoKTogdGhpcyB7XG5cdFx0dGhpcy5yZWxvYWRRdWV1ZWQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZmFjdG9yeS5rZXlTZXJ2aWNlLmlzTG9jYWxJZCh0aGlzLml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NrYWJsZSAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoICh0aGlzLml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ01hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Y2FzZSAnVm9lcnR1aWcnOlxuXHRcdFx0Y2FzZSAnVGVtcGxhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OICgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IHRoaXMuaWQsXG5cdFx0XHRjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUGF0aCwgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UsIFJlc3BvbnNlQ29sdW1uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cblx0cHVibGljIGNvbHVtbnM6IHtbY29sdW1uSWQ6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1ufTtcblx0cHVibGljIGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblx0cHVibGljIGluaXRpYWw6IFJlYWRvbmx5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRwdWJsaWMgcmVhZG9ubHkgZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHByb3RlY3RlZCByZWFkb25seSBfaXNOZXc6IGJvb2xlYW4sXG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLnJlc3BvbnNlW2VudHJ5LmNvbHVtbnMuaXRlbVR5cGVdO1xuXHRcdHRoaXMuaW5pdGlhbCA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmluaXRpYWw7XG5cdFx0dGhpcy5maWVsZHMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcztcblxuXHRcdHRoaXMub25Db25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8vIFVzZWQgZm9yIHJlc291cmNlIGNsZWFyaW5nIHRlc3RzXG5cdHB1YmxpYyBvbkNvbnN0cnVjdCAoKTogdm9pZCB7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXBkYXRlcyB0aGUgZmllbGRzIG9mIHRoZSBpdGVtIGFuZCBjYWxscyBvbkNoYW5nZSwgd2hlbiB1cGRhdGluZyBtYW55IGZpZWxkcyBvZiBtYW55IGl0ZW1zIGl0J3MgYmV0dGVyIHRvIGNyZWF0ZSBhIHtAbGluayBDaGFuZ2VzRGVsdGEgQ2hhbmdlc0RlbHRhfSB5b3Vyc2VsZiBzbyBhbGwgY2hhbmdlcyBjYW4gYmUgYXBwbGllZCBhdCBvbmNlXG5cdCAqL1xuXHRwdWJsaWMgc2V0RmllbGRzIChcblx0XHR2YWx1ZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dGhpcz4ge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHZhbHVlcykge1xuXHRcdFx0Y29uc3QgY29sdW1uID0gY29sdW1uc1tjb2x1bW5JZF07XG5cblx0XHRcdGlmIChjb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0J3NldEZpZWxkczogbm8gY29sdW1uIGZvdW5kIGZvcicsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVDaGFuZ2VzRGVsdGEoKTtcblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMsXG5cdFx0XHRcdHRoaXMuZmFjdG9yeS5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjb3B5RmllbGRzIChkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyeTtcblxuXHRcdHRoaXMuZmFjdG9yeS5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHRoaXMuZmllbGRzLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgSXRlbVJlc291cmNlJ3MgcGFyZW50IHdpdGggdGhlIGN1cnJlbnQgZmllbGRzXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byBnZXQgdGhlIHBhcmVudCBhZnRlciBhbiBpdGVtIGhhcyBiZWVuIGRlbGV0ZWRcblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQgKFxuXHRcdGZyb21Jbml0aWFsPzogYm9vbGVhbixcblx0KTogRW50cnlQYXJlbnROdWxsIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0ZnJvbUluaXRpYWwsXG5cdFx0XHR0aGlzLmZpZWxkcyxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSB0cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YX0gaW5zdGVhZFxuXHQgKi9cblx0cHVibGljIGNhbGxPbkNoYW5nZSAoXG5cdFx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9uQ2hhbmdlQ2FsbGJhY2tzID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5maWVsZENoYW5nZUNhbGxiYWNrc1t0aGlzLmVudHJ5Lml0ZW1UeXBlXT8uW3RoaXMuZW50cnkuaXRlbUlkXTtcblxuXHRcdGlmIChvbkNoYW5nZUNhbGxiYWNrcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjYWxsYmFjayBvZiBvbkNoYW5nZUNhbGxiYWNrcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y2FsbGJhY2soXG5cdFx0XHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdFx0XHRjb2x1bW5JZCA9PiB0aGlzLmZhY3RvcnkuYXBpRm9ybWF0dGVyLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdFx0XHR0aGlzLmVudHJ5LmNvbHVtbnMucmVzcG9uc2VbdGhpcy5lbnRyeS5pdGVtVHlwZV1bY29sdW1uSWRdLnR5cGUsXG5cdFx0XHRcdFx0XHR0aGlzLmZpZWxkc1tjb2x1bW5JZF0sXG5cdFx0XHRcdFx0XHRwcmV2aW91c1tjb2x1bW5JZF0sXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0aGlzLmZpZWxkcyxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZWFzaWx5IGNoZWNrIGlmIGEgZmllbGQgaXMgY2hhbmdlZC5cblx0ICogV2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgZmllbGQgaXMgY2hhbmdlZFxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBvbkNoYW5nZTogKFxuXHQgKiAgICAgaXRlbVJlc291cmNlLFxuXHQgKiAgICAgcHJldmlvdXMsXG5cdCAqICAgICBjb21wYXJlSXRlbUZpZWxkXG5cdCAqICkge1xuXHQgKiAgICAgaWYgKCFjb21wYXJlSXRlbUZpZWxkKCdjb2x1bW5JZCcpKSB7XG5cdCAqICAgICAgICAgcHJvY2Vzc0l0ZW0oaXRlbVJlc291cmNlKTtcblx0ICogICAgIH1cblx0ICogfVxuXHQgKi9cblx0cHVibGljIGNvbXBhcmVJdGVtRmllbGQgKFxuXHRcdGNvbHVtbklkOiBrZXlvZiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbY29sdW1uSWRdO1xuXG5cdFx0aWYgKGNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgY29sdW1uIGluIEl0ZW1SZXNvdXJjZS5jb21wYXJlSXRlbUZpZWxkJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZmFjdG9yeS5hcGlGb3JtYXR0ZXIuY29tcGFyZUZpZWxkcyhcblx0XHRcdGNvbHVtbi50eXBlLFxuXHRcdFx0dGhpcy5maWVsZHNbY29sdW1uSWRdLFxuXHRcdFx0cHJldmlvdXNbY29sdW1uSWRdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgaGFzQ2hhbmdlcyAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0Lml0ZW1IYW5kbGVyXG5cdFx0XHQuZGV0ZWN0RW50cnlDaGFuZ2VzKHRoaXMuZW50cnkuaWQpO1xuXHR9XG5cblx0cHVibGljIHNldFRyYW5zYWN0aW9uUGFyYW1ldGVycyAoXG5cdFx0cGFyYW1ldGVyczogYW55LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi50YWJSZXF1ZXN0UGFyYW1ldGVycyxcblx0XHRcdFtcblx0XHRcdFx0dGhpcy5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5lbnRyeS5pdGVtSWQsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdF0sXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogJ2lzTmV3JyBtZWFucyB0aGF0IHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gaXMgYSBsb2NhbCBpdGVtIGFuZCB0aGF0IHRoaXMgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgd2hlbiB0aGUge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHdhcyBmaXJzdCBjcmVhdGVkXG5cdCAqL1xuXHRwdWJsaWMgaXNOZXcgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc05ldztcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2FsICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5lbnRyeS5pc0xvY2FsKCk7XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OICgpIHtcblx0XHRjb25zdCBjb2x1bW5JZHM6IHN0cmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHRoaXMuY29sdW1ucykge1xuXHRcdFx0Y29sdW1uSWRzLnB1c2goY29sdW1uSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5JZHMsXG5cdFx0XHRmaWVsZHM6IHRoaXMuZmllbGRzLFxuXHRcdFx0ZW50cnk6IHRoaXMuZW50cnksXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtblBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBwYXRoIGNvdWxkbid0IGJlIHRyYXZlcnNlZFxuXHQgKlxuXHQgKiBAcGFyYW0gY29sdW1uUGF0aCBDYW4gZWl0aGVyIGJlIGFuIGFycmF5IG9mIGNvbHVtbklkcyAoWydjb2x1bW4nLCAnY29sdW1uMiddKSBvciBhIGNvbmZpZyBjb2x1bW4gc3RyaW5nICgnY29sdW1uPmNvbHVtbjInKVxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZTxUIGV4dGVuZHMgYW55ID0gYW55PiAoY29sdW1uUGF0aDogc3RyaW5nW10gfCBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5nZXREZXJpdmVkVmFsdWUoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0Y29sdW1uUGF0aCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBUcmF2ZXJzZXMgdGhlIGNvbHVtbiBwYXRoIGFuZCByZXR1cm5zIHRoZSBmaWVsZHMgb2YgdGhlIGRlcml2ZWQgaXRlbSwgcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGl0ZW0gaXNuJ3QgZm91bmRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgZGVyaXZlZCBpdGVtJ3MgdmFsdWVzIGFyZSBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZXMgKFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdLFxuXHQpOiBSZWFkb25seTxGaWVsZE1hcD4gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmdldERlcml2ZWRWYWx1ZXMoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0Y29sdW1uUGF0aCxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBpbnN0YW50aWF0ZU9wdGlvbnMgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgQXBpUmVxdWVzdExpbWl0LCBFbnRyeVBhcmVudE51bGwgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UgPSBQYXJ0aWFsPENvbGxlY3Rpb25FbnRyeU9wdGlvbnM+O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyB7XG5cdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gW107XG5cdHF1ZXJ5OiBBcGlRdWVyeSB8IG51bGwgPSBudWxsO1xuXHRxdWVyeVBhcmFtczogYW55ID0ge307IC8vIFRPRE9cblx0cXVlcnlDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCA9IG51bGw7XG5cdGRlZmVyUmVxdWVzdDogYm9vbGVhbiA9IGZhbHNlO1xuXHRsaW1pdDogQXBpUmVxdWVzdExpbWl0IHwgbnVsbCA9IG51bGw7XG5cdGVudHJ5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlKSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKFxuXHRcdFx0dGhpcyxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBpbnN0YW50aWF0ZU9wdGlvbnMgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvblJlc291cmNlLCBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb252ZXJzaW9uTWFwLCBGaWVsZENoYW5nZUNhbGxiYWNrLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlQ2FsbGJhY2s8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gKFxuXHRpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZU9uQWRkQ2FsbGJhY2s8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gKFxuXHRpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdGlzSW5pdGlhbENhbGw6IGJvb2xlYW4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZUluaXRpYWxDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSAoXG5cdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIE9uSXRlbXNDcmVhdGVkQ2FsbGJhY2sgPSAoY29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSBQYXJ0aWFsPENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPj47XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cdGNhbGxPbkFkZFdpdGhJbml0aWFsSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogWW91IHNob3VsZCB1c2UgcmVnaXN0ZXIgYSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5yZWdpc3RlckZpZWxkQ2hhbmdlQ2FsbGJhY2sgZmllbGQgY2hhbmdlIGNhbGxiYWNrfSBhbmQgY29tcGFyZSBwcmV2aW91cy5pZCB3aXRoIGZpZWxkcy5pZFxuXHQgKi9cblx0b25JdGVtc0NyZWF0ZWQ6IE9uSXRlbXNDcmVhdGVkQ2FsbGJhY2sgPSBub29wO1xuXHRvbkFkZDogQ29sbGVjdGlvblJlc291cmNlT25BZGRDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0b25SZW1vdmU6IENvbGxlY3Rpb25SZXNvdXJjZUNhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRvbkNoYW5nZTogRmllbGRDaGFuZ2VDYWxsYmFjayA9IG5vb3A7XG5cdG9uQWRkSW5pdGlhbDogQ29sbGVjdGlvblJlc291cmNlSW5pdGlhbENhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRvblJlbW92ZUluaXRpYWw6IENvbGxlY3Rpb25SZXNvdXJjZUluaXRpYWxDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0cmVzb3VyY2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXHRjdXN0b206IGFueSA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+KSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKFxuXHRcdFx0dGhpcyxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLCBDb2x1bW5FeHBhbnNpb24sIENvbHVtbkluZm8sIENvbHVtblNldCwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q29sbGVjdGlvblF1ZXJ5LFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEl0ZW1JZCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uL3R5cGVzJztcblxubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgaWQ6IG51bWJlciA9IGN1cnJlbnRJZCsrO1xuXHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXHRwdWJsaWMgcXVlcnk6IENvbGxlY3Rpb25RdWVyeTtcblx0cHVibGljIGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+O1xuXHRwdWJsaWMgcmVsb2FkUXVldWVkOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBwcm9taXNlOiBQcm9taXNlSW50ZXJmYWNlPHRoaXM+O1xuXG5cdC8vIHByaXZhdGUgdGVtcGxhdGVDb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgb3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KSB7XG5cdFx0dGhpcy5wYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcblx0XHR0aGlzLnF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG9wdGlvbnMpO1xuXHRcdHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3RTdHViKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2FsICgpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnQuaXRlbUlkKTtcblx0fVxuXG5cdHB1YmxpYyBtYXRjaFBhcmVudCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyA9PSB0byBjb21wYXJlIGl0ZW1JZHNcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdHJldHVybiBwYXJlbnQuaXRlbVR5cGUgPT09IGl0ZW1UeXBlICYmIHBhcmVudC5pdGVtSWQgPT0gaXRlbUlkO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZFF1ZXJ5IChjYWxsYmFjaz86IFF1ZXJ5Q2FsbGJhY2spOiBBcGlRdWVyeSB7XG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5xdWVyeTtcblx0XHR9XG5cblx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zID0gY2FsbGJhY2sob3B0aW9ucy5xdWVyeVBhcmFtcyk7XG5cblx0XHRyZXR1cm4gdGhpcy5xdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblx0fVxuXG5cdHB1YmxpYyBxdWV1ZVJlbG9hZCAoKTogdm9pZCB7XG5cdFx0dGhpcy5yZWxvYWRRdWV1ZWQgPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZENvbHVtbnMgKGNvbHVtbkV4cGFuc2lvbjogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4pOiB2b2lkIHtcblx0XHRjb25zdCBleHBhbnNpb25SZXN1bHQgPSBjb2x1bW5FeHBhbnNpb24ucnVuKHRoaXMuY29sdW1ucyk7XG5cblx0XHRpZiAoZXhwYW5zaW9uUmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2x1bW5zID0gZXhwYW5zaW9uUmVzdWx0Lm1lcmdlZDtcblx0XHQvLyB0aGlzLnRlbXBsYXRlQ29sdW1ucyA9IG51bGw7XG5cdFx0dGhpcy5vcHRpb25zLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMucmVxdWVzdDtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRSZXF1ZXN0Q29sdW1ucyAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogdm9pZCB7XG5cdFx0dGhpcy5jb2x1bW5zLmV4cGFuZFJlcXVlc3RDb2x1bW5zKHJlcXVlc3RDb2x1bW5zKTtcblx0XHR0aGlzLm9wdGlvbnMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5yZXF1ZXN0O1xuXHR9XG5cblx0cHVibGljIGdldFVwZGF0ZWRJdGVtQ29sdW1ucyAoXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KToge1tjb2x1bW5JZDogc3RyaW5nXTogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+fSB7XG5cdFx0Y29uc3QgaXRlbUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuaXRlbTtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGl0ZW1Db2x1bW5zKSB7XG5cdFx0XHRpZiAoY29udmVyc2lvbk1hcFtjb2x1bW4uYXBpQ29sdW1uLml0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW4uaWRdID0gY29sdW1uO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXVxuXHQvLyBnZXRBZGRlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiB0cnVlKTogSXRlbUlkW107XG5cdC8vIGdldEFkZGVkSXRlbXMgKHJldHVybkl0ZW1JZHM/OiBib29sZWFuKTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXHQvLyBnZXRBZGRlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiBib29sZWFuID0gZmFsc2UpIHtcblx0Ly8gXHRjb25zdCBpbml0aWFsID0gdGhpcy5pbml0aWFsO1xuXHQvLyBcdGNvbnN0IG1vZGlmaWVkID0gdGhpcy5pdGVtcztcblx0Ly8gXHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgSXRlbUlkPiA9IFtdO1xuXHQvL1xuXHQvLyBcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIG1vZGlmaWVkKSB7XG5cdC8vIFx0XHRpZiAoaW5pdGlhbC5pbmRleE9mKGl0ZW1FbnRyeSkgPT09IC0xKSB7XG5cdC8vIFx0XHRcdHJlc3VsdC5wdXNoKHJldHVybkl0ZW1JZHMgPyBpdGVtRW50cnkuaXRlbUlkIDogaXRlbUVudHJ5KTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vXG5cdC8vIFx0cmV0dXJuIHJlc3VsdDtcblx0Ly8gfVxuXHQvL1xuXHQvLyBnZXRSZW1vdmVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IHRydWUpOiBJdGVtSWRbXTtcblx0Ly8gZ2V0UmVtb3ZlZEl0ZW1zIChyZXR1cm5JdGVtSWRzPzogYm9vbGVhbik6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pjtcblx0Ly8gZ2V0UmVtb3ZlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiBib29sZWFuID0gZmFsc2UpIHtcblx0Ly8gXHRjb25zdCBpbml0aWFsID0gdGhpcy5pbml0aWFsO1xuXHQvLyBcdGNvbnN0IG1vZGlmaWVkID0gdGhpcy5pdGVtcztcblx0Ly8gXHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgSXRlbUlkPiA9IFtdO1xuXHQvL1xuXHQvLyBcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGluaXRpYWwpIHtcblx0Ly8gXHRcdGlmIChtb2RpZmllZC5pbmRleE9mKGl0ZW1FbnRyeSkgPT09IC0xKSB7XG5cdC8vIFx0XHRcdHJlc3VsdC5wdXNoKHJldHVybkl0ZW1JZHMgPyBpdGVtRW50cnkuaXRlbUlkIDogaXRlbUVudHJ5KTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vXG5cdC8vIFx0cmV0dXJuIHJlc3VsdDtcblx0Ly8gfVxuXHQvL1xuXHQvLyBnZXRVcGRhdGVkSXRlbXMgKCk6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdC8vIFx0Y29uc3QgbW9kaWZpZWQgPSB0aGlzLml0ZW1zO1xuXHQvLyBcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdC8vXG5cdC8vIFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgbW9kaWZpZWQpIHtcblx0Ly8gXHRcdGlmICghaXRlbUVudHJ5LmlzTG9jYWwoKSAmJiBpdGVtRW50cnkuaGFzQ2hhbmdlcygpKSB7XG5cdC8vIFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdHJldHVybiByZXN1bHQ7XG5cdC8vIH1cblxuXHQvLyB0b2RvW2NhY2hlXSBUaGlzIGlzIHVzZWQgaW4gdGhlIGZyb250ZW5kIGluIHRoZSBwbGFubmVyLCBidXQgSSB0aGluayB3ZSBzaG91bGQgZml4IHRoYXQgaW4gdGhlIGZyb250ZW5kIHNvbWUgb3RoZXIgd2F5XG5cdC8vIHB1YmxpYyBvbkFkZEluaXRpYWwgKGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pOiB2b2lkIHtcblx0Ly8gXHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMucmVzb3VyY2VzKSB7XG5cdC8vIFx0XHR0cnkge1xuXHQvLyBcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uQWRkSW5pdGlhbChcblx0Ly8gXHRcdFx0XHRpdGVtRW50cmllcyxcblx0Ly8gXHRcdFx0XHR0aGlzLFxuXHQvLyBcdFx0XHQpO1xuXHQvLyBcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gXHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vIH1cblx0Ly9cblx0Ly8gcHVibGljIG9uUmVtb3ZlSW5pdGlhbCAoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pik6IHZvaWQge1xuXHQvLyBcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy5yZXNvdXJjZXMpIHtcblx0Ly8gXHRcdHRyeSB7XG5cdC8vIFx0XHRcdHJlc291cmNlLm9wdGlvbnMub25SZW1vdmVJbml0aWFsKFxuXHQvLyBcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHQvLyBcdFx0XHRcdHRoaXMsXG5cdC8vIFx0XHRcdCk7XG5cdC8vIFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHQvLyBcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly8gfVxufVxuIiwiaW1wb3J0IHsgZmlsdGVyQXJyYXkgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLCBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRDb21wYXJlRmllbGRDYWxsYmFjayxcblx0RGVyZWdGdW5jdGlvbixcblx0RmllbGRDaGFuZ2VDYWxsYmFjayxcblx0RmllbGRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVJlc291cmNlSXRlbUlkTWFwLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UXVlcnlDYWxsYmFjayxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cblx0cHVibGljIGl0ZW1zOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cdHB1YmxpYyBjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwO1xuXHRwcm90ZWN0ZWQgaXRlbUlkTWFwOiBJdGVtUmVzb3VyY2VJdGVtSWRNYXA8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0cHJpdmF0ZSBmaWVsZENoYW5nZURlcmVnRm5zOiB7XG5cdFx0W2l0ZW1JZDogc3RyaW5nXTogRGVyZWdGdW5jdGlvblxuXHR9ID0ge307XG5cblx0cHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogRmllbGRDaGFuZ2VDYWxsYmFjaztcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIGVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRwdWJsaWMgb3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+LFxuXHRcdHB1YmxpYyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0dGhpcy5pdGVtcyA9IFtdO1xuXHRcdHRoaXMuaXRlbUlkTWFwID0ge307XG5cdFx0dGhpcy5jb2x1bW5zID0gZW50cnkuY29sdW1ucy5yZXNwb25zZTtcblxuXHRcdC8vIHRoaXMgYWxsb3dzIHVzIHRvIHVwZGF0ZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gaW4gdGhlIG9wdGlvbnNcblx0XHR0aGlzLm9uQ2hhbmdlID0gKFxuXHRcdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRcdGNvbXBhcmVGaWVsZDogQ29tcGFyZUZpZWxkQ2FsbGJhY2ssXG5cdFx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHRcdFx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0KSA9PiB7XG5cdFx0XHRpZiAoIWNvbXBhcmVGaWVsZCgnaWQnKSkge1xuXHRcdFx0XHR0aGlzLml0ZW1JZE1hcFtmaWVsZHMuaWRdID0gdGhpcy5nZXRJdGVtQnlJZChwcmV2aW91cy5pZCk7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1JZE1hcFtwcmV2aW91cy5pZF07XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub3B0aW9ucy5vbkNoYW5nZShcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRjb21wYXJlRmllbGQsXG5cdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHQpO1xuXHRcdH07XG5cblx0XHR0aGlzLmFkZEl0ZW1SZXNvdXJjZXMoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdHRoaXMuZW50cnkuaWQsXG5cdFx0XHQpLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5vbkNvbnN0cnVjdCgpO1xuXHR9XG5cblx0Ly8gVXNlZCBmb3IgcmVzb3VyY2UgY2xlYXJpbmcgdGVzdHNcblx0cHVibGljIG9uQ29uc3RydWN0ICgpOiB2b2lkIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1Nb3ZlZCBDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkfVxuXHQgKi9cblx0cHVibGljIG1vdmVJdGVtcyAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRkZXN0aW5hdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQubW92ZUl0ZW1zKFxuXHRcdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0XHRkZXN0aW5hdGlvblJlc291cmNlLmVudHJ5LFxuXHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlSXRlbXMgKFxuXHRcdGlkQXJyYXk6IEl0ZW1JZFtdLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmZhY3RvcnkuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCByZW1vdmVkSXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiB0aGlzLml0ZW1zKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtUmVzb3VyY2UuZW50cnk7XG5cblx0XHRcdGlmIChpZEFycmF5LmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPT09IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQocmVtb3ZlZEl0ZW1FbnRyaWVzKTtcblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVJdGVtIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlSXRlbXMoXG5cdFx0XHRbaXRlbUlkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1zIChcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVDaGFuZ2VzRGVsdGEoKTtcblxuXHRcdGlmICh0aGlzLmVudHJ5LnBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcGFyZW50RmllbGRzID0gdGhpcy5mYWN0b3J5Lml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHR0aGlzLmVudHJ5LnBhcmVudCxcblx0XHRcdFx0dGhpcy5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgdmFsdWVzIG9mIHZhbHVlc0FycmF5KSB7XG5cdFx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcGFyZW50RmllbGRzKSB7XG5cdFx0XHRcdFx0dmFsdWVzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhXG5cdFx0XHQuc2V0SXRlbXNDcmVhdGVkKFxuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHR2YWx1ZXNBcnJheSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSksXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW0gKFxuXHRcdHZhbHVlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hZGRJdGVtcyhcblx0XHRcdFt2YWx1ZXNdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SWRBcnJheSAoKTogSXRlbUlkW10ge1xuXHRcdHJldHVybiB0aGlzLml0ZW1zLm1hcChcblx0XHRcdGl0ZW1SZXNvdXJjZSA9PiBpdGVtUmVzb3VyY2UuZW50cnkuaXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvLyB0b2RvW3R5cGVdIEl0ZW1zIGNhbiBiZSB1bmRlZmluZWQsIGJ1dCB0aGlzIGdpdmVzIGEgbG90IG9mIGVycm9ycyBmcm9udGVuZFxuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQgKGl0ZW1JZDogbnVtYmVyKTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLml0ZW1JZE1hcFtpdGVtSWRdO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1SZXNvdXJjZXMgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0aXNJbml0aWFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4geyAvLyBzaG91bGQgYmUgZmFzdFxuXHRcdGlmIChpdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbEl0ZW1FbnRyaWVzID0gdGhpcy5pdGVtcy5tYXAoXG5cdFx0XHRpdGVtUmVzb3VyY2UgPT4gaXRlbVJlc291cmNlLmVudHJ5LFxuXHRcdCk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBsb29rIGluIGl0ZW1JZE1hcCA/IHdlIG9ubHkgd2FudCB0byBhZGQgcmVzb3VyY2VzIGlmIHRoZXJlIGlzIG5vbmUgeWV0XG5cdFx0aXRlbUVudHJpZXMgPSBpdGVtRW50cmllcy5maWx0ZXIoXG5cdFx0XHRpdGVtRW50cnkgPT4gbG9jYWxJdGVtRW50cmllcy5pbmRleE9mKGl0ZW1FbnRyeSkgPT09IC0xLFxuXHRcdCk7XG5cblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQ7XG5cblx0XHRcdGlmICh0aGlzLml0ZW1JZE1hcFtpdGVtSWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBZGRlZCBhIHJlc291cmNlIG9mIGFuIGVudHJ5IHRoYXQgd2FzIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24gIScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLml0ZW1zLnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdHRoaXMuaXRlbUlkTWFwW2l0ZW1JZF0gPSBpdGVtUmVzb3VyY2U7XG5cblx0XHRcdHRoaXMuZmllbGRDaGFuZ2VEZXJlZ0Zuc1tpdGVtUmVzb3VyY2UuZW50cnkuaXRlbUlkXSA9IHRoaXMudHJhbnNhY3Rpb24ucmVnaXN0ZXJGaWVsZENoYW5nZUNhbGxiYWNrKFxuXHRcdFx0XHRpdGVtUmVzb3VyY2UuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQsXG5cdFx0XHRcdHRoaXMub25DaGFuZ2UsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICghaXNJbml0aWFsQ2FsbCB8fCB0aGlzLm9wdGlvbnMuY2FsbE9uQWRkV2l0aEluaXRpYWxJdGVtcykge1xuXHRcdFx0dGhpcy5jYWxsT25BZGQoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZXMsXG5cdFx0XHRcdGlzSW5pdGlhbENhbGwsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpdGVtUmVzb3VyY2VzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZXN9IHRoYXQgd2hlcmUgcmVtb3ZlZCBmcm9tIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIGNvbGxlY3Rpb259LlxuXHQgKiBGaWx0ZXJzIG9uIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfS57QGxpbmsgSXRlbUVudHJ5IGVudHJ5fSA9PT0ge0BsaW5rIEl0ZW1FbnRyeSBlbnRyeX1cblx0ICovXG5cdHB1YmxpYyByZW1vdmVJdGVtUmVzb3VyY2VzIChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KTogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0ZmlsdGVyQXJyYXkoXG5cdFx0XHR0aGlzLml0ZW1zLFxuXHRcdFx0aXRlbVJlc291cmNlID0+IHtcblx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdFx0XHRpZiAoaXRlbVJlc291cmNlLmVudHJ5ID09PSBpdGVtRW50cnkpIHtcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSWRNYXBbaXRlbUVudHJ5Lml0ZW1JZF07XG5cblx0XHRcdFx0XHRcdHRoaXMuZmllbGRDaGFuZ2VEZXJlZ0Zuc1tpdGVtRW50cnkuaXRlbUlkXSgpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuZmllbGRDaGFuZ2VEZXJlZ0Zuc1tpdGVtRW50cnkuaXRlbUlkXTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBjYWxsT25BZGQgKFxuXHRcdGl0ZW1SZXNvdXJjZXM6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0XHRpc0luaXRpYWxDYWxsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25BZGQoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZXMsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGlzSW5pdGlhbENhbGwsXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmZhY3RvcnkuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNhbGxPblJlbW92ZSAoaXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+KTogdm9pZCB7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMub3B0aW9ucy5vblJlbW92ZShcblx0XHRcdFx0aXRlbVJlc291cmNlcyxcblx0XHRcdFx0dGhpcyxcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZm9yRWFjaCAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+KSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHRjYWxsYmFjayhpdGVtUmVzb3VyY2UpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmaWx0ZXIgKGNhbGxiYWNrOiAoaXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPikgPT4gYm9vbGVhbik6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGlmIChjYWxsYmFjayhpdGVtUmVzb3VyY2UpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmaXJzdCAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+KSA9PiBib29sZWFuKTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4gfCBudWxsIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGlmIChjYWxsYmFjayhpdGVtUmVzb3VyY2UpKSB7XG5cdFx0XHRcdHJldHVybiBpdGVtUmVzb3VyY2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRwdWJsaWMgc29tZSAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZmlyc3QoY2FsbGJhY2spICE9PSBudWxsO1xuXHR9XG5cblx0cHVibGljIGdyb3VwQnkgKGFyZ3VtZW50OiBzdHJpbmcgfCAoKGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4pID0+IHN0cmluZyB8IG51bGwpKToge1trZXk6IHN0cmluZ106IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pn0ge1xuXHRcdGNvbnN0IGl0ZW1zUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblx0XHRjb25zdCByZXN1bHQ6IHtba2V5OiBzdHJpbmddOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj59ID0ge307XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKHRoaXMuZW50cnkuY29sdW1ucy5yZXNwb25zZVt0aGlzLmVudHJ5Lml0ZW1UeXBlXVthcmd1bWVudF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byBncm91cCBvbiBhIGNvbHVtbiBub3QgcmVxdWVzdGVkIGJ5IHRoaXMgY29sbGVjdGlvbiEgKGNvbHVtbiAnJHthcmd1bWVudH0nKWApO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtc1Jlc291cmNlcykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGl0ZW1SZXNvdXJjZS5maWVsZHNbYXJndW1lbnRdO1xuXG5cdFx0XHRcdGlmIChyZXN1bHRbdmFsdWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbdmFsdWVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbdmFsdWVdLnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtc1Jlc291cmNlcykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFyZ3VtZW50KGl0ZW1SZXNvdXJjZSk7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3ZhbHVlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3ZhbHVlXSA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0W3ZhbHVlXS5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBtYXA8VT4gKGFyZ3VtZW50OiBzdHJpbmcgfCAoKGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4pID0+IFUpKTogVVtdIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblx0XHRjb25zdCBsZW5ndGggPSBpdGVtUmVzb3VyY2VzLmxlbmd0aDtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTtcblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IGl0ZW1SZXNvdXJjZXNbaV0uZmllbGRzW2FyZ3VtZW50XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IGFyZ3VtZW50KGl0ZW1SZXNvdXJjZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgcmVkdWNlPFU+IChcblx0XHRjYWxsYmFjazogKFxuXHRcdFx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRcdHZhbHVlOiBVLFxuXHRcdCkgPT4gVSxcblx0XHR2YWx1ZTogVSxcblx0KTogVSB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKFxuXHRcdFx0XHRpdGVtUmVzb3VyY2UsXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgbmV3IGl0ZW1zIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb25cblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBVc2VkIHRvIHJldHVybiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZXN9LCBidXQgeW91IHNob3VsZCB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vbkFkZCBvbkFkZCkgaW5zdGVhZFxuXHQgKi9cblx0cHVibGljIGV4dGVuZCAoXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQudHJhbnNhY3Rpb25cblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmV4dGVuZENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdFx0cXVlcnlDYWxsYmFjayxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fVxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIERvZXNuJ3QgcmV2ZXJ0IGNoYW5nZXMgb24gdGhlIGl0ZW1zIHRoZW1zZWx2ZXNcblx0ICovXG5cdHB1YmxpYyBjbGVhclJlc291cmNlICgpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiB0aGlzLmZpZWxkQ2hhbmdlRGVyZWdGbnMpIHtcblx0XHRcdHRoaXMuZmllbGRDaGFuZ2VEZXJlZ0Zuc1tpdGVtSWRdKCk7XG5cdFx0XHRkZWxldGUgdGhpcy5maWVsZENoYW5nZURlcmVnRm5zW2l0ZW1JZF07XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5jbGVhckNvbGxlY3Rpb25SZXNvdXJjZSh0aGlzKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbk1hcCwgQXBpUmVzcG9uc2UsIEZpZWxkTWFwLCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcDtcblx0Y29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT47IC8vIFRPRE86IHJlbmFtZSB0byBjb2x1bW5TZXRcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHB1YmxpYyByZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1ucyA9IHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpO1xuXG5cdFx0dGhpcy5yZXNwb25zZUNvbHVtbnMgPSBmYWN0b3J5LmNvbHVtblV0aWwubWVyZ2VSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRhZGRpdGlvbmFsUmVzcG9uc2VDb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXG5cdFx0Ly8gV2UgaGF2ZSB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdENvbHVtbnMgb25seSBmcm9tIHRoZSB0ZW1wbGF0ZSdzIHJlc3BvbnNlLCB3ZSBuZWVkIHRvIHRyZWF0IHRoZSBhZGRpdGlvbmFsIHJlcXVlc3QgY29sdW1ucyBhcyBhY3R1YWwgcmVxdWVzdCBjb2x1bW5zXG5cdFx0dGhpcy5jb2x1bW5zID0gZmFjdG9yeS5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdEZyb21SZXNwb25zZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnNcblx0XHRcdC5leHBhbmQoXG5cdFx0XHRcdGFkZGl0aW9uYWxSZXF1ZXN0Q29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhZGRpdGlvbmFsUmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRGaWVsZHMgKCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gdGhpcy5pdGVtVHlwZTtcblxuXHRcdHJldHVybiB0aGlzLnJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLnJlc3BvbnNlLmxpbmtzW2l0ZW1UeXBlXVswXSxcblx0XHQpITtcblx0fVxufVxuIiwiLy8gc2hvdWxkIGJlIG9yZGVyZWQgYnkgZGVwZW5kZW5jeSFcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUVudHJ5T3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1SZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeU9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVudHJ5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblJlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vVGVtcGxhdGUnO1xuIiwiZXhwb3J0IGNvbnN0IEFMTF9QRVJNSVNTSU9OUyA9ICc3JztcblxuZXhwb3J0IGNvbnN0IENPTFVNTl9TRVBFUkFUT1IgPSAnPic7XG5leHBvcnQgY29uc3QgUkVOREVSX0FTX1NFUEVSQVRPUiA9ICc6JztcblxuZXhwb3J0IGNvbnN0IE5FV19QUkVGSVg6IHN0cmluZyA9ICctMSc7XG5leHBvcnQgY29uc3QgRFVQTElDQVRFX1BSRUZJWDogc3RyaW5nID0gJy0yJztcblxuZXhwb3J0IGNvbnN0IE5FV19LRVlXT1JEOiBzdHJpbmcgPSAnbmV3LSc7XG5leHBvcnQgY29uc3QgRFVQTElDQVRFX0tFWVdPUkQ6IHN0cmluZyA9ICdkdXAtJztcbiIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNV9fOyIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQXBpUmVzcG9uc2VQcm9jZXNzb3IgfSBmcm9tICcuLi9jbGFzc2VzJztcblxuZXhwb3J0IGNsYXNzIEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyKSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdCAocmVzcG9uc2U6IGFueSk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yIHtcblx0XHRyZXR1cm4gbmV3IEFwaVJlc3BvbnNlUHJvY2Vzc29yKHRoaXMuYXBpRm9ybWF0dGVyLCByZXNwb25zZSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENoYW5nZXNDb21waWxhdGlvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdH1cblxuXHRjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDaGFuZ2VzQ29tcGlsYXRpb24ge1xuXHRcdHJldHVybiBuZXcgQ2hhbmdlc0NvbXBpbGF0aW9uKFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSxcblx0KTogQ29sbGVjdGlvbkNhY2hlIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25DYWNoZShcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblx0XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UgfSBmcm9tICcuLi9tb2RlbHMvJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMvJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuL0NvbHVtblNldEZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5RmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHR0aGlzLmNvbHVtblNldEZhY3RvcnksXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyLCBTZXJ2ZXJDYWNoZSwgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUgfCBTZXJ2ZXJDYWNoZSxcblx0XHRnZXRDb2xsZWN0aW9uRW50cmllczogPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPihpdGVtVHlwZTogSXRlbVR5cGVUeXBlKSA9PiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IENvbGxlY3Rpb25NYXRjaGVyIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25NYXRjaGVyKFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwdWJsaWMgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uSW5mb0ZhY3Rvcnk6IENvbHVtbkluZm9GYWN0b3J5LFxuXHQpIHtcblxuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBDb2x1bW5FeHBhbnNpb248SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2x1bW5FeHBhbnNpb24oXG5cdFx0XHR0aGlzLmNvbHVtbkluZm9GYWN0b3J5LFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW4sIFJvb3RDb2x1bW5NYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5JbmZvRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yICgpIHt9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0YXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRwYXJlbnQ6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGxcblx0KTogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbHVtbkluZm8oYXBpQ29sdW1uLCBwYXJlbnQpO1xuXHR9XG5cblx0Y29uc3RydWN0RnJvbVJvb3RNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRyb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwLFxuXHRcdHBhcmVudDogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+IHwgbnVsbCA9IG51bGxcblx0KSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHJvb3RDb2x1bW5NYXApIHtcblx0XHRcdGNvbnN0IGNvbHVtbk1hcEVudHJ5ID0gcm9vdENvbHVtbk1hcFtjb2x1bW5JZF07XG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gdGhpcy5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihjb2x1bW5NYXBFbnRyeS5hcGlDb2x1bW4sIHBhcmVudCk7XG5cdFx0XHRjb25zdCBjaGlsZENvbHVtbnMgPSB0aGlzLmNvbnN0cnVjdEZyb21Sb290TWFwPEl0ZW1UeXBlVHlwZT4oY29sdW1uTWFwRW50cnkuY2hpbGRyZW4sIGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA+IDApXG5cdFx0XHRcdGNvbHVtbkluZm8uc2V0Q2hpbGRyZW4oY29sdW1uSW5mby5hcGlDb2x1bW4uaXRlbVR5cGUsIGNoaWxkQ29sdW1ucyk7XG5cblx0XHRcdHJlc3VsdC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkhhbmRsZXIsIENvbHVtbkluZm8sIENvbHVtblNldCwgQ29sdW1uVXRpbCwgaGFzUHJvcGVydGllcyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mb0ZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0Um9vdENvbHVtbk1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uU2V0RmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgY29sdW1uSW5mb0ZhY3Rvcnk6IENvbHVtbkluZm9GYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdFN0dWI8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGNvbHVtblNldCA9IG5ldyBDb2x1bW5TZXQoXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdGNvbHVtblNldC5yZXF1ZXN0ID0gcmVxdWVzdENvbHVtbnM7XG5cdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IHJlcXVlc3RDb2x1bW5zID09PSB0cnVlO1xuXG5cdFx0cmV0dXJuIGNvbHVtblNldDtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlU3R1YjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuID0gdHJ1ZSxcblx0XHRpbmNsdWRlSWRDb2x1bW46IGJvb2xlYW4gPSB0cnVlLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUgP1xuXHRcdFx0dGhpcy5wcm9jZXNzUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdCkgOlxuXHRcdFx0dGhpcy5wcm9jZXNzUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtblNldCxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0XHRpbmNsdWRlSWRDb2x1bW4sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nPzogYm9vbGVhbixcblx0XHRpbmNsdWRlSWRDb2x1bW4/OiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMucmVzb2x2ZVN0dWIoXG5cdFx0XHR0aGlzLmNvbnN0cnVjdFN0dWIoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCksXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0aW5jbHVkZUlkQ29sdW1uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0RnJvbVJlc3BvbnNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuID0gdHJ1ZSxcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGNvbHVtblNldCA9IG5ldyBDb2x1bW5TZXQoXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NSZXNwb25zZUNvbHVtbnMgKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sdW1uU2V0Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAgPSB7fTtcblx0XHRjb25zdCBwcm9jZXNzZWRJdGVtVHlwZU1hcDogSXRlbVR5cGVNYXA8Ym9vbGVhbj4gPSB7fTtcblxuXHRcdGNvbHVtblNldC5yZXNwb25zZSA9IHJlc3BvbnNlQ29sdW1ucztcblxuXHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcEZyb21SZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXAsXG5cdFx0KTtcblxuXHRcdHRoaXMucHJvY2Vzc0NvbHVtbkluZm8oXG5cdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHR0aGlzLmNvbHVtbkluZm9GYWN0b3J5LmNvbnN0cnVjdEZyb21Sb290TWFwKHJvb3RDb2x1bW5NYXApLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdGNvbHVtblNldC5yZXF1ZXN0ID0gdGhpcy5jb25zdHJ1Y3RSZXF1ZXN0Q29sdW1uc0Zyb21Sb290Q29sdW1uTWFwKHJvb3RDb2x1bW5NYXApO1xuXG5cdFx0cmV0dXJuIGNvbHVtblNldDtcblx0fVxuXG5cdHByaXZhdGUgY29uc3RydWN0UmVxdWVzdENvbHVtbnNGcm9tUm9vdENvbHVtbk1hcCAoXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0KTogQXBpUmVxdWVzdENvbHVtbltdIHtcblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByb290Q29sdW1uTWFwKSB7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoaGFzUHJvcGVydGllcyhlbnRyeS5jaGlsZHJlbikpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goe1xuXHRcdFx0XHRcdFtjb2x1bW5JZF06IHRoaXMuY29uc3RydWN0UmVxdWVzdENvbHVtbnNGcm9tUm9vdENvbHVtbk1hcChlbnRyeS5jaGlsZHJlbiksXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goY29sdW1uSWQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0XHRwcm9jZXNzZWRJdGVtVHlwZU1hcDogSXRlbVR5cGVNYXA8Ym9vbGVhbj4sXG5cdCkge1xuXHRcdGlmIChwcm9jZXNzZWRJdGVtVHlwZU1hcFtpdGVtVHlwZV0gPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRwcm9jZXNzZWRJdGVtVHlwZU1hcFtpdGVtVHlwZV0gPSB0cnVlO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdKSB7XG5cdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVuYWJsZUNhY2hpbmcpIHtcblx0XHRcdFx0dGhpcy5jb2x1bW5IYW5kbGVyLnNldENvbHVtbihcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPSB7XG5cdFx0XHRcdFx0YXBpQ29sdW1uOiByZXNwb25zZUNvbHVtbixcblx0XHRcdFx0XHRjaGlsZHJlbjoge30sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMuY29sdW1uVXRpbC5pc0l0ZW1Db2x1bW4oXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSByZXNwb25zZUNvbHVtbnNbcmVzcG9uc2VDb2x1bW4uaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNoaWxkcmVuID09PSB1bmRlZmluZWRcblx0XHRcdFx0fHwgIWhhc1Byb3BlcnRpZXMoY2hpbGRyZW4pXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcEZyb21SZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0XHRwcm9jZXNzZWRJdGVtVHlwZU1hcCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgcmVxdWVzdGNvbHVtbnMgZG9lcyAqbm90KiBlcXVhbCAndHJ1ZScsIGFuZCBtaWdodCBjb250YWluIGRlcml2ZWQgY29sdW1uc1xuXHRwcml2YXRlIHByb2Nlc3NSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Y29sdW1uU2V0OiBDb2x1bW5TZXQsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4sXG5cdFx0aW5jbHVkZUlkQ29sdW1uOiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sdW1uU2V0Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAgPSB7fTtcblxuXHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdGNvbHVtblNldC5yZXF1ZXN0IGFzIEFwaVJlcXVlc3RDb2x1bW5bXSwgLy8gd2UgY2FuIGFzc3VtZSByZXF1ZXN0Q29sdW1ucyBpcyBhbiBhcnJheSBoZXJlXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAoaW5jbHVkZUlkQ29sdW1uKSB7XG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdFsnaWQnXSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0cm9vdENvbHVtbk1hcCxcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29sdW1uU2V0LnJlc3BvbnNlID0ge307XG5cblx0XHR0aGlzLnByb2Nlc3NDb2x1bW5JbmZvKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeS5jb25zdHJ1Y3RGcm9tUm9vdE1hcChyb290Q29sdW1uTWFwKSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gY29sdW1uU2V0O1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzQ29sdW1uSW5mbyAoXG5cdFx0Y29sdW1uU2V0OiBDb2x1bW5TZXQsXG5cdFx0Y29sdW1uSW5mb09iamVjdHM6IENvbHVtbkluZm9bXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gY29sdW1uU2V0LnJlc3BvbnNlO1xuXG5cdFx0aWYgKHJlc3BvbnNlW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXNwb25zZVtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbkluZm8gb2YgY29sdW1uSW5mb09iamVjdHMpIHtcblx0XHRcdHJlc3BvbnNlW2l0ZW1UeXBlXVtjb2x1bW5JbmZvLmlkXSA9IGNvbHVtbkluZm8uYXBpQ29sdW1uO1xuXHRcdFx0Y29sdW1uU2V0Lmdyb3VwQ29sdW1uSW5mbyhjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKCFjb2x1bW5JbmZvLmlzTGVhZikge1xuXHRcdFx0XHR0aGlzLnByb2Nlc3NDb2x1bW5JbmZvKFxuXHRcdFx0XHRcdGNvbHVtblNldCxcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmNoaWxkcmVuLFxuXHRcdFx0XHRcdGNvbHVtbkluZm8uaXRlbVR5cGUsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwIChcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHJlcXVlc3RDb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHtpZDogY29sdW1uSWQsIGNoaWxkcmVufSA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cblx0XHRcdGxldCByZXNwb25zZUNvbHVtbjtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXNwb25zZUNvbHVtbiA9IHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV1bY29sdW1uSWRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0J05vIGFwaSBjb2x1bW4gZm9yIHJlcXVlc3QgY29sdW1uJyxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0XHQnZm9yIGl0ZW1UeXBlJyxcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVuYWJsZUNhY2hpbmcpIHtcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4gPSB0aGlzLmNvbHVtbkhhbmRsZXIuc2V0Q29sdW1uKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyb290Q29sdW1uTWFwW2NvbHVtbklkXSA9IHtcblx0XHRcdFx0XHRhcGlDb2x1bW46IHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHRcdGNoaWxkcmVuOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRjaGlsZHJlbixcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0uY2hpbGRyZW4sXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU3Vic2V0Q2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtblN1YnNldENhY2hlRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yICgpIHt9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+KHJlcXVlc3RDb2x1bW5zKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBDcmVhdGVDb21waWxhdGlvbiwgQ3JlYXRlUmVxdWVzdCwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlcXVlc3RGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdCkge1xuXG5cdH1cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb21waWxhdGlvbjogQ3JlYXRlQ29tcGlsYXRpb24sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWt1cEJ5UGFyZW50PzogYm9vbGVhbixcblx0KTogQ3JlYXRlUmVxdWVzdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENyZWF0ZVJlcXVlc3QoXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdHRoaXMua2V5U2VydmljZSxcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb21waWxhdGlvbixcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0YnJlYWt1cEJ5UGFyZW50LFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1DYWNoZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCk6IEl0ZW1DYWNoZSB7XG5cdFx0cmV0dXJuIG5ldyBJdGVtQ2FjaGUoXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cdFxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBDb2x1bW5TZXQsIEl0ZW1FbnRyeVNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUVudHJ5RmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwdWJsaWMgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwdWJsaWMga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwdWJsaWMgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5JbmZvOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcblx0KTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgSXRlbUVudHJ5KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbHVtbkluZm8uaXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRjb2x1bW5JbmZvLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1SZXNvdXJjZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHVibGljIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0aXNOZXc6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0aXNOZXcsXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBTZXJ2ZXJDYWNoZSwgVHJhbnNhY3Rpb25DYWNoZSwgVHJhbnNhY3Rpb25WYWxpZGF0b3JGYWN0b3J5IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBSbUNvcmUgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlRGVwZW5kZW5jeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25DYWNoZUZhY3Rvcnkge1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGRlcGVuZGVuY2llczogU2VydmVyQ2FjaGVEZXBlbmRlbmN5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgY29yZTogUm1Db3JlLFxuXHQpIHtcblx0XHR0aGlzLnNlcnZlckNhY2hlID0gbmV3IFNlcnZlckNhY2hlKFxuXHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMsXG5cdFx0XHR0aGlzLmNvcmUsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUb2RvW2NhY2hlXSBTdG9yZSBhIG1hcCBvZiBhbGwgdHJhbnNhY3Rpb25zIGJ5IHRyYW5zYWN0aW9uIGlkID9cblx0ICovXG5cdHB1YmxpYyBnZXRCeUlkIChpZDogc3RyaW5nKTogVHJhbnNhY3Rpb25DYWNoZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgZmluZENoaWxkID0gKGNoaWxkcmVuOiBUcmFuc2FjdGlvbkNhY2hlW10pID0+IHtcblx0XHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgY2hpbGRyZW4pIHtcblx0XHRcdFx0aWYgKHRyYW5zYWN0aW9uLmlkID09PSBpZCkge1xuXHRcdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZENoaWxkKHRyYW5zYWN0aW9uLmNoaWxkcmVuKTtcblxuXHRcdFx0XHRpZiAoY2hpbGRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBjaGlsZFJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gZmluZENoaWxkKHRoaXMuc2VydmVyQ2FjaGUuY2hpbGRyZW4pO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0aWQ/OiBzdHJpbmcsXG5cdFx0dmFsaWRhdG9yRmFjdG9yeT86IFRyYW5zYWN0aW9uVmFsaWRhdG9yRmFjdG9yeSxcblx0KTogVHJhbnNhY3Rpb25DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuY3JlYXRlQ2hpbGQoXG5cdFx0XHRpZCxcblx0XHRcdHZhbGlkYXRvckZhY3RvcnksXG5cdFx0KTtcblx0fVxuXG5cdC8qQGludGVybmFsKi9cblx0cHVibGljIGdldFNlcnZlckNhY2hlICgpOiBTZXJ2ZXJDYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGU7XG5cdH1cbn1cbiIsImltcG9ydCB7IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24ge1xuXHRcdHJldHVybiBuZXcgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uKHRyYW5zYWN0aW9uKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBRdWVyeU1hdGNoZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlNYXRjaGVyRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyXG5cdCkge1xuXG5cdH1cblxuXHRjb25zdHJ1Y3QgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgZmllbGRzOiBGaWVsZE1hcCwgcGFyZW50OiBFbnRyeVBhcmVudE51bGwpOiBRdWVyeU1hdGNoZXIge1xuXHRcdHJldHVybiBuZXcgUXVlcnlNYXRjaGVyKFxuXHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGZpZWxkcyxcblx0XHRcdHBhcmVudFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5UGFyc2VyIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlRdWVyeSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UGFyc2VyRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0fVxuXG5cdGNvbnN0cnVjdCAocXVlcnk6IEFwaVF1ZXJ5LCBwYXJhbWV0ZXJzPzogYW55KTogUXVlcnlQYXJzZXIge1xuXHRcdHJldHVybiBuZXcgUXVlcnlQYXJzZXIocXVlcnksIHBhcmFtZXRlcnMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5VdGlsLCBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3QgKCk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24ge1xuXHRcdHJldHVybiBuZXcgUmVxdWVzdENvbHVtbkV4cGFuc2lvbihcblx0XHRcdHRoaXMuY29sdW1uVXRpbFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbk1hcCwgQXBpUmVzcG9uc2UsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHB1YmxpYyBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGFkZGl0aW9uYWxSZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCxcblx0XHRhZGRpdGlvbmFsUmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZSxcblx0XHRcdGFkZGl0aW9uYWxSZXF1ZXN0Q29sdW1ucyxcblx0XHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblx0fVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkluZm9GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uU2V0RmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3RGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vUXVlcnlNYXRjaGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5UGFyc2VyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVGVtcGxhdGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5JztcbiIsImV4cG9ydCAqIGZyb20gJy4vSXRlbVR5cGVzQ29sbGVjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL1Byb21pc2VJbnRlcmZhY2UnO1xuIiwiaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksIFRlbXBsYXRlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudE51bGwsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3IgfSBmcm9tICcuL0FwaVJlc3BvbnNlUHJvY2Vzc29yJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuL0NvbHVtbkhhbmRsZXInO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQ2FjaGUge1xuXG5cdHByaXZhdGUgcGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwOiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRbbG9jYWxJdGVtSWQ6IHN0cmluZ106IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+XG5cdFx0fVxuXHR9ID0ge307XG5cblx0cHVibGljIHRlbXBsYXRlczoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXTogVGVtcGxhdGU8YW55PlxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJpdmF0ZSB0ZW1wbGF0ZUZhY3Rvcnk6IFRlbXBsYXRlRmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHQpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEge0BsaW5rIFRlbXBsYXRlIHRlbXBsYXRlfSwge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuY3JlYXRlSXRlbXMgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5jcmVhdGVJdGVtc30gaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgdGhpc1xuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbVR5cGUgVGhlIHtAbGluayBJdGVtVHlwZSBJdGVtVHlwZX0gb2YgdGhlIHRlbXBsYXRlIGl0ZW1cblx0ICogQHBhcmFtIGl0ZW1JZCBVc2VkIGZvciBjYWNoaW5nLCBtdWx0aXBsZSBjb25jdXJyZW50IHRlbXBsYXRlIGNhbGxzIGZvciB0aGUgc2FtZSBpdGVtSWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgdGVtcGxhdGVcblx0ICogQHBhcmFtIHRlbXBsYXRlT3B0aW9uc1xuXHQgKiBAcGFyYW0gdGVtcGxhdGVDb2x1bW5zIEFkZGl0aW9uYWwgY29sdW1ucyB0byBiZSBmZXRjaGVkLCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgdGVtcGxhdGUgLSB3YXJuaW5nIC0gdGhlIFRlbXBsYXRlIHdvbid0IGhhdmUgdmFsdWVzIGZvciB0aG9zZSBjb2x1bW5zXG5cdCAqIEBwYXJhbSBlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUgQW4gb3B0aW9uYWwge0BsaW5rIEVudHJ5UGFyZW50TnVsbCBlbnRyeSBwYXJlbnR9IG9yIHtAbGluayBJdGVtVHlwZSBwYXJlbnQgaXRlbVR5cGV9LCBpZiB0aGUgcGFyZW50IGlzIHBhc3NlZCB0aGUgdGVtcGxhdGVDb2x1bW5zIHdpbGwgYmUgZXhwYW5kZWQgd2l0aCB0aGUgcHJvcGVyIGxpbmsgY29sdW1ucyAoVGhyb3VnaCB7QGxpbmsgQ29sdW1uVXRpbC5nZXRDb2x1bW5zRnJvbUxpbmsgQ29sdW1uVXRpbC5nZXRDb2x1bW5zRnJvbUxpbmt9KVxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGBcblx0ICogIGNvbnN0IHBhcmVudDogRW50cnlQYXJlbnQgPSB7XG5cdCAqICAgICAgaXRlbVR5cGU6ICdGdW5jdGllJyxcblx0ICogICAgICBpdGVtSWQ6IDEwLFxuXHQgKiAgfTtcblx0ICpcblx0ICogIHJldHVybiBjb3JlLnRlbXBsYXRlQ2FjaGVcblx0ICogICAgICAuZmV0Y2hUZW1wbGF0ZShcblx0ICogICAgICAgICAgJ1BsYW5uaW5ncGVyc29uZWVsJyxcblx0ICogICAgICAgICAgdW5kZWZpbmVkLFxuXHQgKiAgICAgICAgICB7fSxcblx0ICogICAgICAgICAge30sXG5cdCAqICAgICAgICAgIHBhcmVudCxcblx0ICogICAgICApXG5cdCAqICAgICAgLnRoZW4oXG5cdCAqICAgICAgICAgICh0ZW1wbGF0ZTogVGVtcGxhdGU8J1BsYW5uaW5ncGVyc29uZWVsJz4pID0+IHtcblx0ICogICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRyYW5zYWN0aW9uLmNyZWF0ZUNoYW5nZXNEZWx0YSgpO1xuXHQgKlxuXHQgKiAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2Ygc2VsZWN0ZWRJdGVtcykge1xuXHQgKiAgICAgICAgICAgICAgICAgIGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0ICogICAgICAgICAgICAgICAgICAgICAgY29yZS5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKSxcblx0ICogICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuZmllbGRzLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5jb2x1bW5zLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsXG5cdCAqICAgICAgICAgICAgICAgICAgKTtcblx0ICogICAgICAgICAgICAgIH1cblx0ICpcblx0ICogICAgICAgICAgICAgIHRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdCAqICAgICAgICAgICk7XG5cdCAqICBgYGBcblx0ICovXG5cdHB1YmxpYyBmZXRjaFRlbXBsYXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ/OiBJdGVtSWQsXG5cdFx0dGVtcGxhdGVPcHRpb25zOiBhbnkgPSB7fSxcblx0XHR0ZW1wbGF0ZUNvbHVtbnM6IGFueSA9IHt9LFxuXHRcdGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZTogRW50cnlQYXJlbnROdWxsIHwgSXRlbVR5cGUgPSBudWxsLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBoYXNUZW1wbGF0ZU9wdGlvbnMgPSBoYXNQcm9wZXJ0aWVzKHRlbXBsYXRlT3B0aW9ucyk7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRpZiAodGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRbXG5cdFx0XHRcdHtjcmVhdG9yOiBbJ2Rpc3BsYXluYW1lJ119LFxuXHRcdFx0XHQnY3JlYXRlZCcsXG5cdFx0XHRcdCdwZXJtaXNzaW9ucycsXG5cdFx0XHRdLFxuXHRcdCk7XG5cblx0XHRpZiAoZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlICE9PSBudWxsKSB7XG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMuY29sdW1uVXRpbC5nZXRDb2x1bW5zRnJvbUxpbmsoXG5cdFx0XHRcdFx0KHR5cGVvZiBlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUgPT09ICdzdHJpbmcnKVxuXHRcdFx0XHRcdFx0PyBlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGVcblx0XHRcdFx0XHRcdDogZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlLml0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdID0gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cblx0XHRpZiAoIWhhc1RlbXBsYXRlT3B0aW9ucykge1xuXHRcdFx0Y29uc3QgY2FjaGVkVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlc1tpdGVtVHlwZV07XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Y2FjaGVkVGVtcGxhdGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQmJiAoXG5cdFx0XHRcdFx0aXRlbVR5cGUgPT09IG51bGxcblx0XHRcdFx0XHR8fCB0aGlzLmNvbHVtblV0aWwucmVzcG9uc2VDb2x1bW5zQXZhaWxhYmxlKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0Y2FjaGVkVGVtcGxhdGUucmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY2FjaGVkVGVtcGxhdGUgYXMgVGVtcGxhdGU8SXRlbVR5cGVUeXBlPik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZW1wbGF0ZTogdGhpcy5mZXRjaFRlbXBsYXRlQnlJZChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0dGVtcGxhdGVPcHRpb25zLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0YWRkaXRpb25hbENvbHVtbnM6IHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0PyB7fVxuXHRcdFx0XHRcdFx0OiB0aGlzLmNvbHVtbkhhbmRsZXIuZmV0Y2goXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNvbHZlZCA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdGVtcGxhdGVSZXNwb25zZSA9IHJlc29sdmVkLnRlbXBsYXRlO1xuXG5cdFx0XHRcdFx0Y29uc3QgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlUmVzcG9uc2UsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHRyZXNvbHZlZC5hZGRpdGlvbmFsQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKCFoYXNUZW1wbGF0ZU9wdGlvbnMgJiYgdGVtcGxhdGVSZXNwb25zZS5jYWNoZWFibGUpIHtcblx0XHRcdFx0XHRcdHRoaXMudGVtcGxhdGVzW2l0ZW1UeXBlXSA9IHRlbXBsYXRlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0ZW1wbGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZmV0Y2hUZW1wbGF0ZUJ5SWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyA9ICduby1pZCcsXG5cdFx0dGVtcGxhdGVPcHRpb25zPzogYW55LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWRcblx0XHRcdHx8IHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID09PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdFRlbXBsYXRlQnVmZmVyKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgY29uc3RydWN0VGVtcGxhdGVCdWZmZXIgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyxcblx0XHR0ZW1wbGF0ZU9wdGlvbnM/OiBhbnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRpZiAodGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV1baXRlbUlkXSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC50ZW1wbGF0ZShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHtcblx0QXBpRm9ybWF0dGVyLFxuXHRBcGlSZXF1ZXN0U2VydmljZSxcblx0Q29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0Q29sbGVjdGlvblJlc291cmNlU2VydmljZSxcblx0Q29sdW1uQ2FjaGUsXG5cdENvbHVtbkhhbmRsZXIsXG5cdENvbHVtblV0aWwsXG5cdENvbnZlcnNpb25NYXBTZXJ2aWNlLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRLZXlTZXJ2aWNlLFxuXHRMb2NrU2VydmljZSxcblx0UXVlcnlTZXJ2aWNlLFxuXHRTb2NrZXRNZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9jbGFzc2VzJztcbmltcG9ydCB7IEl0ZW1DcmVhdGVTZXJ2aWNlIH0gZnJvbSAnLi9jbGFzc2VzL0l0ZW1DcmVhdGVTZXJ2aWNlJztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuL2NsYXNzZXMvVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQge1xuXHRBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnksXG5cdENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uSW5mb0ZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0Q3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFRlbXBsYXRlRmFjdG9yeSxcblx0VHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG59IGZyb20gJy4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi9mYWN0b3JpZXMvQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UsXG5cdEF1dGhJbnRlcmZhY2UsXG5cdEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0RXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0UHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFJtQ29yZSB7XG5cdHZlcnNpb246IHN0cmluZyA9ICc0LjAuMSc7XG5cdG5vb3AgPSBub29wO1xuXG5cdGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyO1xuXHRhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2U7XG5cdGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTogQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5O1xuXHRjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5O1xuXHRjaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeTogQ2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2U7XG5cdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5O1xuXHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5O1xuXHRjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlOiBDb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlO1xuXHRjb2x1bW5DYWNoZTogQ29sdW1uQ2FjaGU7XG5cdGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk7XG5cdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXI7XG5cdGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeTtcblx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeTtcblx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk7XG5cdGNvbHVtblV0aWw6IENvbHVtblV0aWw7XG5cdGNvbnZlcnNpb25NYXBTZXJ2aWNlOiBDb252ZXJzaW9uTWFwU2VydmljZTtcblx0Y3JlYXRlUmVxdWVzdEZhY3Rvcnk6IENyZWF0ZVJlcXVlc3RGYWN0b3J5O1xuXHRpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5O1xuXHRpdGVtQ3JlYXRlU2VydmljZTogSXRlbUNyZWF0ZVNlcnZpY2U7XG5cdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3Rvcnk7XG5cdGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2U7XG5cdGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3Rvcnk7XG5cdGtleVNlcnZpY2U6IEtleVNlcnZpY2U7XG5cdGxvY2tTZXJ2aWNlOiBMb2NrU2VydmljZTtcblx0bW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0cXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeTtcblx0cXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3Rvcnk7XG5cdHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlO1xuXHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk7XG5cdHNvY2tldE1lc3NhZ2VIYW5kbGVyOiBTb2NrZXRNZXNzYWdlSGFuZGxlcjtcblx0dGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZTtcblx0dGVtcGxhdGVGYWN0b3J5OiBUZW1wbGF0ZUZhY3Rvcnk7XG5cdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5OiBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0X2FwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0XHQvLyBDcmVhdGUgdmFyaWFibGVzIGZvciBlYWNoIHNlcnZpY2UgaW4gb3JkZXIgdG8gZ2V0IGEgVHlwZVNjcmlwdCBlcnJvciB3aGVuIGEgZGVwZW5kZW5jeSBoYXNuJ3QgYmVlblxuXHRcdC8vIGluaXRpYWxpemVkIHlldC5cblx0XHRjb25zdCBrZXlTZXJ2aWNlID0gbmV3IEtleVNlcnZpY2UoKTtcblx0XHRjb25zdCBhcGlGb3JtYXR0ZXIgPSBuZXcgQXBpRm9ybWF0dGVyKCk7XG5cdFx0Y29uc3QgcXVlcnlNYXRjaGVyRmFjdG9yeSA9IG5ldyBRdWVyeU1hdGNoZXJGYWN0b3J5KGFwaUZvcm1hdHRlcik7XG5cdFx0Y29uc3QgcXVlcnlQYXJzZXJGYWN0b3J5ID0gbmV3IFF1ZXJ5UGFyc2VyRmFjdG9yeSgpO1xuXHRcdGNvbnN0IHF1ZXJ5U2VydmljZSA9IG5ldyBRdWVyeVNlcnZpY2UoKTtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGNvbHVtblV0aWwgPSBuZXcgQ29sdW1uVXRpbChcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeShxdWVyeU1hdGNoZXJGYWN0b3J5KTtcblx0XHRjb25zdCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSA9IG5ldyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeShjb2x1bW5VdGlsKTtcblxuXHRcdGNvbnN0IGl0ZW1FbnRyeVNlcnZpY2UgPSBuZXcgSXRlbUVudHJ5U2VydmljZShcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkoYXBpRm9ybWF0dGVyKTtcblx0XHRjb25zdCBhcGlSZXF1ZXN0U2VydmljZSA9IG5ldyBBcGlSZXF1ZXN0U2VydmljZShcblx0XHRcdF9hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sdW1uQ2FjaGUgPSBuZXcgQ29sdW1uQ2FjaGUoY29sdW1uVXRpbCk7XG5cdFx0Y29uc3QgY29sdW1uSGFuZGxlciA9IG5ldyBDb2x1bW5IYW5kbGVyKFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGNvbHVtbkNhY2hlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHQpO1xuXHRcdGNvbnN0IGNvbHVtbkluZm9GYWN0b3J5ID0gbmV3IENvbHVtbkluZm9GYWN0b3J5KCk7XG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uRmFjdG9yeSA9IG5ldyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5KGNvbHVtbkluZm9GYWN0b3J5KTtcblxuXHRcdGNvbnN0IGNvbHVtblNldEZhY3RvcnkgPSBuZXcgQ29sdW1uU2V0RmFjdG9yeShcblx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0Y29sdW1uSW5mb0ZhY3RvcnksXG5cdFx0KTtcblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkgPSBuZXcgQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5KCk7XG5cblx0XHRjb25zdCBsb2NrU2VydmljZSA9IG5ldyBMb2NrU2VydmljZShcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdCk7XG5cdFx0Y29uc3QgdGVtcGxhdGVGYWN0b3J5ID0gbmV3IFRlbXBsYXRlRmFjdG9yeShcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdCk7XG5cdFx0Y29uc3QgaXRlbUNhY2hlRmFjdG9yeSA9IG5ldyBJdGVtQ2FjaGVGYWN0b3J5KHF1ZXJ5TWF0Y2hlckZhY3RvcnkpO1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZUZhY3RvcnkgPSBuZXcgSXRlbVJlc291cmNlRmFjdG9yeShcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHRlbXBsYXRlQ2FjaGUgPSBuZXcgVGVtcGxhdGVDYWNoZShcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHR0ZW1wbGF0ZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb252ZXJzaW9uTWFwU2VydmljZSA9IG5ldyBDb252ZXJzaW9uTWFwU2VydmljZShcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGl0ZW1DcmVhdGVTZXJ2aWNlID0gbmV3IEl0ZW1DcmVhdGVTZXJ2aWNlKFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbnZlcnNpb25NYXBTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0dGVtcGxhdGVDYWNoZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhRmFjdG9yeSA9IG5ldyBDaGFuZ2VzRGVsdGFGYWN0b3J5KFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGl0ZW1DcmVhdGVTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXF1ZXN0QnVmZmVyTWFuYWdlciA9IG5ldyBSZXF1ZXN0QnVmZmVyTWFuYWdlcihcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGl0ZW1FbnRyeUZhY3RvcnkgPSBuZXcgSXRlbUVudHJ5RmFjdG9yeShcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IG5ldyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlKFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnlGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25FbnRyeUZhY3RvcnkoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25DYWNoZUZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvbkNhY2hlRmFjdG9yeShcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNyZWF0ZVJlcXVlc3RGYWN0b3J5ID0gbmV3IENyZWF0ZVJlcXVlc3RGYWN0b3J5KFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbmV3IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkoKTtcblxuXHRcdGNvbnN0IGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5ID0gbmV3IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5KFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0Y2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgbW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSA9IG5ldyBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5KCk7XG5cblx0XHRjb25zdCB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeShcblx0XHRcdHtcblx0XHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdFx0YXV0aEludGVyZmFjZSxcblx0XHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdFx0Y2hhbmdlc1Byb2Nlc3NvckZhY3RvcnksXG5cdFx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdFx0Y29udmVyc2lvbk1hcFNlcnZpY2UsXG5cdFx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdFx0aXRlbUNyZWF0ZVNlcnZpY2UsXG5cdFx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHRcdHByb21pc2VTZXJ2aWNlOiBwcm9taXNlTGlicmFyeSxcblx0XHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0XHRxdWVyeVNlcnZpY2UsXG5cdFx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdFx0dGVtcGxhdGVDYWNoZSxcblx0XHRcdH0sXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlci5zZXRTZXJ2ZXJDYWNoZShcblx0XHRcdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHNvY2tldE1lc3NhZ2VIYW5kbGVyID0gbmV3IFNvY2tldE1lc3NhZ2VIYW5kbGVyKFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0dHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBpRm9ybWF0dGVyID0gYXBpRm9ybWF0dGVyO1xuXHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UgPSBhcGlSZXF1ZXN0U2VydmljZTtcblx0XHR0aGlzLmFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSA9IGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTtcblx0XHR0aGlzLmNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgPSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRcdHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeSA9IGNoYW5nZXNEZWx0YUZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSA9IGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvbkNhY2hlRmFjdG9yeSA9IGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlGYWN0b3J5ID0gY29sbGVjdGlvbkVudHJ5RmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UgPSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlO1xuXHRcdHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5ID0gY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSA9IGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlID0gY29sbGVjdGlvblJlc291cmNlU2VydmljZTtcblx0XHR0aGlzLmNvbHVtbkNhY2hlID0gY29sdW1uQ2FjaGU7XG5cdFx0dGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gY29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0XHR0aGlzLmNvbHVtbkhhbmRsZXIgPSBjb2x1bW5IYW5kbGVyO1xuXHRcdHRoaXMuY29sdW1uSW5mb0ZhY3RvcnkgPSBjb2x1bW5JbmZvRmFjdG9yeTtcblx0XHR0aGlzLmNvbHVtblNldEZhY3RvcnkgPSBjb2x1bW5TZXRGYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5ID0gY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uVXRpbCA9IGNvbHVtblV0aWw7XG5cdFx0dGhpcy5jb252ZXJzaW9uTWFwU2VydmljZSA9IGNvbnZlcnNpb25NYXBTZXJ2aWNlO1xuXHRcdHRoaXMuY3JlYXRlUmVxdWVzdEZhY3RvcnkgPSBjcmVhdGVSZXF1ZXN0RmFjdG9yeTtcblx0XHR0aGlzLml0ZW1DYWNoZUZhY3RvcnkgPSBpdGVtQ2FjaGVGYWN0b3J5O1xuXHRcdHRoaXMuaXRlbUNyZWF0ZVNlcnZpY2UgPSBpdGVtQ3JlYXRlU2VydmljZTtcblx0XHR0aGlzLml0ZW1FbnRyeUZhY3RvcnkgPSBpdGVtRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSA9IGl0ZW1FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5ID0gaXRlbVJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmtleVNlcnZpY2UgPSBrZXlTZXJ2aWNlO1xuXHRcdHRoaXMubG9ja1NlcnZpY2UgPSBsb2NrU2VydmljZTtcblx0XHR0aGlzLm1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgPSBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSA9IHF1ZXJ5TWF0Y2hlckZhY3Rvcnk7XG5cdFx0dGhpcy5xdWVyeVBhcnNlckZhY3RvcnkgPSBxdWVyeVBhcnNlckZhY3Rvcnk7XG5cdFx0dGhpcy5xdWVyeVNlcnZpY2UgPSBxdWVyeVNlcnZpY2U7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSA9IHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRcdHRoaXMuc29ja2V0TWVzc2FnZUhhbmRsZXIgPSBzb2NrZXRNZXNzYWdlSGFuZGxlcjtcblx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUgPSB0ZW1wbGF0ZUNhY2hlO1xuXHRcdHRoaXMudGVtcGxhdGVGYWN0b3J5ID0gdGVtcGxhdGVGYWN0b3J5O1xuXHRcdHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgPSB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCAoKSB7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eSAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlO1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9jb3JlJztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2NsYXNzZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWN0b3JpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29sdW1uRXhwYW5zaW9uUmVzdWx0LCBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgQ2hhbmdlc0RlbHRhUmVzdWx0ID0ge1xuXHRyb2xsYmFjazogKCkgPT4gdm9pZCxcblx0Y3JlYXRlZDogSXRlbUVudHJ5W11cblx0Ly8gdG9kb1tjYWNoZV0gb3RoZXIgc3RhdHVzZXNcbn07XG5cbi8qKlxuICogQHJlbWFya1xuICogV2UgZXhwbGljaXRseSBrZWVwIHRyYWNrIG9mIHRoZSBuZXcgcGFyZW50LCBzbyB3ZSBjYW4gc2V0IGFuIGl0ZW0gdG8gbW92ZWQgaWYgaXQgaXNuJ3QgbnVsbCAoTmVlZGVkIGZvciBsaW5rVG8gcmVxdWVzdClcbiAqL1xuZXhwb3J0IHR5cGUgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0ZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRjaGFuZ2VzOiB7XG5cdFx0ZXhwYW5kZWRDb2x1bW5zOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGwsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtRGVsZXRlRGVsdGEgPSBJdGVtRW50cnlbXTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyB1cGRhdGVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGFcblx0fSA9IHt9O1xuXG5cdHB1YmxpYyBkZWxldGVkOiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBDaGFuZ2VzRGVsdGFJdGVtRGVsZXRlRGVsdGFcblx0fSA9IHt9O1xuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHVibGljIF9xdWVyeVJlc3VsdHM6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFtxdWVyeVN0cmluZzogc3RyaW5nXTogSXRlbUlkW11cblx0XHR9XG5cdH0gPSB7fTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIGEgaGludCBmb3IgdGhlIHtAbGluayBDb2xsZWN0aW9uTWF0Y2hlckJhc2UgQ29sbGVjdGlvbk1hdGNoZXJCYXNlXSB0byB0aGUgQ2hhbmdlc0RlbHRhLCB3aGVuIHRoZSBDb2xsZWN0aW9uTWF0Y2hlciBlbmNvdW50ZXJzIGEgY29sbGVjdGlvblxuXHQgKiB3aXRoIHRoZSBleGFjdCBxdWVyeSwgaXQgd2lsbCB1c2UgdGhlIGhpbnQgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSBtYXRjaGVyXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgX3NldFF1ZXJ5UmVzdWx0IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnlTdHJpbmc6IHN0cmluZyxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX3F1ZXJ5UmVzdWx0c1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fcXVlcnlSZXN1bHRzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuX3F1ZXJ5UmVzdWx0c1tpdGVtVHlwZV1bcXVlcnlTdHJpbmddID0gaXRlbUlkcztcblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtVXBkYXRlZDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0XHRjb2x1bW5FeHBhbnNpb25SZXN1bHQ6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB8IG51bGwgPSBudWxsLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMudXBkYXRlZFtlbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy51cGRhdGVkW2VudHJ5LmlkXSA9IHtcblx0XHRcdFx0ZW50cnk6IGVudHJ5LFxuXHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0ZmllbGRzOiB7fSxcblx0XHRcdFx0XHRleHBhbmRlZENvbHVtbnM6IG51bGwsXG5cdFx0XHRcdFx0cGFyZW50OiBwYXJlbnQsXG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXNFbnRyeSA9IHRoaXMudXBkYXRlZFtlbnRyeS5pZF07XG5cblx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBwYXJlbnRGaWVsZHMgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBmaWVsZCBpbiBmaWVsZHMpIHtcblx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdGZpZWxkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGRlc2MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0Y2hhbmdlc0VudHJ5LmNoYW5nZXMuZmllbGRzLFxuXHRcdFx0XHRcdGZpZWxkLFxuXHRcdFx0XHRcdGRlc2MsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5maWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY29sdW1uRXhwYW5zaW9uUmVzdWx0ICE9PSBudWxsKSB7XG5cdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgPSBjb2x1bW5FeHBhbnNpb25SZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEl0ZW1EZWxldGVkIChcblx0XHRkZWxldGVkOiBJdGVtRW50cnksXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0SXRlbXNEZWxldGVkKFxuXHRcdFx0W2RlbGV0ZWRdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbXNEZWxldGVkIChcblx0XHRkZWxldGVkOiBJdGVtRW50cnlbXSxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZGVsZXRlZCkge1xuXHRcdFx0aWYgKHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5kZWxldGVkW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IGRvIHdlIHJlYWxseSBoYXZlIHRvIGNoZWNrIHRoaXMgPyBkZWxldGluZyBtdWx0aXBsZSB0aW1lcyBkb2Vzbid0IG1hdHRlclxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IHRoaXMgY291bGQgYWxzbyBiZSBhIG1hcCBvZiBlbnRyeUlkIC0+IGl0ZW1FbnRyeVxuXHRcdFx0aWYgKHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5KSA+IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmRlbGV0ZWRbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGlzRW1wdHkgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhaGFzUHJvcGVydGllcyh0aGlzLnVwZGF0ZWQpXG5cdFx0XHQmJiAhaGFzUHJvcGVydGllcyh0aGlzLmRlbGV0ZWQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlIH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4vQ29sdW1uU2V0JztcbmltcG9ydCB7IENyZWF0ZWRDaGFuZ2VzRGVsdGEgfSBmcm9tICcuL0NyZWF0ZWRDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUNyZWF0ZVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1DcmVhdGVTZXJ2aWNlJztcbmltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQ2hhbmdlc0RlbHRhIHVzZWQgdG8gYXBwbHkgY2hhbmdlcyBmcm9tIG91dHNpZGUgb2YgdGhlIGNvcmUgdG8gYSB0cmFuc2FjdGlvblxuICpcbiAqIC0tLS0tLS0tLS1cbiAqXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBJbnRlcm5hbENoYW5nZXNEZWx0YSBJbnRlcm5hbENoYW5nZXNEZWx0YX0gYW5kIHtAbGluayBDaGFuZ2VzRGVsdGEgQ2hhbmdlc0RlbHRhfSBpcyB0aGF0IHRoZSBDaGFuZ2VzRGVsdGFcbiAqIGFzc3VtZXMgJ2NyZWF0ZWQnIHZhbHVlcyBoYXZlIG5vIGl0ZW1FbnRyaWVzIHlldC5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIGNhbGxpbmcge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEgYXBwbHlDaGFuZ2VzRGVsdGF9XG4gKi9cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzRGVsdGFcblx0ZXh0ZW5kcyBDaGFuZ2VzRGVsdGFCYXNlIHtcblxuXHRwdWJsaWMgY3JlYXRlZDogQ3JlYXRlZENoYW5nZXNEZWx0YSA9IG5ldyBDcmVhdGVkQ2hhbmdlc0RlbHRhKCk7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgaXRlbUNyZWF0ZVNlcnZpY2U6IEl0ZW1DcmVhdGVTZXJ2aWNlLFxuXHRcdGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgdGVtcGxhdGUgZm9yIHRoZSBwYXNzZWQgaXRlbVR5cGUgYW5kIHByb2Nlc3NlcyB0aGUgcGFzc2VkIHZhbHVlcyBhbmQgc2V0cyB0aGUgaXRlbSB0byBiZSBjcmVhdGVkIHdoZW4gdGhlIGRlbHRhIGlzIGFwcGxpZWRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiAtIElmIHRoZSB2YWx1ZXMgZG9uJ3QgY29udGFpbiBhbiBgaWRgIGEgbmV3IG9uZSB3aWxsIGJlIGdlbmVyYXRlZFxuXHQgKiAtIElmIHlvdSB3YW50IHRvIHNldCBhIHBhcmVudCBzZXQgdGhlIHByb3BlciBmaWVsZCwgeW91IGNhbid0IHBhc3MgaXQgYXMgYSBzZXBhcmF0ZSBvYmplY3Rcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtQ3JlYXRlZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0dmFsdWVzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtQ3JlYXRlU2VydmljZS5jcmVhdGVJdGVtc0Zyb21WYWx1ZXMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRbXG5cdFx0XHRcdHZhbHVlcyxcblx0XHRcdF0sXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhIHRlbXBsYXRlIGZvciB0aGUgcGFzc2VkIGl0ZW1UeXBlIGFuZCBwcm9jZXNzZXMgdGhlIHBhc3NlZCB2YWx1ZXMgYW5kIHNldHMgdGhlIGl0ZW1zIHRvIGJlIGNyZWF0ZWQgd2hlbiB0aGUgZGVsdGEgaXMgYXBwbGllZFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIC0gSWYgdGhlIHZhbHVlcyBkb24ndCBjb250YWluIGFuIGBpZGAgYSBuZXcgb25lIHdpbGwgYmUgZ2VuZXJhdGVkXG5cdCAqIC0gSWYgeW91IHdhbnQgdG8gc2V0IGEgcGFyZW50IHNldCB0aGUgcHJvcGVyIGZpZWxkLCB5b3UgY2FuJ3QgcGFzcyBpdCBhcyBhIHNlcGFyYXRlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1zQ3JlYXRlZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0dmFsdWVzQXJyYXk6IEFycmF5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtQ3JlYXRlU2VydmljZS5jcmVhdGVJdGVtc0Zyb21WYWx1ZXMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR2YWx1ZXNBcnJheSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaWxsIGNyZWF0ZSBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gd2hlbiB0aGUgZGVsdGEgaXMgYXBwbGllZFxuXHQgKiBEb2VzIG5vdCBhbHdheXMgbWVhbiB0aGUgaXRlbSBpcyBsb2NhbCwganVzdCB0aGF0IGl0IGlzbid0IGNhY2hlZCB5ZXRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBJZiB5b3UncmUgY2FsbGluZyB0aGlzIGZyb20gdGhlIGZyb250ZW5kIHlvdSBwcm9iYWJseSB3YW50IHRvIGNhbGwgYHNldEl0ZW1DcmVhdGVkYCwgd2hpY2ggd2lsbCBmZXRjaCBhIHRlbXBsYXRlIGFuZCBwcm9jZXNzIHRoZSB2YWx1ZXMgZm9yIHlvdVxuXHQgKiBJZiB5b3UgZG9uJ3QsIHlvdSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIGFyZSBhbGwgY29ycmVjdCBhbmQgYWxsIHRlbXBsYXRlIGl0ZW1zIGFyZSBwcm9jZXNzZWRcblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX3NldEl0ZW1DcmVhdGVkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogdm9pZCB7XG5cdFx0bGV0IHBhcmVudEZpZWxkczogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiA9IHt9O1xuXG5cdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0cGFyZW50RmllbGRzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudChcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRjb2x1bW5zLml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gdG9kbzogdGhlc2Ugc2hvdWxkIGJlIHNldCB3aGVuIGV4cGFuZGluZyBsb2NhbGx5XG5cdFx0Y29uc3QgZGVmYXVsdFZhbHVlcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdFZhbHVlcykge1xuXHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRWYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdHRoaXMuY3JlYXRlZC5hZGQoXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHRjb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGFzc2lnbiB0aGUgcHJvcGVyIHBhcmVudCBmaWVsZHMsIHdpbGwgY2FsbCB7QGxpbmsgQ2hhbmdlc0RlbHRhQmFzZS5zZXRJdGVtVXBkYXRlZCBzZXRJdGVtVXBkYXRlZH0gaW50ZXJuYWxseVxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1Nb3ZlZCAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0XHR0bzogRW50cnlQYXJlbnQsXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRlbnRyeSxcblx0XHRcdHt9LFxuXHRcdFx0bnVsbCxcblx0XHRcdHRvLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgaXNFbXB0eSAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHN1cGVyLmlzRW1wdHkoKVxuXHRcdFx0JiYgdGhpcy5jcmVhdGVkLmlzRW1wdHkoKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuL0NvbHVtblNldCc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0aXRlbUlkOiBJdGVtSWQsXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0Y29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG59O1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlZENoYW5nZXNEZWx0YSB7XG5cblx0cHJpdmF0ZSB0dXBsZXM6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YVtdO1xuXHR9ID0ge307XG5cblx0cHVibGljIGNvbnN0cnVjdG9yICgpIHtcblx0fVxuXG5cdHB1YmxpYyBhZGQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sdW1ucy5pdGVtVHlwZTtcblxuXHRcdGlmICh0aGlzLnR1cGxlc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy50dXBsZXNbaXRlbVR5cGVdID0gW107XG5cdFx0fVxuXG5cdFx0dGhpcy50dXBsZXNbaXRlbVR5cGVdLnB1c2goXG5cdFx0XHR7XG5cdFx0XHRcdGl0ZW1JZDogaXRlbUlkLFxuXHRcdFx0XHRmaWVsZHM6IGZpZWxkcyxcblx0XHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdH0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBpc0VtcHR5ICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gIWhhc1Byb3BlcnRpZXModGhpcy50dXBsZXMpO1xuXHR9XG5cblx0cHVibGljIGZvckVhY2ggKFxuXHRcdGNhbGxiYWNrOiAoXG5cdFx0XHR0dXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHRcdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdFx0aW5kZXg6IG51bWJlcixcblx0XHQpID0+IHZvaWQsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy50dXBsZXMpIHtcblx0XHRcdGNvbnN0IHR1cGxlc0VudHJ5ID0gdGhpcy50dXBsZXNbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHR1cGxlc0VudHJ5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNhbGxiYWNrKFxuXHRcdFx0XHRcdHR1cGxlc0VudHJ5W2ldLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnR1cGxlc1tpdGVtVHlwZV0gIT09IHVuZGVmaW5lZDtcblx0fVxufVxuIiwiaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50LCBGaWVsZE1hcCwgSXRlbUlkQ29udmVyc2lvbk1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlIH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb3JlXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIEludGVybmFsQ2hhbmdlc0RlbHRhXG4gKiBhc3N1bWVzICdjcmVhdGVkJyBlbnRyaWVzIGFyZSBhbHJlYWR5IGV4aXN0aW5nLCBzbyBpdCBoYXMgYSBkaWZmZXJlbnQgZm9ybWF0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9IGFuZCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tQ2hpbGQgYXBwbHlDaGFuZ2VzRnJvbUNoaWxkfVxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxDaGFuZ2VzRGVsdGFcblx0ZXh0ZW5kcyBDaGFuZ2VzRGVsdGFCYXNlIHtcblxuXHRwdWJsaWMgY3JlYXRlZDoge1xuXHRcdFtpdGVtRW50cnlJZDogc3RyaW5nXTogSW50ZXJuYWxDcmVhdGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHVibGljIG1vdmVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdFx0dG86IEVudHJ5UGFyZW50XG5cdFx0fVxuXHR9ID0ge307XG5cblx0cHVibGljIGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbUNyZWF0ZWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5jcmVhdGVkW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFBhcmVudCBmaWVsZHMgYXJlIG5vbi13cml0YWJsZSBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgbW92ZWQgZW50cmllcyBhbm90aGVyIHdheSAodG8gZG8gYSBsaW5rVG8gcmVxdWVzdClcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtTW92ZWQgKFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0dG86IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLm1vdmVkW2VudHJ5LmlkXSA9IHtcblx0XHRcdGVudHJ5OiBlbnRyeSxcblx0XHRcdHRvOiB0byxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGlzRW1wdHkgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzdXBlci5pc0VtcHR5KClcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKHRoaXMuY3JlYXRlZCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnksIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlciwgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlIH0gZnJvbSAnLi9SZXF1ZXN0QnVmZmVyJztcblxuY29uc3QgQlVGRkVSX0ZMVVNIX1RJTUVPVVRfTVM6IG51bWJlciA9IDE1MDtcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RCdWZmZXJNYW5hZ2VyIHtcblxuXHRwcml2YXRlIHBlbmRpbmdCdWZmZXJNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IFJlcXVlc3RCdWZmZXJ9ID0ge307XG5cdHByaXZhdGUgcGVuZGluZ1RydWVCdWZmZXJNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IFJlcXVlc3RCdWZmZXJ9ID0ge307XG5cblx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgc2V0U2VydmVyQ2FjaGUgKHNlcnZlckNhY2hlOiBTZXJ2ZXJDYWNoZSk6IHZvaWQge1xuXHRcdHRoaXMuc2VydmVyQ2FjaGUgPSBzZXJ2ZXJDYWNoZTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEJ5SWRzIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdHRoaXMuZmV0Y2hCeUlkKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ0J1ZmZlck1hcFtpdGVtVHlwZV0uZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQnlJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbG9jYWwgSXRlbUlkIGluIFJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlJZCwgZm9yIGxvY2FsIEl0ZW1JZHMgeW91IHNob3VsZCB1c2UgUmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeUxvY2FsSWQnKTtcblx0XHR9XG5cblx0XHRsZXQgYnVmZmVyO1xuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLnBlbmRpbmdUcnVlQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ1RydWVCdWZmZXJNYXAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgJ2NvbHVtbnM6IHRydWUnIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX0gYnkgaWRgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKGl0ZW1UeXBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyBSZXF1ZXN0QnVmZmVyICR7aXRlbVR5cGV9IGF0ICR7cGVyZm9ybWFuY2Uubm93KCl9IGJ5IGlkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFNpbmdsZUl0ZW0oXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeVF1ZXJ5IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IFtvYmplY3QsIHN0cmluZ10sIC8vIHF1ZXJ5UGFyc2VyIHJlc3VsdFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRsZXQgYnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoaXRlbVR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfSB3aXRoIHF1ZXJ5YCk7XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFF1ZXJ5KFxuXHRcdFx0cXVlcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdEJ1ZmZlciAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG1hcCA9IHRoaXMucGVuZGluZ0J1ZmZlck1hcCxcblx0KTogUmVxdWVzdEJ1ZmZlciB7XG5cdFx0Y29uc3QgYnVmZmVyID0gbWFwW2l0ZW1UeXBlXSA9IG5ldyBSZXF1ZXN0QnVmZmVyKFxuXHRcdFx0dGhpcy5wcm9taXNlTGlicmFyeSxcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHR3aW5kb3cuc2V0VGltZW91dChcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0YnVmZmVyLmZsdXNoKCk7XG5cblx0XHRcdFx0ZGVsZXRlIG1hcFtpdGVtVHlwZV07XG5cdFx0XHR9LFxuXHRcdFx0QlVGRkVSX0ZMVVNIX1RJTUVPVVRfTVMsXG5cdFx0KTtcblxuXHRcdHJldHVybiBidWZmZXI7XG5cdH1cblxufVxuIiwiaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRGVmZXJyZWQsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBcGlRdWVyeSwgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3IgfSBmcm9tICcuL0FwaVJlc3BvbnNlUHJvY2Vzc29yJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4vUmVxdWVzdENvbHVtbkV4cGFuc2lvbic7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RCdWZmZXJSZXNwb25zZSA9IEFwaVJlc3BvbnNlUHJvY2Vzc29yO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdEJ1ZmZlciB7XG5cblx0cHJpdmF0ZSBkZWZlcnJlZDogRGVmZXJyZWQ8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiA9IHRoaXMucHJvbWlzZUxpYnJhcnkuZGVmZXIoKTtcblx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uOiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0cHJpdmF0ZSBzaW5nbGVJdGVtSWRzOiBJdGVtSWRbXSA9IFtdO1xuXHRwcml2YXRlIHF1ZXJpZXM6IHtbcXVlcnlTdHJpbmc6IHN0cmluZ106IEFwaVF1ZXJ5fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHByb21pc2VMaWJyYXJ5OiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGUsXG5cdFx0cHJpdmF0ZSBpdGVtVHlwZTogSXRlbVR5cGUsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNJZCAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnNpbmdsZUl0ZW1JZHMuaW5kZXhPZihpdGVtSWQpICE9PSAtMTtcblx0fVxuXG5cdHB1YmxpYyBjb250YWluc1F1ZXJ5IChcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5xdWVyaWVzW3F1ZXJ5U3RyaW5nXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGFkZFNpbmdsZUl0ZW0gKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRpZiAodGhpcy5zaW5nbGVJdGVtSWRzLmluZGV4T2YoaXRlbUlkKSA9PT0gLTEpIHtcblx0XHRcdHRoaXMuc2luZ2xlSXRlbUlkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGFkZFF1ZXJ5IChcblx0XHRxdWVyeTogW29iamVjdCwgc3RyaW5nXSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKHRoaXMucXVlcmllc1txdWVyeVsxXV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5xdWVyaWVzW3F1ZXJ5WzFdXSA9IHF1ZXJ5WzBdO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBmbHVzaCAoKTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRjb25zdCBjb25kaXRpb25zOiBhbnlbXSA9IFtdO1xuXG5cdFx0aWYgKHRoaXMuc2luZ2xlSXRlbUlkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25kaXRpb25zLnB1c2goXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6ICdpZCcsXG5cdFx0XHRcdFx0Y29tcGFyYXRvcjogJ0lOJyxcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy5zaW5nbGVJdGVtSWRzLFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHF1ZXJ5U3RyaW5nIGluIHRoaXMucXVlcmllcykge1xuXHRcdFx0Y29uZGl0aW9ucy5wdXNoKHRoaXMucXVlcmllc1txdWVyeVN0cmluZ10pO1xuXHRcdH1cblxuXHRcdGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBmbHVzaCBhIFJlcXVlc3RCdWZmZXIgd2l0aG91dCBzaW5nbGVJdGVtcyBvciBxdWVyaWVzJyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZ2V0KCk7XG5cblx0XHRsZXQgcmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yO1xuXG5cdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnF1ZXJ5KFxuXHRcdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uZGl0aW9uczogY29uZGl0aW9ucyxcblx0XHRcdFx0XHRvcGVyYXRvcjogJ09SJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0X3Jlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRyZXNwb25zZSA9IF9yZXNwb25zZTtcblxuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHRoaXMuc2luZ2xlSXRlbUlkcy5sZW5ndGggPT09IDBcblx0XHRcdFx0XHRcdCYmICF0aGlzLmhhc011bHRpcGxlUXVlcmllcygpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBxdWVyeVN0cmluZyA9IHRoaXMuZ2V0Rmlyc3RRdWVyeVN0cmluZygpO1xuXG5cdFx0XHRcdFx0XHRpZiAocXVlcnlTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuX3NldFF1ZXJ5UmVzdWx0KFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0cXVlcnlTdHJpbmcsXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2UubGlua3NbdGhpcy5pdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUucHJvY2Vzc1Jlc3BvbnNlKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3IgPT4gdGhpcy5kZWZlcnJlZC5yZWplY3QoZXJyb3IpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSksXG5cdFx0XHRcdGVycm9yID0+IHRoaXMuZGVmZXJyZWQucmVqZWN0KGVycm9yKSxcblx0XHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvbWlzZSAoKTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gdGhpcy5kZWZlcnJlZC5wcm9taXNlO1xuXHR9XG5cblx0cHJpdmF0ZSBoYXNNdWx0aXBsZVF1ZXJpZXMgKCk6IGJvb2xlYW4ge1xuXHRcdGxldCBmaXJzdCA9IHRydWU7XG5cblx0XHRmb3IgKGNvbnN0IF9xdWVyeVN0cmluZyBpbiB0aGlzLnF1ZXJpZXMpIHtcblx0XHRcdGlmICghZmlyc3QpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGZpcnN0ID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRGaXJzdFF1ZXJ5U3RyaW5nICgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGZvciAoY29uc3QgcXVlcnlTdHJpbmcgaW4gdGhpcy5xdWVyaWVzKSB7XG5cdFx0XHRyZXR1cm4gcXVlcnlTdHJpbmc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRGaWx0ZXJJdGVtRW50cnlDYWxsYmFjayxcblx0SXRlbUlkLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtVHlwZSxcblx0TW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4vQ29sdW1uU2V0JztcbmltcG9ydCB7IENvbnZlcnNpb25NYXBTZXJ2aWNlIH0gZnJvbSAnLi9Db252ZXJzaW9uTWFwU2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi9LZXlTZXJ2aWNlJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuL1RlbXBsYXRlQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUNyZWF0ZVNlcnZpY2Uge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb252ZXJzaW9uTWFwU2VydmljZTogQ29udmVyc2lvbk1hcFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSB0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlLFxuXHQpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgbmV3IHtAbGluayBUZW1wbGF0ZSB0ZW1wbGF0ZX0gYW5kIHNldHMgdGhlIGl0ZW1zIGNyZWF0ZWQgb24gdGhlIHBhc3NlZCB7QGxpbmsgQ2hhbmdlc0RlbHRhfVxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUl0ZW1zRnJvbVZhbHVlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0dmFsdWVzQXJyYXk6IEFycmF5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0aWYgKHZhbHVlc0FycmF5Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByb21pc2VzOiBhbnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCB2YWx1ZXMgb2YgdmFsdWVzQXJyYXkpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IHZhbHVlcy5oYXNPd25Qcm9wZXJ0eSgnaWQnKVxuXHRcdFx0XHQ/IHZhbHVlcy5pZFxuXHRcdFx0XHQ6IHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCk7XG5cblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMudGVtcGxhdGVDYWNoZVxuXHRcdFx0XHRcdC5mZXRjaFRlbXBsYXRlKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjb2x1bW5zIHdlJ3JlIHRyeWluZyB0byBzZXQgYXJlIHRoZXJlXG5cdFx0XHRcdFx0XHRcdFtpdGVtVHlwZV06IE9iamVjdC5rZXlzKHZhbHVlc0FycmF5WzBdKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0KHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMucHJvY2Vzc1RlbXBsYXRlKFxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdFx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0XHRcdFx0XHRcdCgpID0+IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0KFxuXHRcdFx0XHRcdFx0XHRcdFx0X2l0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdFx0XHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChfaXRlbVR5cGUgIT09IGl0ZW1UeXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiB2YWx1ZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHZhbHVlc1tjb2x1bW5JZF07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBwcm9jZXNzVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrOiBGaWx0ZXJJdGVtRW50cnlDYWxsYmFjayA9ICgpID0+IHRydWUsXG5cdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2s/OiBNb2RpZnlGaWVsZHNDYWxsYmFjayxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgaXRlbUlkQ29udmVyc2lvbiA9IHRoaXMuY29udmVyc2lvbk1hcFNlcnZpY2UuY3JlYXRlTG9jYWxDb252ZXJzaW9uTWFwKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHR0cnVlLFxuXHRcdFx0dGVtcGxhdGUucmVzcG9uc2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGZpZWxkcyA9IHRlbXBsYXRlLmdldEZpZWxkcygpO1xuXG5cdFx0dGhpcy5jb252ZXJzaW9uTWFwU2VydmljZS51cGRhdGVJdGVtVmFsdWVzKFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0dGVtcGxhdGUuY29sdW1ucy5pdGVtLFxuXHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdHBhcmVudCxcblx0XHQpO1xuXG5cdFx0aWYgKG1vZGlmeUZpZWxkc0NhbGxiYWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuX3NldEl0ZW1DcmVhdGVkKFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0dGVtcGxhdGUuY29sdW1ucyxcblx0XHRcdHBhcmVudCxcblx0XHQpO1xuXG5cdFx0dGhpcy5wcm9jZXNzVGVtcGxhdGVMaW5rSXRlbXMoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdGZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrLFxuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBwcm9jZXNzVGVtcGxhdGVMaW5rSXRlbXM8UGFyZW50SXRlbVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdHBhcmVudFR5cGU6IFBhcmVudEl0ZW1UeXBlLFxuXHRcdGxvY2FsUGFyZW50SWQ6IEl0ZW1JZCxcblx0XHR0ZW1wbGF0ZTogVGVtcGxhdGU8UGFyZW50SXRlbVR5cGU+LFxuXHRcdGl0ZW1JZENvbnZlcnNpb246IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0ZmlsdGVySXRlbUVudHJ5Q2FsbGJhY2s6IEZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrID0gKCkgPT4gdHJ1ZSxcblx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjaz86IE1vZGlmeUZpZWxkc0NhbGxiYWNrLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBhcGlSZXNwb25zZSA9IHRlbXBsYXRlLnJlc3BvbnNlO1xuXHRcdGNvbnN0IGNvbHVtblNldE1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQ29sdW1uU2V0PEl0ZW1UeXBlPn0gPSB7fTtcblxuXHRcdGNvbnN0IGNyZWF0ZUVudHJpZXMgPSAoXG5cdFx0XHRfcGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0XHRfbG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdFx0YXBpUGFyZW50SWQ6IEl0ZW1JZCxcblx0XHQpID0+IHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHtcblx0XHRcdFx0aXRlbVR5cGU6IF9wYXJlbnRUeXBlLFxuXHRcdFx0XHRpdGVtSWQ6IF9sb2NhbFBhcmVudElkLFxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgbGlua3MgPSBhcGlSZXNwb25zZS5pdGVtc1tfcGFyZW50VHlwZV1bYXBpUGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxpbmtzKSB7XG5cdFx0XHRcdGlmICghbGlua3MuaGFzT3duUHJvcGVydHkoaXRlbVR5cGUpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29sdW1uU2V0TWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZS5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoY29uc3QgYXBpSXRlbUlkIG9mIGxpbmtzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdGNvbnN0IGZpZWxkcyA9IGFwaVJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0KSE7XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHQhZmlsdGVySXRlbUVudHJ5Q2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBsb2NhbEl0ZW1JZCA9IGl0ZW1JZENvbnZlcnNpb25baXRlbVR5cGVdW2FwaUl0ZW1JZF07XG5cblx0XHRcdFx0XHR0aGlzLmNvbnZlcnNpb25NYXBTZXJ2aWNlLnVwZGF0ZUl0ZW1WYWx1ZXMoXG5cdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHRjb2x1bW5TZXRNYXBbaXRlbVR5cGVdLml0ZW0sXG5cdFx0XHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5fc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdFx0XHRsb2NhbEl0ZW1JZCxcblx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdGNvbHVtblNldE1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNyZWF0ZUVudHJpZXMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGxvY2FsSXRlbUlkLFxuXHRcdFx0XHRcdFx0YXBpSXRlbUlkLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y3JlYXRlRW50cmllcyhcblx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRsb2NhbFBhcmVudElkLFxuXHRcdFx0YXBpUmVzcG9uc2UubGlua3NbcGFyZW50VHlwZV1bMF0sXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vY2xhc3Nlcy9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9jbGFzc2VzL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IEl0ZW1DcmVhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcy9JdGVtQ3JlYXRlU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzRGVsdGFGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgaXRlbUNyZWF0ZVNlcnZpY2U6IEl0ZW1DcmVhdGVTZXJ2aWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoKTogQ2hhbmdlc0RlbHRhIHtcblx0XHRyZXR1cm4gbmV3IENoYW5nZXNEZWx0YShcblx0XHRcdHRoaXMuaXRlbUNyZWF0ZVNlcnZpY2UsXG5cdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qQGludGVybmFsKi9cblx0cHVibGljIGNvbnN0cnVjdEludGVybmFsRGVsdGEgKCk6IEludGVybmFsQ2hhbmdlc0RlbHRhIHtcblx0XHRyZXR1cm4gbmV3IEludGVybmFsQ2hhbmdlc0RlbHRhKFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENoYW5nZXNQcm9jZXNzb3IsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbkZhY3RvcnknO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi9Db2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmltcG9ydCB7IENyZWF0ZVJlcXVlc3RGYWN0b3J5IH0gZnJvbSAnLi9DcmVhdGVSZXF1ZXN0RmFjdG9yeSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4vUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogQ2hhbmdlc1Byb2Nlc3NvciB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3IsIENvbGxlY3Rpb25NYXRjaGVyLCBDb2x1bW5TZXQsIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtRW50cnksXG5cdEl0ZW1FbnRyeU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1SZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IHR5cGUgRW50cnlQYXJlbnQgPSB7aXRlbVR5cGU6IHN0cmluZywgaXRlbUlkOiBudW1iZXJ9O1xuXG5leHBvcnQgdHlwZSBFbnRyeVBhcmVudE51bGwgPSBFbnRyeVBhcmVudCB8IG51bGw7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2VkIGZvciBmaWVsZHMgdGhhdCBiZWxvbmcgdG8gYSBzcGVjaWZpYyBpdGVtVHlwZVxuICovXG5leHBvcnQgdHlwZSBGaWVsZE1hcDxfSXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRba2V5OiBzdHJpbmddOiBhbnlcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1PcHRpb25zSW50ZXJmYWNlID0gSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID1cblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZVxuXHQmIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlO1xuXHRvcHRpb25zOiB7ZW50cnk6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIHJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT59O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT5cblx0ZXh0ZW5kcyBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0bGlua0ZpZWxkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFN0YXRlS2V5VHlwZSB7XG5cdE5ldyA9ICduZXcnLFxuXHREdXBsaWNhdGUgPSAnZHVwbGljYXRlJ1xufVxuXG5leHBvcnQgdHlwZSBTdGF0ZUtleSA9IHt0eXBlOiBTdGF0ZUtleVR5cGUsIHRlbXBsYXRlPzogc3RyaW5nLCBpdGVtSWQ/OiBudW1iZXJ9O1xuXG5leHBvcnQgdHlwZSBTb2NrZXRNZXNzYWdlVHlwZSA9ICdldmVudCcgfCAnbm90aWZpY2F0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlIHtcblx0aGVhZGVyOiB7XG5cdFx0ZG9tYWluOiBzdHJpbmcsXG5cdFx0YWNjb3VudDogc3RyaW5nLFxuXHRcdHNlbmRlcjoge1xuXHRcdFx0ZGlzcGxheW5hbWU6IHN0cmluZyxcblx0XHRcdGl0ZW1UeXBlOiAnTWVkZXdlcmtlcicsXG5cdFx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRcdGF1dGhvcml6ZWQ6IGJvb2xlYW4sXG5cdFx0XHRzZXNzaW9uOiBzdHJpbmdcblx0XHR9LFxuXHRcdG1lc3NhZ2VJZDoge1xuXHRcdFx0SWQ6IHN0cmluZyxcblx0XHRcdHNlcXVlbmNlOiBudW1iZXIsXG5cdFx0XHRiYXRjaDogbnVtYmVyLFxuXHRcdFx0cmVxdWVzdDogbnVtYmVyXG5cdFx0fSxcblx0XHRzZW50OiBzdHJpbmcsXG5cdFx0Zm9yY2VFdmFsdWF0ZTogYm9vbGVhblxuXHR9O1xuXHRib2R5OiBhbnk7XG5cdG1lc3NhZ2VUeXBlOiBTb2NrZXRNZXNzYWdlVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlQ3JlYXRlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ2NyZWF0ZScsXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczoge1xuXHRcdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRcdFx0XHRwYXJlbnQ6IG51bGwgfCBFbnRyeVBhcmVudCxcblx0XHRcdFx0XHR2YWx1ZXM6IEZpZWxkTWFwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZVVwZGF0ZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICd1cGRhdGUnLFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXBcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IHtcblx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0XHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0XHRcdFx0cGFyZW50OiBudWxsIHwgRW50cnlQYXJlbnQsXG5cdFx0XHRcdFx0dmFsdWVzOiBGaWVsZE1hcFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VMaW5rVG9cblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAnbGlua3RvJyxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiB7XG5cdFx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFx0W2l0ZW1JZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdHBhcmVudDogbnVsbCB8IEVudHJ5UGFyZW50LFxuXHRcdFx0XHRcdHZhbHVlczogRmllbGRNYXBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlRGVsZXRlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ2RlbGV0ZScsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiBJdGVtSWRbXVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmVTb2NrZXRNZXNzYWdlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cdGJvZHk6IHtcblx0XHRpdGVtVHlwZTogJ0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmUnLFxuXHRcdFtrZXk6IHN0cmluZ106IGFueVxuXHR9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJdGVtIHJlc291cmNlXG5cbmV4cG9ydCB0eXBlIEl0ZW1SZXNvdXJjZUl0ZW1JZE1hcDxUIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4gPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IFRcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcDxUIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4gPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogVFtdXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJdGVtIEVudHJ5XG5cbmV4cG9ydCB0eXBlIEl0ZW1JZCA9IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgSXRlbVR5cGUgPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEl0ZW1NYXA8VD4gPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtpdGVtSWQ6IHN0cmluZ106IFRcblx0fVxufTtcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5TWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IEl0ZW1NYXA8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXG5leHBvcnQgdHlwZSBJdGVtRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdFtwYXJlbnRJZDogbnVtYmVyXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xufTtcblxuZXhwb3J0IHR5cGUgQ29udmVyc2lvbk1hcCA9IHtcblx0W2l0ZW1JZDogbnVtYmVyXTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgSXRlbUlkQ29udmVyc2lvbk1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBDb252ZXJzaW9uTWFwXG59O1xuXG5leHBvcnQgdHlwZSBDcmVhdGVSZXF1ZXN0UGFyYW1ldGVyTWFwPFQgPSBhbnk+ID0gSXRlbU1hcDxUPjtcblxuZXhwb3J0IHR5cGUgSXRlbUVycm9yID0ge21lc3NhZ2U6IHN0cmluZ307XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbGxlY3Rpb24gRW50cnlcblxuZXhwb3J0IHR5cGUgUXVlcnlQYXJhbXMgPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblF1ZXJ5ID0ge29iamVjdDogb2JqZWN0LCBzdHJpbmc6IHN0cmluZ307XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q2FsbGJhY2sgPSAocXVlcnlQYXJhbXM6IFF1ZXJ5UGFyYW1zKSA9PiBRdWVyeVBhcmFtcztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRbcGFyZW50SWQ6IG51bWJlcl06IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+XG59O1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdFtwYXJlbnRJZDogbnVtYmVyXTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT5cbn07XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Zml0dGluZzogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRtYXliZTogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPlxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBlZEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cdFtjb2xsZWN0aW9uSWQ6IG51bWJlcl06IEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbHVtbnNcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW4gPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW5NYXAgPSB7XG5cdFtjb2x1bW5JZDogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW5cbn07XG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW5NYXBcbn07XG5cbmV4cG9ydCB0eXBlIENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdG1lcmdlZDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdGRpZmZlcmVuY2U6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+XG59O1xuXG5leHBvcnQgdHlwZSBSb290Q29sdW1uTWFwID0ge1tjb2x1bW5JZDogc3RyaW5nXToge2FwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sIGNoaWxkcmVuOiBSb290Q29sdW1uTWFwfX07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFwaSByZWZlcmVuY2VcblxuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2UgPSBBcGlSZXNwb25zZVByb2Nlc3NvcjsgLy8gVE9ET1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcGkgdGVtcGxhdGUgcmVzcG9uc2VcbmV4cG9ydCB0eXBlIFRlbXBsYXRlSXRlbVJlc291cmNlTWFwPFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55Pj4gPSB7XG5cdG1haW46IFQ7XG5cdGxpbmtlZDogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwXG59O1xuXG5leHBvcnQgdHlwZSBJdGVtVHlwZU1hcDxUID0gYW55PiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXBpIHJlcXVlc3RcblxuZXhwb3J0IHR5cGUgQXBpUXVlcnkgPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdEl0ZW1WYWx1ZXMgPSB7XG5cdHZhbHVlcz86IGFueSxcblx0bGlua3M/OiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXVxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0SXRlbU1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2l0ZW1JZDogbnVtYmVyXTogQXBpUmVxdWVzdEl0ZW1WYWx1ZXNcblx0fTtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW4gPSBzdHJpbmcgfCB7W2NvbHVtbklkOiBzdHJpbmddOiBBcGlSZXF1ZXN0Q29sdW1uW119O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0Q29sdW1ucyA9IEFwaVJlcXVlc3RDb2x1bW5bXSB8IHRydWU7XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW5NYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnNcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RMaW1pdCA9IHtcblx0ZmllbGQ6IHN0cmluZyxcblx0bGltaXQ6IG51bWJlcixcblx0b2Zmc2V0PzogbnVtYmVyLFxuXHRvcmRlcj86ICdkZXNjJyB8ICdhc2MnXG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0TW92ZUl0ZW1zID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDcmVhdGUgcmVxdWVzdFxuXG5leHBvcnQgdHlwZSBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRyZXF1ZXN0OiB7XG5cdFx0cmVxdWVzdFR5cGU6ICdjcmVhdGUnLFxuXHRcdGl0ZW1UeXBlPzogSXRlbVR5cGVUeXBlLFxuXHRcdHBhcmVudFR5cGU/OiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZD86IHtbaXRlbUlkOiBzdHJpbmddOiBJdGVtSWR9LFxuXHRcdGl0ZW1zOiBBcGlSZXF1ZXN0SXRlbU1hcCxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwXG5cdH0sXG5cdGNvbHVtbnM6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24sXG5cdGl0ZW1zOiBJdGVtRW50cnlNYXA8SXRlbVR5cGVUeXBlPixcblx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25NYXRjaGVyXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZW51bSBBcGlMaW5rVHJlZVR5cGUge1xuXHRJVEVNVEFCTEUgPSAnaXRlbXRhYmxlJyxcblx0RElSRUNUID0gJ2RpcmVjdCdcbn1cblxuZXhwb3J0IHR5cGUgQXBpTGlua1RyZWVFbnRyeSA9IHtcblx0dHlwZTogQXBpTGlua1RyZWVUeXBlLklURU1UQUJMRVxufSB8IHtcblx0dHlwZTogQXBpTGlua1RyZWVUeXBlLkRJUkVDVCxcblx0ZmllbGQ6IHN0cmluZ1xufTtcblxuZXhwb3J0IHR5cGUgQXBpTGlua1RyZWUgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtjaGlsZFR5cGU6IHN0cmluZ106IEFwaUxpbmtUcmVlRW50cnlcblx0fVxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENhbGxiYWNrIHRvIGRldGVybWluZSBpZiBhbiBpdGVtIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY3JlYXRlIGRlbHRhLCByZXR1cm4gYGZhbHNlYCB0byBleGNsdWRlIHRoZSBpdGVtXG4gKi9cbmV4cG9ydCB0eXBlIEZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrID0gPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcbikgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTW9kaWZ5RmllbGRzQ2FsbGJhY2sgPSA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRpdGVtSWRDb252ZXJzaW9uTWFwPzogSXRlbUlkQ29udmVyc2lvbk1hcCxcbikgPT4gdm9pZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgJ2ZhbHNlJyBpZiB0aGUgZmllbGQgY2hhbmdlZFxuICovXG5leHBvcnQgdHlwZSBDb21wYXJlRmllbGRDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSAoZmllbGQ6IGtleW9mIEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4pID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIEZpZWxkQ2hhbmdlQ2FsbGJhY2s8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0gKFxuXHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRjb21wYXJlRmllbGQ6IENvbXBhcmVGaWVsZENhbGxiYWNrLFxuXHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4sXG5cdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBEZXJlZ0Z1bmN0aW9uID0gKCkgPT4gdm9pZDtcbiIsImV4cG9ydCAqIGZyb20gJy4vUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FcnJvckhhbmRsZXJJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQXV0aEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vU29ja2V0TWVzc2FnZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL0Fic3RyYWN0Q2FjaGVEZXBlbmRlbmN5SW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vVHJhbnNhY3Rpb25JdGVtSGFuZGxlckRlcGVuZGVuY3lJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9UcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyRGVwZW5kZW5jeUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NlcnZlckNhY2hlRGVwZW5kZW5jeUludGVyZmFjZSc7XG4iXSwic291cmNlUm9vdCI6IiJ9
|