mftsccs-browser 100.0.26 → 100.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.js CHANGED
@@ -9632,7 +9632,8 @@ __webpack_require__.r(__webpack_exports__);
9632
9632
  /* harmony export */ GetCompositionBulk: () => (/* binding */ GetCompositionBulk),
9633
9633
  /* harmony export */ GetCompositionBulkWithDataId: () => (/* binding */ GetCompositionBulkWithDataId),
9634
9634
  /* harmony export */ GetCompositionFromConnectionsWithDataId: () => (/* binding */ GetCompositionFromConnectionsWithDataId),
9635
- /* harmony export */ GetCompositionFromConnectionsWithDataIdInObject: () => (/* binding */ GetCompositionFromConnectionsWithDataIdInObject)
9635
+ /* harmony export */ GetCompositionFromConnectionsWithDataIdInObject: () => (/* binding */ GetCompositionFromConnectionsWithDataIdInObject),
9636
+ /* harmony export */ GetConnectionDataPrefetch: () => (/* binding */ GetConnectionDataPrefetch)
9636
9637
  /* harmony export */ });
9637
9638
  /* harmony import */ var _Api_GetAllConnectionsOfCompositionBulk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Api/GetAllConnectionsOfCompositionBulk */ "./src/Api/GetAllConnectionsOfCompositionBulk.ts");
9638
9639
  /* harmony import */ var _Api_GetConnectionBulk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Api/GetConnectionBulk */ "./src/Api/GetConnectionBulk.ts");
@@ -9691,6 +9692,30 @@ function GetCompositionFromConnectionsWithDataId(ids = [], connections = []) {
9691
9692
  return compositions;
9692
9693
  });
9693
9694
  }
9695
+ function GetConnectionDataPrefetch(connections) {
9696
+ return __awaiter(this, void 0, void 0, function* () {
9697
+ let remainingConnections = [];
9698
+ let connectionsAll = [];
9699
+ for (let i = 0; i < connections.length; i++) {
9700
+ let connection = yield _app__WEBPACK_IMPORTED_MODULE_2__.ConnectionData.GetConnection(connections[i]);
9701
+ if (connection.id == 0) {
9702
+ remainingConnections.push(connections[i]);
9703
+ }
9704
+ else {
9705
+ connectionsAll.push(connection);
9706
+ }
9707
+ }
9708
+ let prefetchConcepts = [];
9709
+ let connectionsAllLocal = yield (0,_Api_GetConnectionBulk__WEBPACK_IMPORTED_MODULE_1__.GetConnectionBulk)(remainingConnections);
9710
+ connectionsAll = [...connectionsAllLocal];
9711
+ for (let j = 0; j < connectionsAll.length; j++) {
9712
+ prefetchConcepts.push(connectionsAll[j].ofTheConceptId);
9713
+ prefetchConcepts.push(connectionsAll[j].toTheConceptId);
9714
+ }
9715
+ yield (0,_app__WEBPACK_IMPORTED_MODULE_2__.GetConceptBulk)(prefetchConcepts);
9716
+ return connectionsAll;
9717
+ });
9718
+ }
9694
9719
  function GetCompositionFromConnectionsWithDataIdInObject(ids = [], connections = []) {
9695
9720
  return __awaiter(this, void 0, void 0, function* () {
9696
9721
  let remainingConnections = [];
@@ -9700,7 +9725,13 @@ function GetCompositionFromConnectionsWithDataIdInObject(ids = [], connections =
9700
9725
  remainingConnections.push(connections[i]);
9701
9726
  }
9702
9727
  }
9703
- yield (0,_Api_GetConnectionBulk__WEBPACK_IMPORTED_MODULE_1__.GetConnectionBulk)(remainingConnections);
9728
+ let prefetchConcepts = [];
9729
+ let connectionsAll = yield (0,_Api_GetConnectionBulk__WEBPACK_IMPORTED_MODULE_1__.GetConnectionBulk)(remainingConnections);
9730
+ for (let j = 0; j < connectionsAll.length; j++) {
9731
+ prefetchConcepts.push(connectionsAll[j].ofTheConceptId);
9732
+ prefetchConcepts.push(connectionsAll[j].toTheConceptId);
9733
+ }
9734
+ yield (0,_app__WEBPACK_IMPORTED_MODULE_2__.GetConceptBulk)(prefetchConcepts);
9704
9735
  var compositions = {};
9705
9736
  for (let i = 0; i < ids.length; i++) {
9706
9737
  //console.log("tHIS IS THE START", ids[i])
@@ -11891,6 +11922,7 @@ function SearchLinkMultipleAll(searchQuery, token = "") {
11891
11922
  let connections = result.internalConnections;
11892
11923
  let linkers = result.linkers;
11893
11924
  let reverse = result.reverse;
11925
+ yield (0,_GetCompositionBulk__WEBPACK_IMPORTED_MODULE_2__.GetConnectionDataPrefetch)(linkers);
11894
11926
  concepts = yield (0,_GetCompositionBulk__WEBPACK_IMPORTED_MODULE_2__.GetCompositionFromConnectionsWithDataIdInObject)(conceptIds, connections);
11895
11927
  let out = yield FormatFromConnections(linkers, concepts, mainCompositionId, reverse);
11896
11928
  return out;
@@ -11900,6 +11932,16 @@ function FormatFromConnections(linkers, compositionData, mainComposition, revers
11900
11932
  return __awaiter(this, void 0, void 0, function* () {
11901
11933
  let mainData = {};
11902
11934
  let connections = yield (0,_app__WEBPACK_IMPORTED_MODULE_1__.GetConnectionBulk)(linkers);
11935
+ let myConcepts = [];
11936
+ for (let i = 0; i < connections.length; i++) {
11937
+ myConcepts.push(connections[i].toTheConceptId);
11938
+ myConcepts.push(connections[i].ofTheConceptId);
11939
+ myConcepts.push(connections[i].typeId);
11940
+ }
11941
+ yield (0,_app__WEBPACK_IMPORTED_MODULE_1__.GetConceptBulk)(myConcepts);
11942
+ connections.sort(function (x, y) {
11943
+ return y.id - x.id;
11944
+ });
11903
11945
  for (let i = 0; i < connections.length; i++) {
11904
11946
  let reverseFlag = false;
11905
11947
  if (reverse.includes(connections[i].id)) {
@@ -12712,4 +12754,4 @@ function init(url = "", aiurl = "", accessToken = "", nodeUrl = "", enableAi = t
12712
12754
  /******/
12713
12755
  /******/ })()
12714
12756
  ;
12715
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7O0FDbERPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25KQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsMEJBQTBCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDcE9PO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE1BQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLDBCQUEwQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsMEJBQTBCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQ0FBZ0M7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNqRk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUpBLGlCQUFpQixTQUFJLElBQUks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RDtBQUNoQztBQUNSO0FBQ21CO0FBQ25CO0FBQ25EO0FBQ0EsSUFBSSxnRkFBWTtBQUNoQjtBQUNBO0FBQ0EsSUFBSSw2REFBTztBQUNYLElBQUksNkRBQU87QUFDWCxJQUFJLDZEQUFPO0FBQ1gsd0NBQXdDLDZEQUFPO0FBQy9DLElBQUksZ0ZBQVk7QUFDaEIsSUFBSSx1RUFBZ0I7QUFDcEI7QUFDQSxRQUFRLDhFQUF3QjtBQUNoQyxZQUFZLDRFQUFlO0FBQzNCLFlBQVksNEVBQWU7QUFDM0IsWUFBWSw0RUFBZTtBQUMzQjtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVEsMEZBQTZCO0FBQ3JDLFlBQVksNEVBQWU7QUFDM0IsWUFBWSw0RUFBZTtBQUMzQixZQUFZLDRFQUFlO0FBQzNCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUSxzRkFBdUI7QUFDL0IsWUFBWSw0RUFBZTtBQUMzQixTQUFTO0FBQ1QsUUFBUSxpRkFBa0I7QUFDMUIsWUFBWSw0RUFBZTtBQUMzQixZQUFZLDRFQUFlO0FBQzNCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMOzs7Ozs7O1VDMUhBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztVRU5BO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNvbmNlcHRBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0NyZWF0ZS9DcmVhdGVUaGVHaG9zdENvbmNlcHRBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlVGV4dERhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9EZWxldGVUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvRGVsZXRlVGhlQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0RlbGV0ZS9EZWxldGVDb25jZXB0SW5CYWNrZW5kLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0QWlEYXRhLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0QWxsQ29uY2VwdHNCeVR5cGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldENvbmNlcHRCdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldENvbm5lY3Rpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldFJlc2VydmVkQ29ubmVjdGlvbklkcy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldFJlc2VydmVkSWRzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvTG9jYWwvR2V0TG9jYWxDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0xvZ2luLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvTWFrZVRoZU5hbWVJbkJhY2tlbmQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9NYWtlVGhlVHlwZUNvbmNlcHRBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9SZWN1cnNpdmVTZWFyY2gudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9TZWFyY2hDb25jZXB0L0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvU2VhcmNoL1NlYXJjaC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1NlYXJjaC9TZWFyY2hJbnRlcm5hbEFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1NlYXJjaC9TZWFyY2hMaW5rTXVsdGlwbGVBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9TZWFyY2gvU2VhcmNoV2l0aExpbmtlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1Nlc3Npb24vQ3JlYXRlU2Vzc2lvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1Nlc3Npb24vQ3JlYXRlU2Vzc2lvblZpc2l0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvU2lnbmluLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvU2lnbnVwLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvVHJhbnNsYXRlL1RyYW5zbGF0ZUxvY2FsVG9SZWFsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvVmlldy9WaWV3SW50ZXJuYWxEYXRhQXBpLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CYXNlVXJsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CaW5hcnlDaGFyYWN0ZXJUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CaW5hcnlUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CaW5hcnlUeXBlVHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ2hhcmFjdGVyUmVwb3NpdG9yeS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQmluYXJ5VHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25Ob2RlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvbkJpbmFyeVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25CaW5hcnlUcmVlL0Nvbm5lY3Rpb25Ob2RlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uVHlwZVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9GaWx0ZXJTZWFyY2gudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0lkZW50aWZpZXJGbGFncy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MTm9kZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbEJpbmFyeVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQmluYXJ5VHlwZVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29ubmVjdGlvbkRhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsR2hvc3RJZFRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsU3luY0RhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL05vZGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1BhdGNoZXJTdHJ1Y3R1cmUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1Jlc2VydmVkSWRzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9SZXR1cm5lci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2VhcmNoUXVlcnkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NlYXJjaC9TZWFyY2hTdHJ1Y3R1cmUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NlY3VyaXR5L1Rva2VuU3RvcmFnZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2Vzc2lvbi9TZXNzaW9uRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2V0dGluZ0RhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9UaGVUZXh0cy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvVXNlci9Vc2VyQmluYXJ5VHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvVXNlci9Vc2VyTm9kZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YWJhc2UvTm9JbmRleERiLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhYmFzZS9pbmRleGRibG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFiYXNlL2luZGV4ZWRkYi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvSGVscGVycy9DaGVja0lmRXhpc3RzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9IZWxwZXJzL1JlbW92ZUZyb21BcnJheS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvSGVscGVycy9VbmlxdWVJbnNlcnQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0NoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9CdWlsZENvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkNhY2hlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9DcmVhdGVDb21wb3NpdGlvbkNhY2hlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db25jZXB0RmluZGluZy9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvQ29udmVyc2lvbi9Db252ZXJ0Q29uY2VwdHMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvRGVsZXRlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvRGVsZXRlQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvRmluZENvbmVjZXB0c0Zyb21Db25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9GaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa0luTWVtb3J5LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0Q29tcG9zaXRpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkxpc3QudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0dldENvbmNlcHRCeUNoYXJhY3Rlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0Q29ubmVjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0dldERhdGFGcm9tSW5kZXhEYi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0TGluay50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9HZXRSZWxhdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0VGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvSW5pdGlhbGl6ZVN5c3RlbS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvQ29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvQ29udmVydEZyb21MQ29ubmVjdGlvblRvQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c0xvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb21wb3NpdGlvbkxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb25jZXB0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldENvbXBvc2l0aW9uTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldFJlbGF0aW9uTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldFRoZUNvbmNlcHRMb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvTWFrZVRoZUNvbmNlcHRMb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9NYWtlVGhlVHlwZUxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9VcGRhdGVDb21wb3NpdGlvbkxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9NYWtlVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9NYWtlVGhlQ2hhcmFjdGVyRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTWFrZVRoZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVUaW1lc3RhbXAudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVUeXBlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTXF0dC9wdWJsaXNoTWVzc2FnZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtJbnRlcm5hbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtNdWx0aXBsZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU3BsaXRTdHJpbmdzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9VcGRhdGVDb21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvVXNlci9Vc2VyVHJhbnNsYXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL1ZpZXcvVmlld0ludGVybmFsRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvYXBwLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENoYXJhY3RlclJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ2hhcmFjdGVyUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmV0dXJuZXIgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvUmV0dXJuZXJcIjtcbmltcG9ydCB7IFRoZUNoYXJhY3RlciB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9UaGVDaGFyYWN0ZXJcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ2hhcmFjdGVyKGNoYXJhY3RlckRhdGEpIHtcbiAgICB2YXIgY2hhcmFjdGVyRGF0YTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2hhcmFjdGVyRGF0YSA9IENoYXJhY3RlclJlcG9zaXRvcnkuR2V0Q2hhcmFjdGVyKGNoYXJhY3RlckRhdGEuZGF0YSk7XG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyRGF0YS5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlVGhlQ2hhcmFjdGVyRGF0YVVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNoYXJhY3RlckRhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFN0cmluZztcbiAgICAgICAgICAgICAgICB2YXIgc2F2aW5nQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3RlcihyZXN1bHQudXNlcklkLCBjaGFyYWN0ZXJEYXRhLmRhdGEsIDAsIDAsIDQsIDQsIDk5OSwgOTk5LCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgc2F2aW5nQ2hhcmFjdGVyLmlkID0gcmVzdWx0LmlkO1xuICAgICAgICAgICAgICAgIENoYXJhY3RlclJlcG9zaXRvcnkuQWRkQ2hhcmFjdGVyKHNhdmluZ0NoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5pbmdEYXRhID0gbmV3IFJldHVybmVyKGNoYXJhY3RlckRhdGEuaWQsIGNoYXJhY3RlckRhdGEudXNlcklkLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmluZ0RhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVhdGUgdGhlIGNoYXJhY3RlciBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVhdGUgdGhlIGNoYXJhY3RlciB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29uY2VwdEFwaShjb25jZXB0RGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uY2VwdERhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFN0cmluZyA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFN0cmluZztcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbmNlcHQgYXBpIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29uY2VwdCBhcGkgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaShjb25uZWN0aW9uRGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICB2YXIganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShjb25uZWN0aW9uRGF0YSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlVGhlQ29ubmVjdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGpzb25EYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIENyZWF0ZSB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IFRva2VuU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9TZWN1cml0eS9Ub2tlblN0b3JhZ2VcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVHaG9zdENvbmNlcHRBcGkoY29uY2VwdERhdGEsIGNvbm5lY3Rpb25EYXRhKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIFwiY29uY2VwdHNcIjogW10sXG4gICAgICAgICAgICBcImNvbm5lY3Rpb25zXCI6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKFwiYXBwbGljYXRpb24vanNvblwiLCBUb2tlblN0b3JhZ2UuQmVhcmVyQWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBoZWFkZXJcIiwgaGVhZGVyKTtcbiAgICAgICAgICAgIGxldCBteUJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb25jZXB0c1wiOiBjb25jZXB0RGF0YSxcbiAgICAgICAgICAgICAgICBcImNvbm5lY3Rpb25zXCI6IGNvbm5lY3Rpb25EYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkNyZWF0ZUdob3N0Q29uY2VwdEFwaVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG15Qm9keSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgcmVzdWx0LmNvbmNlcHRzID0gcmVzdWx0U3RyaW5nLmNvbmNlcHRzO1xuICAgICAgICAgICAgcmVzdWx0LmNvbm5lY3Rpb25zID0gcmVzdWx0U3RyaW5nLmNvbm5lY3Rpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29uY2VwdCBhcGkgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlIHRoZSBjb25jZXB0IGFwaSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGV4dERhdGEodGV4dERhdGEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVUZXh0RGF0YVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHRleHREYXRhKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTdHJpbmcgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRTdHJpbmc7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlIHRoZSB0ZXh0IGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgdGV4dCB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRPbmx5VG9rZW5IZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRGVsZXRlVGhlQ29uY2VwdChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9ybWRhdGEuYXBwZW5kKFwiaWRcIiwgaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyID0gR2V0T25seVRva2VuSGVhZGVyKCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuRGVsZXRlQ29uY2VwdFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGZvcm1kYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbmNlcHQgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbmNlcHQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0T25seVRva2VuSGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERlbGV0ZVRoZUNvbm5lY3Rpb24oaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1kYXRhLmFwcGVuZChcImlkXCIsIGlkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlciA9IEdldE9ubHlUb2tlbkhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkRlbGV0ZVRoZUNvbm5lY3Rpb25VcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBmb3JtZGF0YSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogXCJmb2xsb3dcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25uZWN0aW9uIGVycm9yIHN0YXR1czogJywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBUcmFzaFRoZUNvbmNlcHQoaWQsIHRva2VuKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG15SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgICAgICBteUhlYWRlcnMuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdG9rZW4pO1xuICAgICAgICAgICAgY29uc3QgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1kYXRhLmFwcGVuZCgnaWQnLCBpZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5EZWxldGVDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBib2R5OiBmb3JtZGF0YSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBteUhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlbGV0ZSBjb21wb3NpdGlvbiBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb21wb3NpdGlvbiBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgY29tcG9zaXRpb24gdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmwnO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGEnO1xuaW1wb3J0IHsgUHVyZ2F0b3J5RGF0YWJhc2VVcGRhdGVkIH0gZnJvbSAnLi4vU2VydmljZXMvSW5pdGlhbGl6ZVN5c3RlbSc7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyJztcbmV4cG9ydCBmdW5jdGlvbiBHZXRBaURhdGEoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxBaURhdGEoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FpIEVycm9yIE1lc3NhZ2U6ICcsIFwiQ2Fubm90IGdldCByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFB1cmdhdG9yeURhdGFiYXNlVXBkYXRlZCgpO1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgdGltZSB0YWtlbiBpcyBcIiwgZWxhcHNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBaSBFcnJvciBNZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBaSBFcnJvciBNZXNzYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxDb25jZXB0c0J5VHlwZSh0eXBlLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHVybGVuY29kZWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInR5cGVcIiwgdHlwZSk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInVzZXJfaWRcIiwgdXNlcklkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbmNlcHRzQnlUeXBlVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogdXJsZW5jb2RlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldEFsbENvbmNlcHRzQnlUeXBlIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXRBbGxDb25jZXB0c0J5VHlwZSBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXRBbGxDb25jZXB0c0J5VHlwZSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YSc7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uIH0gZnJvbSAnLi4vU2VydmljZXMvQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24nO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gJy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXInO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihjb21wb3NpdGlvbl9pZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGNvbXBvc2l0aW9uX2lkKTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25PbmxpbmUoY29tcG9zaXRpb25faWQpO1xuICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBuZXdDb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbk9ubGluZShjb21wb3NpdGlvbl9pZCk7XG4gICAgICAgICAgICB2YXIgbmV3Q29ubmVjdGlvbnMgPSBuZXdDb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uKG5ld0Nvbm5lY3Rpb25zLCBjb25uZWN0aW9uTGlzdCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9IG5ld0Nvbm5lY3Rpb25zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25PbmxpbmUoY29tcG9zaXRpb25faWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25VcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY29tcG9zaXRpb25faWQ9JHtjb21wb3NpdGlvbl9pZH1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyBnZXR0aW5nIGNvbm5lY3Rpb24gZnJvbSBvbmxpbmVcIiwgQmFzZVVybC5HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25VcmwoKSwgY29tcG9zaXRpb25faWQpO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24ocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb24gb2YgY29tcG9zaXRpb24gZXJyb3IgOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb24gb2YgY29tcG9zaXRpb24gZXJyb3IgOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YSc7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEZpbmRDb25jZXB0c0Zyb21Db25uZWN0aW9ucyB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbmRDb25lY2VwdHNGcm9tQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrSW5NZW1vcnknO1xuaW1wb3J0IHsgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9DaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbic7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSAnLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlcic7XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhjb21wb3NpdGlvbl9pZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgY29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uX2lkcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBvbGRDb25uZWN0aW9uTGlzdCA9IHlpZWxkIEZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25zQnVsa0luTWVtb3J5KGNvbXBvc2l0aW9uX2lkcyk7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbk9ubGluZShjb21wb3NpdGlvbl9pZHMpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbihjb25uZWN0aW9uTGlzdCwgb2xkQ29ubmVjdGlvbkxpc3QpO1xuICAgICAgICB5aWVsZCBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uT25saW5lKGNvbXBvc2l0aW9uX2lkcyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb21wb3NpdGlvbl9pZHMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2gocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBjb25uZWN0aW9ucyBvZiBjb21wb3NpdGlvbiBidWxrIGVycm9yIG1lc3NhZ2U6ICcsIFwiQ2Fubm90IGdldCByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgY29ubmVjdGlvbnMgb2YgY29tcG9zaXRpb24gYnVsayBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb25zIG9mIGNvbXBvc2l0aW9uIGJ1bGsgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0KGNvbmNlcHRJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxMaW5rZXJDb25uZWN0aW9uT2ZDb25jZXB0VXJsKCkgKyBgP2NvbmNlcHRJZD0ke2NvbmNlcHRJZH1gLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29uY2VwdHMgZXJyb3JcIiwgXCJjYW5ub3QgZ2V0IHJlc3BvbmVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGxpbmtlciBjb25uZWN0aW9uIGZyb20gdGhlIGNvbmNlcHRzIGVycm9yOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGxpbmtlciBjb25uZWN0aW9uIGZyb20gdGhlIGNvbmNlcHRzIGVycm9yKFVuZXhwZWN0ZWQpOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0KGNvbmNlcHRJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0VXJsKCkgKyBgP2NvbmNlcHRJZD0ke2NvbmNlcHRJZH1gLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gVG8gdGhlIGNvbmNlcHRzIGVycm9yXCIsIFwiY2Fubm90IGdldCByZXNwb25lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBsaW5rZXIgY29ubmVjdGlvbiBUbyB0aGUgY29uY2VwdHMgZXJyb3I6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gVG8gdGhlIGNvbmNlcHRzIGVycm9yKFVuZXhwZWN0ZWQpOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0KGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFVzZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGxldCBpc05wYyA9IENvbmNlcHRzRGF0YS5HZXROcGMoaWQpO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgIT0gMCB8fCBpc05wYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25jZXB0VXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYGlkPSR7aWR9YFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkTnBjKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgdGhlIGNvbmNlcHQgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCB0aGUgY29uY2VwdCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgdGhlIGNvbmNlcHQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnVsayhjb25jZXB0SWRzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGJ1bGtDb25jZXB0RmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0VXNlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWxrQ29uY2VwdEZldGNoLnB1c2goY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1bGtDb25jZXB0RmV0Y2gubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShidWxrQ29uY2VwdEZldGNoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgQ29uY2VwdCBCdWxrIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29uY2VwdCBCdWxrICBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29uY2VwdCBCdWxrICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQnVsa0NvbmNlcHRHZXR0ZXJBcGkoYnVsa0NvbmNlcHRGZXRjaCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGlmIChidWxrQ29uY2VwdEZldGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG15SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldENvbmNlcHRCdWxrVXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYnVsa0NvbmNlcHRGZXRjaCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSByZXN1bHRbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdidWxrIGNvbmNlcHQgZ2V0dGVyIGFwaSBlcnJvcjogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYnVsayBjb25jZXB0IGdldHRlciBhcGkgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKGNoYXJhY3RlclZhbHVlLCB0eXBlSWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlTG9jYWwoY2hhcmFjdGVyVmFsdWUsIHR5cGVJZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdCA9PSBudWxsIHx8IGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBqc29uID0ge1xuICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyX3ZhbHVlJzogYCR7Y2hhcmFjdGVyVmFsdWV9YCxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGVfaWQnOiB0eXBlSWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB0b1NlbmRKc29uID0gSlNPTi5zdHJpbmdpZnkoanNvbik7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZVVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHRvU2VuZEpzb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IHR5cGUgYW5kIGNoYXJhY3RlciBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgdHlwZSBhbmQgY2hhcmFjdGVyIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IHR5cGUgYW5kIGNoYXJhY3RlciB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY2hhcmFjdGVyX3ZhbHVlPSR7Y2hhcmFjdGVyVmFsdWV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgaW4gR2V0dGluZyBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSBFcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgY29uY2VwdCBieSBjaGFyYWN0ZXIgdmFsdWUgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgY29uY2VwdCBieSBjaGFyYWN0ZXIgdmFsdWUgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb24oaWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29ubmVjdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGBpZD0ke2lkfWBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHlpZWxkIHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IENvbm5lY3Rpb24gRXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25uZWN0aW9uIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25uZWN0aW9uIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMgfSBmcm9tIFwiLi4vU2VydmljZXMvRmluZENvbmVjZXB0c0Zyb21Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uQnVsayhjb25uZWN0aW9uSWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBidWxrQ29ubmVjdGlvbkZldGNoID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25JZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdFVzZSA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWxrQ29ubmVjdGlvbkZldGNoLnB1c2goY29ubmVjdGlvbklkc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbmNlcHRVc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWxrQ29ubmVjdGlvbkZldGNoLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29ubmVjdGlvbkJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShidWxrQ29ubmVjdGlvbkZldGNoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBDb25uZWN0aW9uIEJ1bGsgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IENvbm5lY3Rpb24gQnVsayBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29ubmVjdGlvbiBCdWxrIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQodHlwZUlkLCBvZlRoZUNvbmNlcHRJZCwgdXNlcklkLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciB1cmxlbmNvZGVkID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ0eXBlSWRcIiwgYCR7dHlwZUlkfWApO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJvZlRoZUNvbmNlcHRJZFwiLCBgJHtvZlRoZUNvbmNlcHRJZH1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwidXNlcklkXCIsIGAke3VzZXJJZH1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwiaW5wYWdlXCIsIGAke2lucGFnZX1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwicGFnZVwiLCBgJHtwYWdlfWApO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbm5lY3Rpb25zT2ZDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogdXJsZW5jb2RlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9ICh5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0IGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0ICBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0IHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBSZXNlcnZlZENvbm5lY3Rpb25JZHMgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvUmVzZXJ2ZWRJZHNcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRzKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgUmVzZXJ2ZWRDb25uZWN0aW9uSWRzLkFkZElkKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXQgcmVzZXJ2ZWQgY29ubmVjdGlvbiBpZHMgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0IHJlc2VydmVkIGNvbm5lY3Rpb24gaWRzICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBSZXNlcnZlZElkcyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9SZXNlcnZlZElkc1wiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZXNlcnZlZElkcygpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldFJlc2VydmVkSWRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgUmVzZXJ2ZWRJZHMuQWRkSWQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dldCByZXNlcnZlZCBpZHMgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0IHJlc2VydmVkIGlkcyAgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldExvY2FsQ29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY2hhcmFjdGVyX3ZhbHVlPSR7Y2hhcmFjdGVyVmFsdWV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBpbiBHZXR0aW5nIExvY2FsIGNvbmNlcHQgYnkgY2hhcmFjdGVyIHZhbHVlIEVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBMb2NhbCBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSBlcnJvciBtZXNzYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBMb2NhbCBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgVG9rZW5TdG9yYWdlIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlJztcbmV4cG9ydCBmdW5jdGlvbiBMb2dpblRvQmFja2VuZChlbWFpbCwgcGFzc3dvcmQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICAnZW1haWwnOiBlbWFpbCxcbiAgICAgICAgICAgICAgICAncGFzc3dvcmQnOiBwYXNzd29yZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBteUhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICAgICAgbXlIZWFkZXJzLmFwcGVuZChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdE9iamVjdCA9IEpTT04uc3RyaW5naWZ5KG9iamVjdCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuTG9naW5VcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0T2JqZWN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gcmVzdWx0LmRhdGEudG9rZW47XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIHRoZSB0b2tlblwiLCBUb2tlblN0b3JhZ2UuQmVhcmVyQWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTG9naW4gdHNjY3MgZXJyb3IgbWVzc2FnZTogJywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0xvZ2luIHRzY2NzIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBMb2dpbiB0c2NjcyAgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZU5hbWVJbkJhY2tlbmQobmV3Q29uY2VwdElkLCByZWZlcmVudCwgdHlwZUlkLCB0eXBlVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgJ25ld0NvbmNlcHRJZCc6IG5ld0NvbmNlcHRJZCxcbiAgICAgICAgICAgICAgICAncmVmZXJlbnQnOiByZWZlcmVudCxcbiAgICAgICAgICAgICAgICAndHlwZUlkJzogdHlwZUlkLFxuICAgICAgICAgICAgICAgICd0eXBlVXNlcklkJzogdHlwZVVzZXJJZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBteUhlYWRlcnMgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdE9iamVjdCA9IEpTT04uc3RyaW5naWZ5KG9iamVjdCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGZldGNoKEJhc2VVcmwuTWFrZVRoZU5hbWVJbkJhY2tlbmRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0T2JqZWN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21ha2UgdGhlIG5hbWUgaW4gYmFja2VuZCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYWtlIHRoZSBuYW1lIGluIGJhY2tlbmQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeSB9IGZyb20gXCIuLi9TZXJ2aWNlcy9Db25jZXB0RmluZGluZy9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeVwiO1xuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSB0eXBlIGNvbmNwZXQgb2YgYSBwYXNzZWQgc3RyaW5nXG4vLyBpZiB0aGUgdGV4dCBpcyBcInRoZV9wZXJzb25cIiB0aGVuIHRoZSBmdW5jdGlvbiBmaW5kcyB0aGUgcmVsYXRlZCBjb25jZXB0XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZVR5cGVDb25jZXB0QXBpKHR5cGUsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIC8vIGNyZWF0ZSAgYSBkZWZhdWx0IGNvbmNlcHQgd2l0aCBhbGwgZGVmYXVsdGluZyB0byB6ZXJvXG4gICAgICAgIGxldCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGdldCB0aGUgY29uY2VwdCBieSBjaGFyYWN0ZXIgYW5kIGNhdGVnb3J5IGZyb20gdGhlIGFwaVxuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHR5cGUpO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCB8fCBjb25jZXB0LnR5cGVJZCA9PSA0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5NYWtlVGhlVHlwZUNvbmNlcHRVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBgdHlwZT0ke3R5cGV9YFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNYWtlIFRoZSBUeXBlIENvbmNlcHQgQXBpIGVycm9yIDogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTWFrZSBUaGUgVHlwZSBDb25jZXB0IEFwaSBlcnJvciA6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU2VhcmNoUXVlcnlcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkJ1bGtcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFJlY3Vyc2l2ZVNlYXJjaEFwaShjb21wb3NpdGlvbiA9IDAsIGxpc3RMaW5rZXJzID0gW10sIHRleHRTZWFyY2ggPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHRzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc2VhcmNoUXVlcnkgPSBuZXcgU2VhcmNoUXVlcnkoKTtcbiAgICAgICAgICAgIHNlYXJjaFF1ZXJ5LmNvbXBvc2l0aW9uID0gY29tcG9zaXRpb247XG4gICAgICAgICAgICBzZWFyY2hRdWVyeS5saXN0TGlua2VycyA9IGxpc3RMaW5rZXJzO1xuICAgICAgICAgICAgc2VhcmNoUXVlcnkudGV4dFNlYXJjaCA9IHRleHRTZWFyY2g7XG4gICAgICAgICAgICB2YXIgcmF3ID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNoUXVlcnkpO1xuICAgICAgICAgICAgdmFyIENvbm5lY3Rpb25zID0gW107XG4gICAgICAgICAgICB2YXIgbXlIZWFkZXJzID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLlJlY3Vyc2l2ZVNlYXJjaFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHJhd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRJZHMgPSByZXN1bHQuY29tcG9zaXRpb25JZHM7XG4gICAgICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gcmVzdWx0LmludGVybmFsQ29ubmVjdGlvbnM7XG4gICAgICAgICAgICAgICAgdmFyIGV4dGVybmFsQ29ubmVjdGlvbnMgPSByZXN1bHQuZXh0ZXJuYWxDb25uZWN0aW9ucztcbiAgICAgICAgICAgICAgICBjb25jZXB0cyA9IHlpZWxkIEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZChjb25jZXB0SWRzLCBjb25uZWN0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlY3Vyc2l2ZSBzZWFyY2ggZXJyb3IgXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZWN1cnNpdmUgc2VhcmNoIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlY3Vyc2l2ZSBzZWFyY2ggdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlEaXJlY3RBcGkoY2hhcmFjdGVyVmFsdWUsIGNhdGVnb3J5X2lkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogYGNoYXJhY3Rlcl92YWx1ZT0ke2NoYXJhY3RlclZhbHVlfSZjYXRlZ29yeV9pZD0ke2NhdGVnb3J5X2lkfWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IGNhdGVnb3J5IGFuZCBjaGFyYWN0ZXIgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgY2F0ZWdvcnkgYW5kIGNoYXJhY3RlciBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgVGhpcyBpcyB0aGUgY29uY2VwdCBieSBjYXRlZ29yeSBhbmQgY2hhcmFjdGVyIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbiB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBTZWFyY2hBbGxDb25jZXB0cyh0eXBlLCBzZWFyY2gsIGNvbXBvc2l0aW9uLCB0b2tlbiwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywgdG9rZW4pO1xuICAgICAgICB2YXIgdXJsZW5jb2RlZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInNlYXJjaFwiLCBzZWFyY2gpO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcImNvbXBvc2l0aW9uXCIsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJpbnBhZ2VcIiwgaW5wYWdlLnRvU3RyaW5nKCkpO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInBhZ2VcIiwgcGFnZS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgcXVlcnlVcmwgPSBCYXNlVXJsLlNlYXJjaENvbXBvc2l0aW9uc1VybCgpICsgXCI/XCIgKyB1cmxlbmNvZGVkLnRvU3RyaW5nKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHF1ZXJ5VXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgZXJyb3JcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaEludGVybmFsQXBpKHNlYXJjaCwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihcImFwcGxpY2F0aW9uL2pzb25cIiwgdG9rZW4pO1xuICAgICAgICBsZXQgcXVlcnlVcmwgPSBCYXNlVXJsLlNlYXJjaEludGVybmFsV2l0aEF1dGhlbnRpY2F0ZWRDY3NVcmwoKTtcbiAgICAgICAgcXVlcnlVcmwgPSBxdWVyeVVybCArICc/Y29tcG9zaXRpb249JyArIHNlYXJjaC5jb21wb3NpdGlvbiArICcmc2VhcmNoPScgKyBzZWFyY2guc2VhcmNoICsgJyZpbnRlcm5hbENvbXBvc2l0aW9uPScgKyBzZWFyY2guaW50ZXJuYWxDb21wb3NpdGlvbiArICcmdHlwZT0nICsgc2VhcmNoLnR5cGUgKyAnJmlucGFnZT0nICsgc2VhcmNoLmlucGFnZSArICcmcGFnZT0nICsgc2VhcmNoLnBhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHF1ZXJ5VXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgaW50ZXJuYWwgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBpbnRlcm5hbCBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaExpbmtNdWx0aXBsZUFwaShzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihcImFwcGxpY2F0aW9uL2pzb25cIiwgdG9rZW4pO1xuICAgICAgICBjb25zdCBxdWVyeVVybCA9IEJhc2VVcmwuU2VhcmNoTGlua011bHRpcGxlQWxsQXBpVXJsKCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShzZWFyY2hRdWVyeSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHF1ZXJ5VXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgbXVsdGlwbGUgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBtdWx0aXBsZSBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaFdpdGhMaW5rZXIoc2VhcmNoUXVlcnksIHRva2VuID0gXCJcIikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oXCJhcHBsaWNhdGlvbi9qc29uXCIsIHRva2VuKTtcbiAgICAgICAgY29uc3QgcXVlcnlVcmwgPSBCYXNlVXJsLlNlYXJjaExpbmtNdWx0aXBsZUFsbCgpO1xuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNoUXVlcnkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChxdWVyeVVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgZXJyb3JcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlU2Vzc2lvbihzZXNzaW9uRGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHNlc3Npb25EYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVTZXNzaW9uSWQoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIHNlc3Npb24gZmFpbGVkXCIsIHlpZWxkIHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgc2Vzc2lvbiBmYWlsZWRcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVTZXNzaW9uVmlzaXQoc2Vzc2lvbklkLCB1cmwpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgICAgICAgICBjb25zdCB1cmxlbmNvZGVkID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJzZXNzaW9uSWRcIiwgc2Vzc2lvbklkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ1cmxcIiwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVTZXNzaW9uVmlzaXRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiB1cmxlbmNvZGVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIHNlc3Npb24gdXJsIGZhaWxlZFwiLCB5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIHNlc3Npb24gdXJsIGZhaWxlZFwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2lnbmluKHNpZ25pbkluZm8pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCByYXcgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBlbWFpbDogc2lnbmluSW5mby5lbWFpbCxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBzaWduaW5JbmZvLnBhc3N3b3JkLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICBtZXNzYWdlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG15SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIG15SGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIGNvbnN0IHVybCA9IEJhc2VVcmwuTG9naW5VcmwoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHJhdyxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPYmplY3QgPSBvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdXRwdXQuZGF0YTtcbiAgICAgICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhT2JqZWN0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnY2Fubm90IGF1dGhlbnRpY2F0ZScsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmcmVlc2NoZW1hUmVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpZ24gaW4gYXBpIGVycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBmcmVlc2NoZW1hUmVzO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vYXBwXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTaWdudXAoc2lnbnVwTW9kZWwpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBzaWdudXBSZXNwb25zZSA9IHlpZWxkIHBvc3REYXRhKEJhc2VVcmwuU2lnbnVwVXJsKCksIHNpZ251cE1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHNpZ251cFJlc3BvbnNlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcG9zdERhdGEodXJsID0gJycsIGRhdGEgPSB7fSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICB9O1xuICAgICAgICAvLyBEZWZhdWx0IG9wdGlvbnMgYXJlIG1hcmtlZCB3aXRoICpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIC8vICpHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBldGMuXG4gICAgICAgICAgICAgICAgbW9kZTogJ2NvcnMnLCAvLyBuby1jb3JzLCAqY29ycywgc2FtZS1vcmlnaW5cbiAgICAgICAgICAgICAgICBjYWNoZTogJ25vLWNhY2hlJywgLy8gKmRlZmF1bHQsIG5vLWNhY2hlLCByZWxvYWQsIGZvcmNlLWNhY2hlLCBvbmx5LWlmLWNhY2hlZFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCAvLyBpbmNsdWRlLCAqc2FtZS1vcmlnaW4sIG9taXRcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgIC8vICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gbWFudWFsLCAqZm9sbG93LCBlcnJvclxuICAgICAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXInLCAvLyBuby1yZWZlcnJlciwgKm5vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlLCBvcmlnaW4sIG9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiwgc2FtZS1vcmlnaW4sIHN0cmljdC1vcmlnaW4sIHN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4sIHVuc2FmZS11cmxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSwgLy8gYm9keSBkYXRhIHR5cGUgbXVzdCBtYXRjaCBcIkNvbnRlbnQtVHlwZVwiIGhlYWRlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBvdXRwdXQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdjYW5ub3QgY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZyZWVzY2hlbWFSZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2lnbnVwIEVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGZyZWVzY2hlbWFSZXM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhLCBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2xhdGVMb2NhbFRvUmVhbChjb25jZXB0SWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldFJlYWxDb25jZXB0QnlJZCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGBpZD0ke2NvbmNlcHRJZH1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGluIEdldHRpbmcgVHJhbnNsYXRpbmcgY29uY2VwdCBFcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgVHJhbnNsYXRpbmcgY29uY2VwdCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBUcmFuc2xhdGluZyBjb25jZXB0IHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCdWxrIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIFZpZXdJbnRlcm5hbERhdGFBcGkoaWRzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLlZpZXdJbnRlcm5hbERhdGFVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9uRGljdGlvbmFyeSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdFN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29uY2VwdExpc3QgPSBjb25jZXB0U3RyaW5nW2ldLmNvbmNlcHRzO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbmNlcHRTdHJpbmdbaV0uY29ubmVjdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGNvbmNlcHRTdHJpbmdbaV0uaWQ7XG4gICAgICAgICAgICAgICAgICAgIEdldENvbmNlcHRCdWxrKGNvbmNlcHRMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkRpY3Rpb25hcnlbaWRdID0gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uRGljdGlvbmFyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmlldyBJbnRlcm5hbCBEYXRhIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgVGhpcyBpcyB0aGUgdmlldyBpbnRlcm5hbCBkYXRhIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSB2aWV3IGludGVybmFsIGRhdGEgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJleHBvcnQgY2xhc3MgQmFzZVVybCB7XG4gICAgLy8gc3RhdGljIEdldENvbmNlcHRVcmw6c3RyaW5nID0gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldENvbmNlcHQnO1xuICAgIHN0YXRpYyBHZXRDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldENvbmNlcHQnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvblVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtY29ubmVjdGlvbi1ieS1pZCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnVsa1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9idWxrJztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25CdWxrVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jb25uZWN0aW9uX2J1bGsnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29uY2VwdHNPZlVzZXJVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25jZXB0c19vZl91c2VyJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbENvbm5lY3Rpb25zT2ZVc2VyVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29ubmVjdGlvbnNfb2ZfdXNlcic7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25uZWN0aW9uc19vZl9jb21wb3NpdGlvbic7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29ubmVjdGlvbnNfb2ZfY29tcG9zaXRpb25fYnVsayc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9ieV9jaGFyYWN0ZXJfdmFsdWUnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9ieV9jaGFyYWN0ZXJfYW5kX3R5cGUnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2NvbmNlcHRfYnlfY2hhcmFjdGVyX2FuZF9jYXRlZ29yeSc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9ieV9jaGFyYWN0ZXJfYW5kX2NhdGVnb3J5X2RpcmVjdCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDaGFyYWN0ZXJCeUNoYXJhY3RlclVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY2hhcmFjdGVyX2J5X2NoYXJhY3Rlcic7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25jZXB0c0J5VHlwZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2NvbmNlcHRzX2J5X3R5cGUnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0LWxpbmstY29ubmVjdGlvbnMnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQWlEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1wcmVsb2FkZWQtY29uY2VwdHMnO1xuICAgICAgICAvLyByZXR1cm4gdGhpcy5BSV9VUkwgKyAnL2FwaS9nZXRfcmFua2VkX3R5cGVfaWQ/aW5wYWdlPTMwMCcgfHwgcHJvY2Vzcy5lbnYuQUlfVVJMIHx8ICAnaHR0cHM6Ly9haS5mcmVlc2NoZW1hLmNvbS9hcGkvZ2V0X3JhbmtlZF90eXBlX2lkP2lucGFnZT0zMDAnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsUHJlZmV0Y2hDb25uZWN0aW9uc1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2Nvbm5lY3Rpb25zX29mX3VzZXI/aW5wYWdlPTUwMCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxMaW5rZXJDb25uZWN0aW9uT2ZDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1hbGwtbGlua2Vycy1mcm9tLWNvbmNlcHQnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsTGlua2VyQ29ubmVjdGlvblRvQ29uY2VwdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtYWxsLWxpbmtlcnMtdG8tY29uY2VwdCc7XG4gICAgfVxuICAgIHN0YXRpYyBEZWxldGVDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2RlbGV0ZV9jb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIFJlY3Vyc2l2ZVNlYXJjaFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9yZWN1cnNpdmVzZWFyY2gtY29uY2VwdC1jb25uZWN0aW9uJztcbiAgICB9XG4gICAgc3RhdGljIFNlYXJjaExpbmtNdWx0aXBsZUFsbEFwaVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9Db25uZWN0aW9uL3NlYXJjaC1saW5rLW11bHRpcGxlLWFsbC1jY3MnO1xuICAgIH1cbiAgICBzdGF0aWMgTWFrZVRoZU5hbWVJbkJhY2tlbmRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvbWFrZS1uYW1lLWZyb20tZnJvbnRlbmQnO1xuICAgIH1cbiAgICBzdGF0aWMgTG9naW5VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvYXV0aC9sb2dpbic7XG4gICAgfVxuICAgIHN0YXRpYyBTaWdudXBVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvYXV0aC9zaWdudXAnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29tcG9zaXRpb25Db25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1jb21wb3NpdGlvbi1jb25uZWN0aW9uLWJldHdlZW4tdHdvLWNvbmNlcHRzJztcbiAgICB9XG4gICAgc3RhdGljIFNlYXJjaENvbXBvc2l0aW9uc1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9zZWFyY2gtY29tcG9zaXRpb25zJztcbiAgICB9XG4gICAgc3RhdGljIFNlYXJjaExpbmtNdWx0aXBsZUFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9Db25uZWN0aW9uL3NlYXJjaC1saW5rLW11bHRpcGxlLWFsbCc7XG4gICAgfVxuICAgIHN0YXRpYyBDcmVhdGVTZXNzaW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlLXNlc3Npb24taWQtcmVtb3RlJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVNlc3Npb25WaXNpdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9jcmVhdGUtcmVtb3RlLXNlc3Npb24tdmlzaXQnO1xuICAgIH1cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy9BcGkgZm9yIHZpZXdpbmcgaW50ZXJuYWwgZGF0YSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIHN0YXRpYyBWaWV3SW50ZXJuYWxEYXRhVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL3ZpZXctYXBpLWludGVybmFsLWRhdGEtY2NzLWlkLWJ1bGsnO1xuICAgIH1cbiAgICBzdGF0aWMgU2VhcmNoSW50ZXJuYWxXaXRoQXV0aGVudGljYXRlZENjc1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9zZWFyY2gtY29tcG9zaXRpb24taW50ZXJuYWwtYXV0aGVudGljYXRlZC1jY3MnO1xuICAgIH1cbiAgICBzdGF0aWMgQ3JlYXRlR2hvc3RDb25jZXB0QXBpVXJsKCkge1xuICAgICAgICByZXR1cm4gQmFzZVVybC5OT0RFX1VSTCArICcvYXBpL3YxL2xvY2FsLWNvbmNlcHRzJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZUdob3N0Q29ubmVjdGlvbkFwaVVybCgpIHtcbiAgICAgICAgcmV0dXJuIEJhc2VVcmwuTk9ERV9VUkwgKyAnL2FwaS92MS9sb2NhbC1jb25uZWN0aW9ucyc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRSZWFsQ29uY2VwdEJ5SWQoKSB7XG4gICAgICAgIHJldHVybiBCYXNlVXJsLk5PREVfVVJMICsgJy9hcGkvdjEvbG9jYWwtY29uY2VwdHMtdHJhbnNsYXRlJztcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLyBBUEkgRm9yIFJlc2VydmVkIElkcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgR2V0UmVzZXJ2ZWRJZFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfcmVzZXJ2ZWRfaWRzJztcbiAgICB9XG4gICAgc3RhdGljIEdldFJlc2VydmVkQ29ubmVjdGlvbklkVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9yZXNlcnZlZF9jb25uZWN0aW9uX2lkcyc7XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vL0FQSSBGb3IgQ3JlYXRpbmcgRGF0YSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIHN0YXRpYyBDcmVhdGVUaGVUZXh0RGF0YVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9jcmVhdGVfdGV4dF9kYXRhJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNoYXJhY3RlckRhdGFVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX2NoYXJhY3Rlcl9kYXRhJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbm5lY3Rpb25VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25uZWN0aW9uJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbm5lY3Rpb25OZXdVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25uZWN0aW9uX25ldyc7XG4gICAgfVxuICAgIHN0YXRpYyBNYWtlVGhlVHlwZUNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvbWFrZV90aGVfdHlwZV9jb25jZXB0JztcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vQVBJIEZPUiBEZWxldGluZyBDb25uZWN0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgRGVsZXRlVGhlQ29ubmVjdGlvblVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9kZWxldGVfY29ubmVjdGlvbic7XG4gICAgfVxufVxuQmFzZVVybC5CQVNFX1VSTCA9IFwiaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1My9cIjtcbkJhc2VVcmwuQUlfVVJMID0gXCJodHRwczovL2FpLmZyZWVzY2hlbWEuY29tXCI7XG5CYXNlVXJsLk1RVFRfVVJMID0gJzE5Mi4xNjguMS4yNDknO1xuQmFzZVVybC5OT0RFX1VSTCA9IFwiaHR0cDovL2xvY2FsaG9zdDo1MDAxXCI7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuL0lkZW50aWZpZXJGbGFnc1wiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL05vZGVcIjtcbmV4cG9ydCBjbGFzcyBCaW5hcnlDaGFyYWN0ZXJUcmVlIHtcbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0NoYXJhY3RlckxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChCaW5hcnlDaGFyYWN0ZXJUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhcmFjdGVyUm9vdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmFjdGVyUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhcmFjdGVyUm9vdCA9IHRoaXMuY2hhcmFjdGVyUm9vdC5hZGRDaGFyYWN0ZXJOb2RlKG5vZGUsIHRoaXMuY2hhcmFjdGVyUm9vdCwgdGhpcy5jaGFyYWN0ZXJSb290LmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZU5vZGVCeUNoYXJhY3RlcihjaGFyYWN0ZXIsIGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5jaGFyYWN0ZXJSb290LCBjaGFyYWN0ZXIsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3QuY291bnROb2RlQmVsb3codGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNoYXJhY3RlclJvb3QuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlVXBkYXRlZCh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgdGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUodmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldENoYXJhY3RlckFuZENhdGVnb3J5RnJvbVRyZWUodmFsdWUsIGNhdGVnb3J5SWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNoYXJhY3RlclJvb3QuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRDaGFyYWN0ZXIoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290ID0gdGhpcy5jaGFyYWN0ZXJSb290LnJlbW92ZU5vZGUodGhpcy5jaGFyYWN0ZXJSb290LCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5CaW5hcnlDaGFyYWN0ZXJUcmVlLmNoYXJhY3RlclJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4vQmluYXJ5Q2hhcmFjdGVyVHJlZVwiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL05vZGVcIjtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuL0lkZW50aWZpZXJGbGFnc1wiO1xuZXhwb3J0IGNsYXNzIEJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNEYXRhTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KEJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuaWQsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICB2YXIgY2hhcmFjdGVyTm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICBCaW5hcnlDaGFyYWN0ZXJUcmVlLmFkZE5vZGVUb1RyZWUoY2hhcmFjdGVyTm9kZSk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5yb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZU5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5yZW1vdmVOb2RlKHRoaXMucm9vdCwgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNvdW50TnVtYmVyT2ZOb2RlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLnJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbkJpbmFyeVRyZWUucm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tIFwiLi9Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQmluYXJ5VHlwZVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGVSb290ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZVJvb3QgPSB0aGlzLnR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMudHlwZVJvb3QsIHRoaXMudHlwZVJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgTm9kZShjb25jZXB0LnR5cGVJZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZVR5cGVDb25jZXB0KHR5cGVJZCwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZVJvb3QgPSB0aGlzLnR5cGVSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy50eXBlUm9vdCwgdHlwZUlkLCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICBpZiAodGhpcy50eXBlUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnR5cGVSb290LmdldEZyb21Ob2RlKGlkLCB0aGlzLnR5cGVSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWUodHlwZUlkKSB7XG4gICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgdmFyIGNvbmNlcHRzID0gW107XG4gICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChCaW5hcnlUeXBlVHJlZS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTm9kZS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1ByZXNlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29uY2VwdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VwdHNbal0uaWQgPT0gTm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNQcmVzZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0cztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNXaXRoQ2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gY2hhcmFjdGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoTm9kZS52YXJpYW50c1tpXS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFyaWFudHNbaV0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGVSb290KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlUm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLnR5cGVSb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5CaW5hcnlUeXBlVHJlZS50eXBlUm9vdCA9IG51bGw7XG4iLCJpbXBvcnQgeyBUaGVDaGFyYWN0ZXIgfSBmcm9tIFwiLi9UaGVDaGFyYWN0ZXJcIjtcbmV4cG9ydCBjbGFzcyBDaGFyYWN0ZXJSZXBvc2l0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjaGFyYWN0ZXIgUmVwb3NpdG9yeVwiO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICAgICAgICB0aGlzLmNoYXJhY3RlckRhdGFbY2hhcmFjdGVyLmlkXSA9IGNoYXJhY3RlcjtcbiAgICB9XG4gICAgc3RhdGljIEdldENoYXJhY3Rlcih2YWx1ZSkge1xuICAgICAgICB2YXIgdGhlQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3RlcigwLCBcIjBcIiwgMCwgMCwgMCwgMCwgMCwgMCwgXCIwXCIsIGZhbHNlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoYXJhY3RlckRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlckRhdGFbaV0uZGF0YSA9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoZUNoYXJhY3RlciA9IHRoaXMuY2hhcmFjdGVyRGF0YVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhlQ2hhcmFjdGVyO1xuICAgIH1cbn1cbkNoYXJhY3RlclJlcG9zaXRvcnkuY2hhcmFjdGVyRGF0YSA9IFtdO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyByZWN1cnNpdmVGZXRjaE5ldyB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0J1aWxkQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5pbXBvcnQgeyBwdWJsaXNoTWVzc2FnZSB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL01xdHQvcHVibGlzaE1lc3NhZ2UnO1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gd2UgY2FuIGJ1aWxkIGEgY29tcG9zaXRpb24gdXNpbmcgdGhpcyBjbGFzc1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICAgICAgdGhpcy5tYWluQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb25jZXB0cyA9IFtdO1xuICAgICAgICB0aGlzLnN1YmNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNhY2hlZCA9IHt9O1xuICAgIH1cbiAgICB1cGRhdGVDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW5Db25jZXB0LmlkID09IDApXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzW2ldLmlkID09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbkNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZpc2l0ZWRDb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jYWNoZWQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaE5ldyh0aGlzLmlkLCB0aGlzLmNvbm5lY3Rpb25zLCB0aGlzLmNvbmNlcHRzLCB0aGlzLnN1YmNvbXBvc2l0aW9ucywgdmlzaXRlZENvbmNlcHRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFVwZGF0ZUFjcm9zc0Rpc3RyaWJ1dGVkU3lzdGVtKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcHVibGlzaE1lc3NhZ2UoJ2NvbXBvc2l0aW9uVXBkYXRlJywgKF9hID0gdGhpcy5pZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIHB1Ymxpc2hpbmcgbWVzc2FnZScsIGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc1VwZGF0aW5nKCkge1xuICAgICAgICB0aGlzLlVwZGF0ZUFjcm9zc0Rpc3RyaWJ1dGVkU3lzdGVtKCk7XG4gICAgfVxuICAgIEdldERhdGFDYWNoZSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCBtYWluU3RyaW5nID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5tYWluQ29uY2VwdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IHRoaXMuY2FjaGVkO1xuICAgICAgICBjb25zdCBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IHRoaXMuaWQ7XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbXBvc2l0aW9uTm9kZSB9IGZyb20gJy4vQ29tcG9zaXRpb25Ob2RlJztcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbkJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbXBvc2l0aW9uVG9UcmVlKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQ29tcG9zaXRpb25Ob2RlKGNvbXBvc2l0aW9uLmlkLCBjb21wb3NpdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY291bnROb2RlQmVsb3codGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4vLyB0aGlzIGlzIGEgYmluYXJ5IHRyZWUgdG8gaG9sZCBjb21wb3NpdGlvbnMgaW4gaXRcbkNvbXBvc2l0aW9uQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsImltcG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4vQ29tcG9zaXRpb25CaW5hcnlUcmVlJztcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbk5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIGxlZnROb2RlLCByaWdodE5vZGUpIHtcbiAgICAgICAgdGhpcy5leHBpcnlUaW1lID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDEwICogNjAgKiAxMDAwKTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgIH1cbiAgICBpc1ZhbGlkKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKERhdGUubm93KCkpO1xuICAgICAgICBpZiAodGhpcy5leHBpcnlUaW1lIDwgY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5yZW1vdmVOb2RlRnJvbVRyZWUodGhpcy5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzYXZlVG9DYWNoZShkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsdWUuY2FjaGVkID0gZGF0YTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgIGNvbnN0IFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpO1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9XG4gICAgICAgICAgICAxICtcbiAgICAgICAgICAgICAgICBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgY29uc3QgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBjb25zdCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgY29uc3QgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkgJiYgbm9kZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3VudE5vZGVCZWxvdyhyb290KSB7XG4gICAgICAgIGlmIChyb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVjdXJzaXZlIGNhbGwgdG8gbGVmdCBjaGlsZCBhbmQgcmlnaHQgY2hpbGQgYW5kXG4gICAgICAgIC8vIGFkZCB0aGUgcmVzdWx0IG9mIHRoZXNlIHdpdGggMSAoIDEgZm9yIGNvdW50aW5nIHRoZSByb290KVxuICAgICAgICByZXR1cm4gKDEgK1xuICAgICAgICAgICAgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LmxlZnROb2RlKSArXG4gICAgICAgICAgICB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QucmlnaHROb2RlKSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ29uY2VwdCB7XG4gICAgY29uc3RydWN0b3IoaWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIGNoYXJhY3RlclZhbHVlLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCBpc05ldyA9IGZhbHNlLCBlbnRyeVRpbWVTdGFtcCwgdXBkYXRlZFRpbWVTdGFtcCkge1xuICAgICAgICB0aGlzLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy50eXBlVXNlcklkID0gdHlwZVVzZXJJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlJZCA9IGNhdGVnb3J5SWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlVc2VySWQgPSBjYXRlZ29yeVVzZXJJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudElkID0gcmVmZXJlbnRJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudCA9IHJlZmVyZW50SWQ7XG4gICAgICAgIHRoaXMucmVmZXJlbnRVc2VySWQgPSByZWZlcmVudFVzZXJJZDtcbiAgICAgICAgdGhpcy5jaGFyYWN0ZXJWYWx1ZSA9IGAke2NoYXJhY3RlclZhbHVlfWA7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSBzZXNzaW9uVXNlcklkO1xuICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICB0aGlzLnR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgICAgIHRoaXMuZW50cnlUaW1lU3RhbXAgPSBlbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy51cGRhdGVkVGltZVN0YW1wID0gdXBkYXRlZFRpbWVTdGFtcDtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcyk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZUlkKTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IHJlbW92ZUZyb21EYXRhYmFzZSwgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uL0RhdGFiYXNlL2luZGV4ZWRkYlwiO1xuaW1wb3J0IHsgQmluYXJ5VHJlZSB9IGZyb20gXCIuL0JpbmFyeVRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeUNoYXJhY3RlclRyZWUgfSBmcm9tIFwiLi9CaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBCaW5hcnlUeXBlVHJlZSB9IGZyb20gXCIuL0JpbmFyeVR5cGVUcmVlXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuZXhwb3J0IGNsYXNzIENvbmNlcHRzRGF0YSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiY29uY2VwdHNBcnJheVwiO1xuICAgIH1cbiAgICBzdGF0aWMgQ2hlY2tDb250YWlucyhjb25jZXB0KSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIEFkZE5wYyhpZCkge1xuICAgICAgICBpZiAoIXRoaXMuTlBDLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuTlBDLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5OUEMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuTlBDLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBHZXROcGMoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTlBDLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdFRvU3RvcmFnZShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29uY2VwdFwiLCBjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgLy92YXIgY29udGFpbnMgPSB0aGlzLkNoZWNrQ29udGFpbnMoY29uY2VwdCk7XG4gICAgICAgICAgICAvLyB0aGlzLmNvbmNlcHREaWN0aW9uYXJ5W2NvbmNlcHQuaWRdID0gY29uY2VwdDtcbiAgICAgICAgICAgIC8vICAgIGlmKGNvbnRhaW5zKXtcbiAgICAgICAgICAgIC8vICAgdGhpcy5SZW1vdmVDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0VG9NZW1vcnkoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIC8vdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbmNlcHQpO1xuICAgICAgICAgICAgLy8gdGhpcy5jb25jZXB0RGljdGlvbmFyeVtjb25jZXB0LmlkXSA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAvLyAgICBpZihjb250YWlucyl7XG4gICAgICAgICAgICAvLyAgIHRoaXMuUmVtb3ZlQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICBCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0VGVtcG9yYXJ5KGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbmNlcHQpO1xuICAgICAgICB0aGlzLmNvbmNlcHREaWN0aW9uYXJ5W2NvbmNlcHQuaWRdID0gY29uY2VwdDtcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZUNvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25jZXB0c0FycmF5LnB1c2goY29uY2VwdCk7XG4gICAgfVxuICAgIHN0YXRpYyBSZW1vdmVDb25jZXB0KGNvbmNlcHQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29uY2VwdFwiLCBjb25jZXB0LmlkKTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHQoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBteUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB5aWVsZCBCaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICBteUNvbmNlcHQgPSByZXR1cm5lZENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYobXlDb25jZXB0LmlkID09IDAgfHwgbXlDb25jZXB0ID09IG51bGwpe1xuICAgICAgICAgICAgLy8gICAgIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBpZCl7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBteUNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gbXlDb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldE5vZGVGcm9tVHJlZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBOb2RlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVXBkYXRlZChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldE5vZGVGcm9tVHJlZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBOb2RlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKGNoYXJhY3Rlcl92YWx1ZSwgdHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICAvL3ZhciBOb2RlID0gYXdhaXQgQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLHR5cGVJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgQmluYXJ5VHlwZVRyZWUuZ2V0VHlwZVZhcmlhbnRzV2l0aENoYXJhY3RlclZhbHVlKGNoYXJhY3Rlcl92YWx1ZSwgdHlwZUlkKTtcbiAgICAgICAgICAgIC8vIGlmKE5vZGUpe1xuICAgICAgICAgICAgLy8gICAgIGNvbmNlcHQgPSAgTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvdW5kIHRoZSBvdXRwdXRcIik7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coY29uY2VwdCk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKGNoYXJhY3Rlcl92YWx1ZSwgY2F0ZWdvcnlJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB5aWVsZCBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldENoYXJhY3RlckFuZENhdGVnb3J5RnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLCBjYXRlZ29yeUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0c0J5VHlwZUlkKHR5cGVJZCkge1xuICAgICAgICB2YXIgbXlDb25jZXB0O1xuICAgICAgICBsZXQgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgbXlDb25jZXB0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzQXJyYXlbaV0udHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5jb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUoXCJjb25jZXB0XCIsXCJ0eXBlSWRcIix0eXBlSWQpLnRoZW4oY29uY2VwdExpc3Q9PntcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwidGhpIHNpcyBteSBsaXN0XCIpO1xuICAgICAgICAvLyAgfSk7XG4gICAgICAgIC8vICAgdmFyIGRiQ29uY2VwdExpc3QgPSBhd2FpdCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZChcImNvbmNlcHRcIixcInR5cGVJZFwiLCB0eXBlSWQpO1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QpO1xuICAgICAgICAvLyAgIGlmKEFycmF5LmlzQXJyYXkoZGJDb25jZXB0TGlzdCkpe1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QpO1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QubGVuZ3RoKTtcbiAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPCBkYkNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiaGVyZSB0byBwdXNoIGZpcnN0c1wiKTtcbiAgICAgICAgLy8gICAgIHZhciBjb250YWluczogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgZm9yKHZhciBqPTA7IGo8IENvbmNlcHRMaXN0Lmxlbmd0aDsgaisrKXtcbiAgICAgICAgLy8gICAgICAgICBpZihkYkNvbmNlcHRMaXN0W2ldLmlkID09IENvbmNlcHRMaXN0W2pdLmlkKXtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiaGVyZSB0byBwdXNoXCIpO1xuICAgICAgICAvLyAgICAgaWYoIWNvbnRhaW5zKXtcbiAgICAgICAgLy8gICAgICAgICBDb25jZXB0TGlzdC5wdXNoKGRiQ29uY2VwdExpc3RbaV0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgY29uY2VwdCBsaXN0XCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhDb25jZXB0TGlzdCk7XG4gICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgIENvbmNlcHRMaXN0ID0geWllbGQgQmluYXJ5VHlwZVRyZWUuZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRCaW5hcnlDaGFyYWN0ZXJUcmVlKCkge1xuICAgICAgICByZXR1cm4gQmluYXJ5Q2hhcmFjdGVyVHJlZS5jaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cbn1cbkNvbmNlcHRzRGF0YS5jb25jZXB0c0FycmF5ID0gW107XG5Db25jZXB0c0RhdGEuTlBDID0gW107XG5Db25jZXB0c0RhdGEuY29uY2VwdERpY3Rpb25hcnkgPSBbXTtcbiIsImltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoaWQgPSAwLCBvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgb3JkZXJJZCwgb3JkZXJVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9VcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50eXBlID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm9mVGhlQ29uY2VwdElkID0gb2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgIHRoaXMudG9UaGVDb25jZXB0SWQgPSB0b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy5PZlRoZUNvbmNlcHRVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHRoaXMuVG9UaGVDb25jZXB0VXNlcklkID0gdG9UaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy50eXBlSWQgPSB0eXBlSWQ7XG4gICAgICAgIHRoaXMuZ2hvc3RJZCA9IGlkO1xuICAgICAgICB0aGlzLnR5cGVVc2VySWQgPSB0eXBlVXNlcklkO1xuICAgICAgICB0aGlzLm9yZGVySWQgPSBvcmRlcklkO1xuICAgICAgICB0aGlzLm9yZGVyVXNlcklkID0gb3JkZXJVc2VySWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudGVybWluYXRpb25EYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTeW5jVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm9kZSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9ucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbnJvb3QgPSB0aGlzLmNvbm5lY3Rpb25yb290LmFkZE5vZGUobm9kZSwgdGhpcy5jb25uZWN0aW9ucm9vdCwgdGhpcy5jb25uZWN0aW9ucm9vdC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgQ29ubmVjdGlvbk5vZGUoY29ubmVjdGlvbi5pZCwgY29ubmVjdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KENvbm5lY3Rpb25CaW5hcnlUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25yb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9ucm9vdCA9IHRoaXMuY29ubmVjdGlvbnJvb3QucmVtb3ZlTm9kZSh0aGlzLmNvbm5lY3Rpb25yb290LCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY29ubmVjdGlvbnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMuY29ubmVjdGlvbnJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkNvbm5lY3Rpb25CaW5hcnlUcmVlLmNvbm5lY3Rpb25yb290ID0gbnVsbDtcbiIsImV4cG9ydCBjbGFzcyBDb25uZWN0aW9uTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLnZhcmlhbnRzID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5sZWZ0Tm9kZSA9IGxlZnROb2RlO1xuICAgICAgICB0aGlzLnJpZ2h0Tm9kZSA9IHJpZ2h0Tm9kZTtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS50eXBlSWQgIT0gbm9kZS52YWx1ZS50eXBlSWQpIHtcbiAgICAgICAgICAgIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBub2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCA9PSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIG5vZGUudmFyaWFudHMucHVzaChwYXNzZWROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvL25vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5IDwgcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiKXtcbiAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmlnaHRSb3RhdGUoeSkge1xuICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgbGV0IHggPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgbGV0IHkgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0geDtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXR1cm4geTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0QmFsYW5jZUZhY3RvcihOKSB7XG4gICAgICAgIGlmIChOID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhlaWdodChOLmxlZnROb2RlKSAtIHRoaXMuZ2V0SGVpZ2h0KE4ucmlnaHROb2RlKTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGUoaWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZihwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApe1xuICAgICAgICAvLyAgICAgaWYocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBpZCApe1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAvLyAgICAgaWYobmV3Tm9kZSl7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLmxlZnROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vY29uZGl0aW9uIGlmIHRoZSBtYWluIG5vZGUgaXMgZXF1YWwgdG8gdGhlIHZhbHVlXG4gICAgICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBjb25jZXB0SWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBtYWluIG5vZGUgaXMgbm90IGVxdWFsIHRvIHRoZSBjaGVja2luZyB2YWx1ZSBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRJZCA9PSBwYXNzZWROb2RlLnZhcmlhbnRzW2ldLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXksIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbk9yZGVyU3VjY2Vzc29yKHJvb3QpIHtcbiAgICAgICAgd2hpbGUgKHJvb3QubGVmdE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdCA9IHJvb3QubGVmdE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm9kZSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblR5cGVUcmVlIHtcbiAgICBzdGF0aWMgYWRkTm9kZVRvVHJlZShub2RlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uVHlwZVJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVHlwZVJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCA9IHRoaXMuY29ubmVjdGlvblR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMuY29ubmVjdGlvblR5cGVSb290LCB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChDb25uZWN0aW9uVHlwZVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbikge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgQ29ubmVjdGlvbk5vZGUoY29ubmVjdGlvbi50eXBlSWQsIGNvbm5lY3Rpb24sIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVUeXBlQ29uY2VwdCh0eXBlSWQsIGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QgPSB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHRoaXMuY29ubmVjdGlvblR5cGVSb290LCB0eXBlSWQsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWUodHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE5vZGUudmFsdWUudXNlcklkID09IHVzZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoTm9kZS52YXJpYW50c1tpXS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Db25uZWN0aW9uVHlwZVRyZWUuY29ubmVjdGlvblR5cGVSb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgcmVtb3ZlRnJvbURhdGFiYXNlLCBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4vQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkJpbmFyeVRyZWUgfSBmcm9tIFwiLi9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvblR5cGVUcmVlIH0gZnJvbSBcIi4vQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvblR5cGVUcmVlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkRhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNvbm5lY3Rpb24gQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvblRvU3RvcmFnZShjb25uZWN0aW9uKSB7XG4gICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImNvbm5lY3Rpb25cIiwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgLy8gICAgdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbm5lY3Rpb24pO1xuICAgICAgICAvLyAgICAgaWYoY29udGFpbnMpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuUmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGlmKGNvbm5lY3Rpb24uaWQgIT0gMCB8fCBjb25uZWN0aW9uLmlzVGVtcCl7XG4gICAgICAgIC8vICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29ubmVjdGlvblwiLGNvbm5lY3Rpb24pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdGhpcy5jb25uZWN0aW9uQXJyYXkucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLmFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBDb25uZWN0aW9uVHlwZVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvblRvTWVtb3J5KGNvbm5lY3Rpb24pIHtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgQ29ubmVjdGlvbkJpbmFyeVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5hZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRUb0RpY3Rpb25hcnkoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25EaWN0aW9uYXJ5W2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICAvLyAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIC8vICAgICBpZih0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBjb25uZWN0aW9uLmlkKXtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbm5lY3Rpb25BcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgIT0gMCkge1xuICAgICAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZShjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5yZW1vdmVUeXBlQ29uY2VwdChjb25uZWN0aW9uLnR5cGVJZCwgY29ubmVjdGlvbi5pZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25UcmVlKCkge1xuICAgICAgICByZXR1cm4gQ29ubmVjdGlvbkJpbmFyeVRyZWUuY29ubmVjdGlvbnJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uVHlwZVRyZWUoKSB7XG4gICAgICAgIHJldHVybiBDb25uZWN0aW9uVHlwZVRyZWUuY29ubmVjdGlvblR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgLy8gICAgdmFyICBteUNvbmNlcHQ6IENvbm5lY3Rpb258bnVsbDtcbiAgICAgICAgICAgIC8vICAgIG15Q29uY2VwdCA9IG51bGw7XG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBpPTA7IGk8dGhpcy5jb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBpZCl7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBteUNvbmNlcHQgPSB0aGlzLmNvbm5lY3Rpb25BcnJheVtpXTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbXlDb25jZXB0O1xuICAgICAgICAgICAgdmFyIG15Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB5aWVsZCBDb25uZWN0aW9uQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbmNlcHQgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlDb25uZWN0aW9uID0gcmV0dXJuZWRDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmKG15Q29uY2VwdC5pZCA9PSAwIHx8IG15Q29uY2VwdCA9PSBudWxsKXtcbiAgICAgICAgICAgIC8vICAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNvbmNlcHRzQXJyYXlbaV0uaWQgPT0gaWQpe1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgbXlDb25jZXB0ID0gdGhpcy5jb25jZXB0c0FycmF5W2ldO1xuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIG15Q29ubmVjdGlvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gW107XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHlpZWxkIENvbm5lY3Rpb25UeXBlVHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbm5lY3Rpb24gPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15Q29ubmVjdGlvbiA9IHJldHVybmVkQ29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChteUNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2gobm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZihteUNvbmNlcHQuaWQgPT0gMCB8fCBteUNvbmNlcHQgPT0gbnVsbCl7XG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBpPTA7IGk8dGhpcy5jb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYodGhpcy5jb25jZXB0c0FycmF5W2ldLmlkID09IGlkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG15Q29uY2VwdCA9IHRoaXMuY29uY2VwdHNBcnJheVtpXTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxufVxuQ29ubmVjdGlvbkRhdGEuY29ubmVjdGlvbkFycmF5ID0gW107XG5Db25uZWN0aW9uRGF0YS5jb25uZWN0aW9uRGljdGlvbmFyeSA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIEZpbHRlclNlYXJjaCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dpY29wZXJhdG9yID0gXCI9XCI7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uID0gdHJ1ZTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgSWRlbnRpZmllckZsYWdzIHtcbn1cbklkZW50aWZpZXJGbGFncy5pc1R5cGVMb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0NoYXJhY3RlckxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzRGF0YUxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzTG9jYWxEYXRhTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENoYXJhY3RlckxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzTG9jYWxUeXBlTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uVHlwZUxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDb25uZWN0aW9uTG9hZGVkID0gZmFsc2U7XG4iLCJleHBvcnQgY2xhc3MgTENvbmNlcHQge1xuICAgIGNvbnN0cnVjdG9yKGlkLCB1c2VySWQsIHR5cGVJZCwgY2F0ZWdvcnlJZCwgYWNjZXNzSWQsIGNoYXJhY3RlclZhbHVlLCB0eXBlQ2hhcmFjdGVyLCBpc05ldyA9IGZhbHNlLCBlbnRyeVRpbWVTdGFtcCwgdXBkYXRlZFRpbWVTdGFtcCwgcmVmZXJlbnRJZCkge1xuICAgICAgICB0aGlzLnN0cnVjdHVyZVR5cGUgPSBcImxjb25jZXB0XCI7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU3luY2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHRoaXMudHlwZUlkID0gdHlwZUlkO1xuICAgICAgICB0aGlzLmdob3N0SWQgPSBpZDtcbiAgICAgICAgdGhpcy5jYXRlZ29yeUlkID0gY2F0ZWdvcnlJZDtcbiAgICAgICAgdGhpcy5jaGFyYWN0ZXJWYWx1ZSA9IGNoYXJhY3RlclZhbHVlO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMudHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldztcbiAgICAgICAgdGhpcy50eXBlQ2hhcmFjdGVyID0gdHlwZUNoYXJhY3RlcjtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IGVudHJ5VGltZVN0YW1wO1xuICAgICAgICB0aGlzLnVwZGF0ZWRUaW1lU3RhbXAgPSB1cGRhdGVkVGltZVN0YW1wO1xuICAgICAgICB0aGlzLmlzU3luY2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVmZXJlbnRJZCA9IHJlZmVyZW50SWQ7XG4gICAgICAgIC8vIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHRoaXMpO1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnR5cGVJZCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdFwiO1xuZXhwb3J0IGNsYXNzIExDb25uZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQsIGFjY2Vzc0lkKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHlwZSA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMub2ZUaGVDb25jZXB0SWQgPSBvZlRoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy50b1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMub3JkZXJJZCA9IG9yZGVySWQ7XG4gICAgICAgIHRoaXMudHlwZUNoYXJhY3RlciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWNjZXNzSWQgPSBhY2Nlc3NJZDtcbiAgICAgICAgdGhpcy50eXBlQ2hhcmFjdGVyID0gXCJcIjtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudGVybWluYXRpb25EYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTeW5jVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIExOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKSB7XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLnR5cGVJZCAhPSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQgPT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICBub2RlLnZhcmlhbnRzLnB1c2gocGFzc2VkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiApe1xuICAgICAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsXCIpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJsZWZ0ICBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIpe1xuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVsc2UgaGVyZVwiLCBub2RlLCBwYXNzZWROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIgJiYgbm9kZS52YWx1ZS5pZCAhPSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZWlnaHQgaGVyZVwiLCBub2RlLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFsYW5jaW5nRmFjdG9yIGhlcmVcIiwgYmFsYW5jaW5nRmFjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAxIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAyIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAzIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZTQgXCIsIHJldHVybmVyLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIndoYXQgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDZcIiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJpZ2h0Um90YXRlKHkpIHtcbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIGxldCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0geTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh5LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgICBsZWZ0Um90YXRlKHgpIHtcbiAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgIGxldCB5ID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB1cGRhdGVOb2RlU3luY1N0YXR1cyhpZCwgdmFsdWUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGxldCBsY29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgbGNvbmNlcHQuaXNTeW5jZWQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlTm9kZVN5bmNTdGF0dXMoaWQsIHZhbHVlLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVOb2RlU3luY1N0YXR1cyhpZCwgdmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlKSB7XG4gICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlICYmIHR5cGVJZCA9PSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUudHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnZhcmlhbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIG5vZGUpIHtcbiAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgJiYgY2F0ZWdvcnlJZCA9PSBub2RlLnZhbHVlLmNhdGVnb3J5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnZhcmlhbnRzW2ldLnZhbHVlLmNhdGVnb3J5SWQgPT0gY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnZhcmlhbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZENhdGVnb3J5KHZhbHVlLCBjYXRlZ29yeUlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJlbW92ZU5vZGUocGFzc2VkTm9kZSwgaWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoID4gMCl7XG4gICAgICAgIC8vICAgICBpZihwYXNzZWROb2RlLnZhbHVlLmlkID09IGlkICl7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgIC8vICAgICBpZihuZXdOb2RlKXtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gbmV3Tm9kZS52YWx1ZTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmtleSA9IG5ld05vZGUua2V5O1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IHR5cGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUubGVmdE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy9jb25kaXRpb24gaWYgdGhlIG1haW4gbm9kZSBpcyBlcXVhbCB0byB0aGUgdmFsdWVcbiAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLmlkID09IGNvbmNlcHRJZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdOb2RlID0gcGFzc2VkTm9kZS52YXJpYW50c1swXTtcbiAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gbmV3Tm9kZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IG5ld05vZGUuY3VycmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMuc3BsaWNlKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIG1haW4gbm9kZSBpcyBub3QgZXF1YWwgdG8gdGhlIGNoZWNraW5nIHZhbHVlIFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VwdElkID09IHBhc3NlZE5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cyA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YXJpYW50cztcbiAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBpbW1lZGlhdGVTdWNjZXNzb3IuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvdW50Tm9kZUJlbG93KHJvb3QpIHtcbiAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWN1cnNpdmUgY2FsbCB0byBsZWZ0IGNoaWxkIGFuZCByaWdodCBjaGlsZCBhbmRcbiAgICAgICAgLy8gYWRkIHRoZSByZXN1bHQgb2YgdGhlc2Ugd2l0aCAxICggMSBmb3IgY291bnRpbmcgdGhlIHJvb3QpXG4gICAgICAgIHJldHVybiAxICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LmxlZnROb2RlKSArIHRoaXMuY291bnROb2RlQmVsb3cocm9vdC5yaWdodE5vZGUpO1xuICAgIH1cbiAgICBpbk9yZGVyU3VjY2Vzc29yKHJvb3QpIHtcbiAgICAgICAgd2hpbGUgKHJvb3QubGVmdE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdCA9IHJvb3QubGVmdE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi8uLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeUNoYXJhY3RlclRyZWUge1xuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDaGFyYWN0ZXJMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QgPSBub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290ID0gdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QuYWRkQ2hhcmFjdGVyTm9kZShub2RlLCB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICB9XG4gICAgc3RhdGljIGdldENoYXJhY3RlckFuZFR5cGVGcm9tVHJlZSh2YWx1ZSwgdHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRDYXRlZ29yeUZyb21UcmVlKHZhbHVlLCBjYXRlZ29yeUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRUeXBlKGNoYXJhY3RlciwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5Mb2NhbENoYXJhY3RlclJvb3QsIGNoYXJhY3RlciwgaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdmFyIGNoYXJhY3Rlck5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUodmFsdWUsIHR5cGVJZCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgIH1cbiAgICBzdGF0aWMgdXBkYXRlU3luY1N0YXR1cyhpZCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC51cGRhdGVOb2RlU3luY1N0YXR1cyhpZCwgdHJ1ZSwgdGhpcy5yb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuTG9jYWxCaW5hcnlUcmVlLnJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi8uLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeVR5cGVUcmVlIHtcbiAgICBzdGF0aWMgYWRkTm9kZVRvVHJlZShub2RlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5Mb2NhbFR5cGVSb290ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkxvY2FsVHlwZVJvb3QgPSBub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsVHlwZVJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLkxvY2FsVHlwZVJvb3QgPSB0aGlzLkxvY2FsVHlwZVJvb3QuYWRkVHlwZU5vZGUobm9kZSwgdGhpcy5Mb2NhbFR5cGVSb290LCB0aGlzLkxvY2FsVHlwZVJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsVHlwZVJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LnR5cGVJZCAhPSAwKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LnR5cGVJZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRUeXBlKHR5cGVJZCwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTG9jYWxUeXBlUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5Mb2NhbFR5cGVSb290ID0gdGhpcy5Mb2NhbFR5cGVSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5Mb2NhbFR5cGVSb290LCB0eXBlSWQsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLkxvY2FsVHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5Mb2NhbFR5cGVSb290LmdldEZyb21Ob2RlKGlkLCB0aGlzLkxvY2FsVHlwZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxUeXBlUm9vdDtcbiAgICB9XG4gICAgc3RhdGljIGdldFR5cGVWYXJpYW50c0Zyb21UcmVlKHR5cGVJZCkge1xuICAgICAgICB2YXIgTm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21UcmVlKHR5cGVJZCk7XG4gICAgICAgIHZhciBjb25jZXB0cyA9IFtdO1xuICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlID09PSBudWxsIHx8IE5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IE5vZGUudmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0xvY2FsVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChMb2NhbEJpbmFyeVR5cGVUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21UcmVlKHR5cGVJZCk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgbm9kZSB0byB0eXBlXCIsIE5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQgfHwgTm9kZS52YWx1ZS51c2VySWQgPT0gOTk5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQgfHwgTm9kZS52YWx1ZS51c2VySWQgPT0gOTk5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Mb2NhbEJpbmFyeVR5cGVUcmVlLkxvY2FsVHlwZVJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyByZW1vdmVGcm9tRGF0YWJhc2UsIHN0b3JlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9pbmRleGRibG9jYWxcIjtcbmltcG9ydCB7IExvY2FsQmluYXJ5VHJlZSB9IGZyb20gXCIuL0xvY2FsQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBMb2NhbEJpbmFyeVR5cGVUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlUeXBlVHJlZVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdFwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBDb252ZXJ0RnJvbUxDb25jZXB0VG9Db25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHRcIjtcbmltcG9ydCB7IExvY2FsR2hvc3RJZFRyZWUgfSBmcm9tIFwiLi9Mb2NhbEdob3N0SWRUcmVlXCI7XG5leHBvcnQgY2xhc3MgTG9jYWxDb25jZXB0c0RhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcImNvbmNlcHRzQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgdGhpcy5sb2NhbGNvbmNlcHRzQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkUGVybWFuZW50Q29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5VHJlZS5yZW1vdmVOb2RlRnJvbVRyZWUoY29uY2VwdC5naG9zdElkKTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5yZW1vdmVDb25jZXB0VHlwZShjb25jZXB0LmNoYXJhY3RlclZhbHVlLCBjb25jZXB0Lmdob3N0SWQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5yZW1vdmVDb25jZXB0VHlwZShjb25jZXB0LnR5cGVJZCwgY29uY2VwdC5naG9zdElkKTtcbiAgICAgICAgICAgIExvY2FsR2hvc3RJZFRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIHJlbW92ZUZyb21EYXRhYmFzZShcImxvY2FsY29uY2VwdFwiLCBjb25jZXB0Lmdob3N0SWQpO1xuICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoQ29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdChjb25jZXB0KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHRUb01lbW9yeShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5VHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVR5cGVUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHQoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBteUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIHZhciBub2RlID0geWllbGQgTG9jYWxCaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICBteUNvbmNlcHQgPSByZXR1cm5lZENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG15Q29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBVcGRhdGVDb25jZXB0U3luY1N0YXR1cyhpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUcmVlLnVwZGF0ZVN5bmNTdGF0dXMoaWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUdob3N0SWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBteUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIHZhciBub2RlID0geWllbGQgTG9jYWxHaG9zdElkVHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbmNlcHQgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlDb25jZXB0ID0gcmV0dXJuZWRDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgIH1cbiAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXROb2RlRnJvbVRyZWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJfdmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIC8vIGxldCBjb25jZXB0TGlzdDpDb25jZXB0W10gPSBhd2FpdCB0aGlzLkdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKTtcbiAgICAgICAgICAgIC8vIGZvcih2YXIgaT0wO2k8Y29uY2VwdExpc3QubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgIGlmKGNoYXJhY3Rlcl92YWx1ZSA9PSBjb25jZXB0TGlzdFtpXS5jaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHlpZWxkIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLCB0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5TG9jYWwoY2hhcmFjdGVyX3ZhbHVlLCBjYXRlZ29yeUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB5aWVsZCBMb2NhbEJpbmFyeUNoYXJhY3RlclRyZWUuZ2V0Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tVHJlZShjaGFyYWN0ZXJfdmFsdWUsIGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKSB7XG4gICAgICAgIHZhciBteUNvbmNlcHQ7XG4gICAgICAgIGxldCBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubG9jYWxjb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0udHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgbXlDb25jZXB0O1xuICAgICAgICAgICAgbGV0IENvbmNlcHRMaXN0ID0gW107XG4gICAgICAgICAgICAvLyBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS50eXBlSWQgPT0gdHlwZUlkICYmIHRoaXMuY29uY2VwdHNBcnJheVtpXS51c2VySWQgPT0gdXNlcklkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5jb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgIC8vICAgICAgfVxuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIENvbmNlcHRMaXN0ID0geWllbGQgTG9jYWxCaW5hcnlUeXBlVHJlZS5nZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpO1xuICAgICAgICAgICAgcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG5Mb2NhbENvbmNlcHRzRGF0YS5sb2NhbGNvbmNlcHRzQXJyYXkgPSBbXTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL2luZGV4ZGJsb2NhbFwiO1xuaW1wb3J0IHsgcmVtb3ZlRnJvbURhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL2luZGV4ZGJsb2NhbFwiO1xuaW1wb3J0IHsgQ29udmVydEZyb21MQ29ubmVjdGlvblRvQ29ubmVjdGlvbiB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9Mb2NhbC9Db252ZXJ0RnJvbUxDb25uZWN0aW9uVG9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9Db25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4uL0lkZW50aWZpZXJGbGFnc1wiO1xuZXhwb3J0IGNsYXNzIExvY2FsQ29ubmVjdGlvbkRhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNvbm5lY3Rpb24gQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IHRoaXMuQ2hlY2tDb250YWlucyhjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgIT0gMCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRUb0RpY3Rpb25hcnkoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25EaWN0aW9uYXJ5W2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCAhPSAwKSB7XG4gICAgICAgICAgICAvLyAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRQZXJtYW5lbnRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgPiAwKSB7XG4gICAgICAgICAgICByZW1vdmVGcm9tRGF0YWJhc2UoXCJsb2NhbGNvbm5lY3Rpb25cIiwgY29ubmVjdGlvbi5naG9zdElkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24oQ29udmVydEZyb21MQ29ubmVjdGlvblRvQ29ubmVjdGlvbihjb25uZWN0aW9uKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIG15Q29uY2VwdDtcbiAgICAgICAgbXlDb25jZXB0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgbXlDb25jZXB0ID0gdGhpcy5jb25uZWN0aW9uQXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15Q29uY2VwdDtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENvbm5lY3Rpb25Mb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxDb25uZWN0aW9uRGF0YS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS50eXBlSWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2godGhpcy5jb25uZWN0aW9uQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbk9mQ29tcG9zaXRpb25BbmRUeXBlTG9jYWwodHlwZUlkLCBvZlRoZUNvbmNlcHRJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgY29ubmVjdGlvbnNcIiwgdGhpcy5jb25uZWN0aW9uQXJyYXksIHR5cGVJZCwgb2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLnR5cGVJZCA9PSB0eXBlSWQgJiYgdGhpcy5jb25uZWN0aW9uQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQgPT0gb2ZUaGVDb25jZXB0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2godGhpcy5jb25uZWN0aW9uQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cbn1cbkxvY2FsQ29ubmVjdGlvbkRhdGEuY29ubmVjdGlvbkFycmF5ID0gW107XG5Mb2NhbENvbm5lY3Rpb25EYXRhLmNvbm5lY3Rpb25EaWN0aW9uYXJ5ID0gW107XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEdob3N0SWRUcmVlIHtcbiAgICBzdGF0aWMgYWRkTm9kZVRvVHJlZShub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gbm9kZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QuYWRkTm9kZShub2RlLCB0aGlzLnJvb3QsIHRoaXMucm9vdC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5naG9zdElkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0xvY2FsRGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChMb2NhbEdob3N0SWRUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuTG9jYWxHaG9zdElkVHJlZS5yb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlVGhlR2hvc3RDb25jZXB0QXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlR2hvc3RDb25jZXB0QXBpXCI7XG5pbXBvcnQgeyBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vLi4vRGF0YWJhc2UvaW5kZXhkYmxvY2FsXCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi9Mb2NhbENvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgY2xhc3MgTG9jYWxTeW5jRGF0YSB7XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29uY2VwdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIFN5bmNEYXRhRGVsZXRlKGlkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlkID09IHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS5vZlRoZUNvbmNlcHRJZCA9PSBpZCB8fCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQgPT0gaWQgfHwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLnR5cGVJZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnNDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGxldCBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBsZXQgZXhpc3RpbmdDb25jZXB0ID0gTG9jYWxTeW5jRGF0YS5DaGVja0lmVGhlQ29uY2VwdElkRXhpc3RzKGNvbmNlcHQuaWQsIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5LnB1c2goY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldLmlkID09IGNvbmNlcHQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgU3luY0RhdGFPbmxpbmUoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgY29uY2VwdHNBcnJheSA9IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgIGxldCB0b1N5bmNDb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy9pZighY29uY2VwdHNBcnJheVtpXS5pc1N5bmNlZCl7XG4gICAgICAgICAgICAgICAgdG9TeW5jQ29uY2VwdHMucHVzaChjb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWQgdG8gZGVub3RlIHRoYXQgdGhlIGxvY2FsIGNvbmNlcHQgaGFzIGFscmVhZHkgYmVlbiBzeW5jZWQgd2l0aCB0aGUgb25saW5lIGRiXG4gICAgICAgICAgICAgICAgeWllbGQgTG9jYWxDb25jZXB0c0RhdGEuVXBkYXRlQ29uY2VwdFN5bmNTdGF0dXMoY29uY2VwdHNBcnJheVtpXS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbnNBcnJheSA9IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zbGljZSgpO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICAvL2lmKGNvbm5lY3Rpb25zQXJyYXkubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLlVwZGF0ZUNvbmNlcHRMaXN0VG9JbmNsdWRlUmVsYXRlZENvbmNlcHRzKGNvbm5lY3Rpb25zQXJyYXksIHRvU3luY0NvbmNlcHRzKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCBDcmVhdGVUaGVHaG9zdENvbmNlcHRBcGkodG9TeW5jQ29uY2VwdHMsIGNvbm5lY3Rpb25zQXJyYXkpO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHRzID0gcmVzdWx0LmNvbmNlcHRzO1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0gcmVzdWx0LmNvbm5lY3Rpb25zO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZFBlcm1hbmVudENvbmNlcHQoY29uY2VwdHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIExvY2FsQ29ubmVjdGlvbkRhdGEuQWRkUGVybWFuZW50Q29ubmVjdGlvbihjb25uZWN0aW9uc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL31cbiAgICAgICAgICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vICBzdGF0aWMgYXN5bmMgIFN5bmNEYXRhT25saW5lKCl7XG4gICAgLy8gICAgIGlmKHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoID4gMCl7XG4gICAgLy8gICAgICAgICBsZXQgY29uY2VwdHNBcnJheSA9IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAvLyAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcbiAgICAvLyAgICAgICAgIGxldCBjb25jZXB0cyA9IGF3YWl0IENyZWF0ZVRoZUdob3N0Q29uY2VwdEFwaShjb25jZXB0c0FycmF5KTtcbiAgICAvLyAgICAgICAgIGZvcihsZXQgaSA9MCA7IGk8IGNvbmNlcHRzLmxlbmd0aDsgaSsrKXtcbiAgICAvLyAgICAgICAgICAgICBMb2NhbFN5bmNEYXRhLmdob3N0SWRNYXAuc2V0KGNvbmNlcHRzW2ldLmdob3N0SWQsY29uY2VwdHNbaV0uaWQpO1xuICAgIC8vICAgICAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZFBlcm1hbmVudENvbmNlcHQoY29uY2VwdHNbaV0pO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgICBpZih0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCl7XG4gICAgLy8gICAgICAgICAvLyBmb3IobGV0IGkgPTAgOyBpPHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGggOyBpKyspe1xuICAgIC8vICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHRoZSBjb25uZWN0aW9uIGluIGJhY2tlbmRcIiwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLm9mVGhlQ29uY2VwdElkICsgXCI9PT09XCIgKyB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgIC8vICAgICAgICAgLy8gfVxuICAgIC8vICAgICAgICAgbGV0IGNvbm5lY3Rpb25zQXJyYXkgPSB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAvLyAgICAgICAgIHRoaXMuQ29udmVydEdob3N0SWRzSW5Db25uZWN0aW9ucyhjb25uZWN0aW9uc0FycmF5KTtcbiAgICAvLyAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgIC8vICAgICAgICAgYXdhaXQgQ3JlYXRlVGhlR2hvc3RDb25uZWN0aW9uQXBpKGNvbm5lY3Rpb25zQXJyYXkpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAvLyAgfVxuICAgIHN0YXRpYyBDb252ZXJ0R2hvc3RJZHNJbkNvbm5lY3Rpb25zKGNvbm5lY3Rpb25BcnJheSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvZlRoZUNvbmNlcHRJZCA9IGNvbm5lY3Rpb25BcnJheVtpXS5vZlRoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgIGxldCB0b1RoZUNvbmNlcHRJZCA9IGNvbm5lY3Rpb25BcnJheVtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgIGxldCB0eXBlSWQgPSBjb25uZWN0aW9uQXJyYXlbaV0udHlwZUlkO1xuICAgICAgICAgICAgbGV0IG5ld09mVGhlQ29uY2VwdElkID0gKF9hID0gTG9jYWxTeW5jRGF0YS5naG9zdElkTWFwLmdldChvZlRoZUNvbmNlcHRJZCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG9mVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgbGV0IG5ld1RvVGhlQ29uY2VwdElkID0gKF9iID0gTG9jYWxTeW5jRGF0YS5naG9zdElkTWFwLmdldCh0b1RoZUNvbmNlcHRJZCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgbGV0IG5ld1R5cGVJZCA9IChfYyA9IExvY2FsU3luY0RhdGEuZ2hvc3RJZE1hcC5nZXQodHlwZUlkKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdHlwZUlkO1xuICAgICAgICAgICAgY29ubmVjdGlvbkFycmF5W2ldLm9mVGhlQ29uY2VwdElkID0gbmV3T2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICBjb25uZWN0aW9uQXJyYXlbaV0udG9UaGVDb25jZXB0SWQgPSBuZXdUb1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS50eXBlSWQgPSBuZXdUeXBlSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFVwZGF0ZUNvbmNlcHRMaXN0VG9JbmNsdWRlUmVsYXRlZENvbmNlcHRzKGNvbm5lY3Rpb25BcnJheSwgY29uY2VwdHNBcnJheSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb2ZUaGVDb25jZXB0SWQgPSBjb25uZWN0aW9uQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvVGhlQ29uY2VwdElkID0gY29ubmVjdGlvbkFycmF5W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlSWQgPSBjb25uZWN0aW9uQXJyYXlbaV0udHlwZUlkO1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mVGhlQ29uY2VwdCA9IHRoaXMuQ2hlY2tJZlRoZUNvbmNlcHRJZEV4aXN0cyhvZlRoZUNvbmNlcHRJZCwgY29uY2VwdHNBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZUaGVDb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5R2hvc3RJZChvZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0LmlkICE9IG9mVGhlQ29uY2VwdC5naG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS5vZlRoZUNvbmNlcHRJZCA9IG9mVGhlQ29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZlRoZUNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KG9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gc3luY2VkIGJlZm9yZSBhbmQgaXMgYSBjb21wb3NpdGlvbiB0eXBlIHRoZW4gZG8gbm90IHNlbmQgaXQgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9mVGhlQ29uY2VwdC5pc1N5bmNlZCAmJiAhb2ZUaGVDb25jZXB0LmlzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHNBcnJheS5wdXNoKG9mVGhlQ29uY2VwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b1RoZUNvbmNlcHRJZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvVGhlQ29uY2VwdCA9IHRoaXMuQ2hlY2tJZlRoZUNvbmNlcHRJZEV4aXN0cyh0b1RoZUNvbmNlcHRJZCwgY29uY2VwdHNBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b1RoZUNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9UaGVDb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5R2hvc3RJZCh0b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9UaGVDb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9UaGVDb25jZXB0LmlkICE9IHRvVGhlQ29uY2VwdC5naG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS50b1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1RoZUNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gc3luY2VkIGJlZm9yZSBhbmQgaXMgYSBjb21wb3NpdGlvbiB0eXBlIHRoZW4gZG8gbm90IHNlbmQgaXQgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvVGhlQ29uY2VwdC5pc1N5bmNlZCAmJiAhdG9UaGVDb25jZXB0LmlzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHNBcnJheS5wdXNoKHRvVGhlQ29uY2VwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlSWQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5DaGVja0lmVGhlQ29uY2VwdElkRXhpc3RzKHR5cGVJZCwgY29uY2VwdHNBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlkID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlHaG9zdElkKHR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuaWQgIT0gdHlwZS5naG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS50eXBlSWQgPSB0eXBlLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIHN5bmNlZCBiZWZvcmUgYW5kIGlzIGEgY29tcG9zaXRpb24gdHlwZSB0aGVuIGRvIG5vdCBzZW5kIGl0IGFnYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzU3luY2VkICYmICF0eXBlLmlzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHNBcnJheS5wdXNoKHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBDaGVja0lmVGhlQ29uY2VwdElkRXhpc3RzKGlkLCBjb25jZXB0TGlzdCA9IFtdKSB7XG4gICAgICAgIGxldCByZXR1cm5Db25jZXB0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBjb25jZXB0TGlzdFtpXS5naG9zdElkIHx8IGlkID09IGNvbmNlcHRMaXN0W2ldLmlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuQ29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXR1cm5Db25jZXB0O1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5wdXNoKGNvbm5lY3Rpb24pO1xuICAgIH1cbiAgICBzdGF0aWMgUmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBzeW5jRGF0YUxvY2FsRGIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImxvY2FsY29uY2VwdFwiLCB0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiZG9uZVwiO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Mb2NhbFN5bmNEYXRhLmNvbmNlcHRzU3luY0FycmF5ID0gW107XG5Mb2NhbFN5bmNEYXRhLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbkxvY2FsU3luY0RhdGEuZ2hvc3RJZE1hcCA9IG5ldyBNYXAoKTtcbiIsImV4cG9ydCBjbGFzcyBOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKSB7XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLnR5cGVJZCAhPSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQgPT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICBub2RlLnZhcmlhbnRzLnB1c2gocGFzc2VkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiApe1xuICAgICAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsXCIpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJsZWZ0ICBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIpe1xuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVsc2UgaGVyZVwiLCBub2RlLCBwYXNzZWROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIgJiYgbm9kZS52YWx1ZS5pZCAhPSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZWlnaHQgaGVyZVwiLCBub2RlLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFsYW5jaW5nRmFjdG9yIGhlcmVcIiwgYmFsYW5jaW5nRmFjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAxIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAyIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAzIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZTQgXCIsIHJldHVybmVyLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIndoYXQgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDZcIiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJpZ2h0Um90YXRlKHkpIHtcbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIGxldCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0geTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh5LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgICBsZWZ0Um90YXRlKHgpIHtcbiAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgIGxldCB5ID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0Q2hhcmFjdGVyRnJvbU5vZGVVcGRhdGVkKHZhbHVlLCBub2RlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSB8fCAoKF9hID0gbm9kZS52YWx1ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnR5cGVJZCkgPT0gNTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUpIHtcbiAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgJiYgdHlwZUlkID09IG5vZGUudmFsdWUudHlwZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS50eXBlSWQgPT0gdHlwZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFyaWFudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgbm9kZSkge1xuICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSAmJiBjYXRlZ29yeUlkID09IG5vZGUudmFsdWUuY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuY2F0ZWdvcnlJZCA9PSBjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFyaWFudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZENhdGVnb3J5KHZhbHVlLCBjYXRlZ29yeUlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKXtcbiAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gaWQgKXtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHZhciBuZXdOb2RlID0gcGFzc2VkTm9kZS52YXJpYW50c1swXTtcbiAgICAgICAgLy8gICAgIGlmKG5ld05vZGUpe1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IG5ld05vZGUuY3VycmVudE5vZGU7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cyA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YXJpYW50cztcbiAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBpbW1lZGlhdGVTdWNjZXNzb3IuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IHR5cGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL2NvbmRpdGlvbiBpZiB0aGUgbWFpbiBub2RlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gY29uY2VwdElkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IG5ld05vZGUua2V5O1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb25kaXRpb24gdGhhdCB0aGUgbWFpbiBub2RlIGlzIG5vdCBlcXVhbCB0byB0aGUgY2hlY2tpbmcgdmFsdWUgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXB0SWQgPT0gcGFzc2VkTm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5LCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUGF0Y2hlclN0cnVjdHVyZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25JZCA9IDA7XG4gICAgICAgIHRoaXMudXNlcklkID0gOTk5O1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IDk5OTtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHRoaXMub2ZUaGVDb21wb3NpdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy5wYXRjaE9iamVjdCA9IHt9O1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRzIH0gZnJvbSBcIi4uL0FwaS9HZXRSZXNlcnZlZENvbm5lY3Rpb25JZHNcIjtcbmltcG9ydCB7IEdldFJlc2VydmVkSWRzIH0gZnJvbSBcIi4uL0FwaS9HZXRSZXNlcnZlZElkc1wiO1xuZXhwb3J0IGNsYXNzIFJlc2VydmVkSWRzIHtcbiAgICBzdGF0aWMgZ2V0SWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZHMubGVuZ3RoIDwgNSkge1xuICAgICAgICAgICAgICAgIHZhciBpZHMgPSB5aWVsZCBHZXRSZXNlcnZlZElkcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5pZHNbMF07XG4gICAgICAgICAgICB0aGlzLmlkcy5zaGlmdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEFkZElkKGlkKSB7XG4gICAgICAgIGlmICghdGhpcy5pZHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmlkcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblJlc2VydmVkSWRzLmlkcyA9IFtdO1xuZXhwb3J0IGNsYXNzIFJlc2VydmVkQ29ubmVjdGlvbklkcyB7XG4gICAgc3RhdGljIGdldElkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbklkcy5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25JZHMgPSB5aWVsZCBHZXRSZXNlcnZlZENvbm5lY3Rpb25JZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY29ubmVjdGlvbklkc1swXTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkcy5zaGlmdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEFkZElkKGlkKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uSWRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uSWRzLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuUmVzZXJ2ZWRDb25uZWN0aW9uSWRzLmNvbm5lY3Rpb25JZHMgPSBbXTtcbiIsImV4cG9ydCBjbGFzcyBSZXR1cm5lciB7XG4gICAgY29uc3RydWN0b3IoaWQsIHVzZXJJZCwgcmVmZXJlbnRJZCwgaXNOZXcpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudElkID0gcmVmZXJlbnRJZDtcbiAgICAgICAgdGhpcy5pc05ldyA9IGlzTmV3O1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTZWFyY2hRdWVyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLnR5cGUgPSBcIlwiO1xuICAgICAgICB0aGlzLmxpbmtlciA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW5wYWdlID0gMTA7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIHRoaXMubGlzdExpbmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5mdWxsTGlua2VycyA9IFtdO1xuICAgICAgICB0aGlzLnRleHRTZWFyY2ggPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2ljID0gXCJvclwiO1xuICAgICAgICB0aGlzLnJldmVyc2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb0ZpbHRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpbHRlclNlYXJjaGVzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0b3JzID0gW107XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNlYXJjaFN0cnVjdHVyZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gXCJcIjtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbiA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb21wb3NpdGlvbiA9IFwiXCI7XG4gICAgICAgIHRoaXMudXNlcklkID0gOTk5O1xuICAgICAgICB0aGlzLmlucGFnZSA9IDEwO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBUb2tlblN0b3JhZ2Uge1xufVxuVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gXCJcIjtcbiIsImV4cG9ydCBjbGFzcyBTZXNzaW9uRGF0YSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaWQgPSBcIjBcIjtcbiAgICAgICAgdGhpcy5yZW1vdGVfYWRkcmVzcyA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VydmVyX3BvcnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlcnZlcl9hZGRyZXNzID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZXJ2ZXJfbmFtZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VydmVyX3NvZnR3YXJlID0gXCJcIjtcbiAgICAgICAgdGhpcy5odHRwX3VzZXJfYWdlbnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlbGYgPSBcIlwiO1xuICAgICAgICB0aGlzLnBvcnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IFwiXCI7XG4gICAgICAgIHRoaXMuZW1haWwgPSBcIlwiO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTZXR0aW5nRGF0YSB7XG4gICAgY29uc3RydWN0b3IoaXNPbmxpbmVTeW5jKSB7XG4gICAgICAgIHRoaXMuaWQgPSAxO1xuICAgICAgICB0aGlzLmlzT25saW5lU3luYyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzT25saW5lU3luYyA9IGlzT25saW5lU3luYztcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgU2V0dGluZ3Mge1xufVxuU2V0dGluZ3MuaXNVcGRhdGVkID0gZmFsc2U7XG5TZXR0aW5ncy5pc09ubGluZVN5bmMgPSBmYWxzZTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4vLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25jZXB0QXBpIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29uY2VwdEFwaVwiO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaSB9IGZyb20gXCIuLi9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNvbm5lY3Rpb25BcGlcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgY2xhc3MgU3luY0RhdGEge1xuICAgIHN0YXRpYyBDaGVja0NvbnRhaW5zKGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbnM7XG4gICAgfVxuICAgIHN0YXRpYyBTeW5jRGF0YURlbGV0ZShpZCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSB0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQgPT0gaWQgfHwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLnRvVGhlQ29uY2VwdElkID09IGlkIHx8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS50eXBlSWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBDaGVja0NvbnRhaW5zQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS5pZCA9PSBjb25uZWN0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHRUZW1wb3JhcnkoY29uY2VwdCk7XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgUmVtb3ZlQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5LnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBSZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFN5bmNEYXRhT25saW5lKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24odGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdHNBcnJheSA9IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICAgICAgQ3JlYXRlVGhlQ29uY2VwdEFwaShjb25jZXB0c0FycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZvcihsZXQgaSA9MCA7IGk8dGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aCA7IGkrKyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHRoZSBjb25uZWN0aW9uIGluIGJhY2tlbmRcIiwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLm9mVGhlQ29uY2VwdElkICsgXCI9PT09XCIgKyB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGlvbnNBcnJheSA9IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25BcGkoY29ubmVjdGlvbnNBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJkb25lXCI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgc3luY0RhdGFMb2NhbERiKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgdGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImxvY2FsY29ubmVjdGlvblwiLCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuU3luY0RhdGEuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcblN5bmNEYXRhLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbiIsImV4cG9ydCBjbGFzcyBUaGVDaGFyYWN0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJJZCwgZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgZW50cnlUaW1lc3RhbXAsIGlzTmV3KSB7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgICAgICB0aGlzLmlzTmV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLmRhdGEgPSBgJHtkYXRhfWA7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMuc2Vzc2lvblVzZXJJZCA9IHNlc3Npb25Vc2VySWQ7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldztcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgVGhlVGV4dHMge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJJZCwgZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgZW50cnlUaW1lc3RhbXAsIGlzTmV3KSB7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZWN1cml0eUlkID0gc2VjdXJpdHlJZDtcbiAgICAgICAgdGhpcy5zZWN1cml0eVVzZXJJZCA9IHNlY3VyaXR5VXNlcklkO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVXNlcklkID0gYWNjZXNzVXNlcklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uVXNlcklkID0gc2Vzc2lvblVzZXJJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVzdGFtcCA9IGVudHJ5VGltZXN0YW1wO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBVc2VyTm9kZSB9IGZyb20gXCIuL1VzZXJOb2RlXCI7XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi8uLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmV4cG9ydCBjbGFzcyBVc2VyQmluYXJ5VHJlZSB7XG4gICAgc3RhdGljIGNvbXBvc2l0ZUtleSh1c2VySWQsIHNlc3Npb25JZCkge1xuICAgICAgICBsZXQgdXNlckhleCA9ICgnMDAwMCcgKyB1c2VySWQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC00KTtcbiAgICAgICAgbGV0IHNlc3Npb25IZXggPSAoJzAwMDAnICsgc2Vzc2lvbklkLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtNCk7XG4gICAgICAgIHJldHVybiB1c2VySGV4ICsgc2Vzc2lvbkhleDtcbiAgICB9XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LmFkZE5vZGUobm9kZSwgdGhpcy5yb290LCB0aGlzLnJvb3QuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoVXNlckJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCwgdXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgVXNlck5vZGUoa2V5LCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKHVzZXJJZCwgc2Vzc2lvbklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZShrZXksIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUodXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5jb21wb3NpdGVLZXkodXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5yZW1vdmVOb2RlKHRoaXMucm9vdCwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY291bnROb2RlQmVsb3codGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5Vc2VyQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsImV4cG9ydCBjbGFzcyBVc2VyTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgIHRoaXMubGVmdE5vZGUgPSBsZWZ0Tm9kZTtcbiAgICAgICAgdGhpcy5yaWdodE5vZGUgPSByaWdodE5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlLnZhbHVlLnB1c2goLi4ucGFzc2VkTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBsZXQgeCA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IHk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeS5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgbGVmdFJvdGF0ZSh4KSB7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICBsZXQgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSB4O1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3JldHVybiB5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBnZXRIZWlnaHQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBnZXRCYWxhbmNlRmFjdG9yKE4pIHtcbiAgICAgICAgaWYgKE4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVpZ2h0KE4ubGVmdE5vZGUpIC0gdGhpcy5nZXRIZWlnaHQoTi5yaWdodE5vZGUpO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZShpZCwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKGlkID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFNldHRpbmdEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdEYXRhXCI7XG5pbXBvcnQgeyBJbmRleERiIH0gZnJvbSBcIi4vaW5kZXhlZGRiXCI7XG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBJbmRleERiLmRiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9EYXRhYmFzZShkYXRhYmFzZU5hbWUsIG9iamVjdCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldFN0YXRzRnJvbURhdGFiYXNlKCkge1xuICAgIHZhciBzZXR0aW5nc0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEodHJ1ZSk7XG4gICAgcmV0dXJuIHNldHRpbmdzRGF0YTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBBaVVwZGF0ZUZsYWcob2JqZWN0KSB7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUoZGF0YWJhc2VOYW1lLCB0eXBlLCBpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoZGF0YWJhc2VOYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tRGF0YWJhc2UoZGF0YWJhc2VOYW1lLCBpZCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZyb21Mb2NhbERiKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vYXBwXCI7XG52YXIgdmVyc2lvbiA9IDQ7XG5leHBvcnQgY2xhc3MgTG9jYWxJbmRleERiIHtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvcGVuRGF0YWJhc2UoZGF0YWJhc2VOYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKExvY2FsSW5kZXhEYi5kYikge1xuICAgICAgICAgICAgcmVzb2x2ZShMb2NhbEluZGV4RGIuZGIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYUxvY2FsXCIsIHZlcnNpb24pO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJXaHkgZGlkbid0IHlvdSBhbGxvdyBteSB3ZWIgYXBwIHRvIHVzZSBJbmRleGVkREI/IVwiKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBMb2NhbEluZGV4RGIuZGIgPSB0YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgcmVzb2x2ZShMb2NhbEluZGV4RGIuZGIpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICB2YXIgY29uY2VwdERiID0gXCJsb2NhbGNvbmNlcHRcIjtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uRGIgPSBcImxvY2FsY29ubmVjdGlvblwiO1xuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbmNlcHREYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29uY2VwdERiLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbm5lY3Rpb25EYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29ubmVjdGlvbkRiLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBvcGVuRGF0YWJhc2UoZGF0YWJhc2VOYW1lKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGIgPSBMb2NhbEluZGV4RGIuZGI7XG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgIHZhciBhbGxvYmplY3RzID0gb2JqZWN0U3RvcmUuZ2V0QWxsKCk7XG4gICAgICAgICAgICAgICAgYWxsb2JqZWN0cy5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0dWRlbnRzID0gYWxsb2JqZWN0cy5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R1ZGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2goc3R1ZGVudHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoQ29uY2VwdExpc3QpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcmVUb0RhdGFiYXNlKGRhdGFiYXNlTmFtZSwgb2JqZWN0KSB7XG4gICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSk7XG4gICAgbGV0IGRiO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYUxvY2FsXCIsIHZlcnNpb24pO1xuICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiV2h5IGRpZG4ndCB5b3UgYWxsb3cgbXkgd2ViIGFwcCB0byB1c2UgSW5kZXhlZERCPyFcIik7XG4gICAgfTtcbiAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB2YXIgZGIgPSB0YXJnZXQucmVzdWx0O1xuICAgICAgICBsZXQgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBsZXQgb2JqU3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICBvYmpTdG9yZS5hZGQob2JqZWN0KTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZyb21Mb2NhbERiKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oZGIgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IExvY2FsSW5kZXhEYi5kYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICAgICAgICAgIGxldCBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKGRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGFsbG9iamVjdHMgPSBvYmplY3RTdG9yZS5nZXRBbGwoKTtcbiAgICAgICAgICAgICAgICBhbGxvYmplY3RzLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R1ZGVudHMgPSBhbGxvYmplY3RzLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHVkZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2VwdExpc3QucHVzaChzdHVkZW50c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShDb25jZXB0TGlzdCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gICAvLyBEYXRhYmFzZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgICAvLyB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21EYXRhYmFzZShkYXRhYmFzZU5hbWUsIGlkKSB7XG4gICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKEJhc2VVcmwuQkFTRV9VUkwgKyBcIl9GcmVlU2NoZW1hTG9jYWxcIiwgdmVyc2lvbik7XG4gICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgdmFyIGRiID0gdGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgbGV0IGdldFJlcXVlc3QgPSBvYmplY3RTdG9yZS5kZWxldGUoaWQpO1xuICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIC8vIGNvbmNlcHQgPSAgZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIC8vIEFjY2VzcyB0aGUgcmV0cmlldmVkIGRhdGFcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBTZXR0aW5nRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TZXR0aW5nRGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG52YXIgdmVyc2lvbiA9IDQ7XG5leHBvcnQgY2xhc3MgSW5kZXhEYiB7XG59XG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChJbmRleERiLmRiKSB7XG4gICAgICAgICAgICByZXNvbHZlKEluZGV4RGIuZGIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYVwiLCB2ZXJzaW9uKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiV2h5IGRpZG4ndCB5b3UgYWxsb3cgbXkgd2ViIGFwcCB0byB1c2UgSW5kZXhlZERCPyFcIik7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgSW5kZXhEYi5kYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICByZXNvbHZlKEluZGV4RGIuZGIpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICB2YXIgY29uY2VwdERiID0gXCJjb25jZXB0XCI7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkRiID0gXCJjb25uZWN0aW9uXCI7XG4gICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBcInNldHRpbmdzXCI7XG4gICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoY29uY2VwdERiKSkgeyAvLyBpZiB0aGVyZSdzIG5vIGRhdGFiYXNlIG5hbWVcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShjb25jZXB0RGIsIHsga2V5UGF0aDogJ2lkJyB9KTsgLy8gY3JlYXRlIGl0XG4gICAgICAgICAgICAgICAgb2JqZWN0U3RvcmUudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB2YWx1ZXMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0U3RvcmUuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IG15T2JqZWN0U3RvcmUgPSBkYlxuICAgICAgICAgICAgICAgICAgICAvLyAudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKVxuICAgICAgICAgICAgICAgICAgICAvLyAub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbXlPYmplY3RTdG9yZS5hZGQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbm5lY3Rpb25EYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29ubmVjdGlvbkRiLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHNldHRpbmdzKSkge1xuICAgICAgICAgICAgICAgIGxldCBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKHNldHRpbmdzLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9EYXRhYmFzZShkYXRhYmFzZU5hbWUsIG9iamVjdCkge1xuICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAob2JqZWN0LmlkICE9IDApIHtcbiAgICAgICAgICAgIC8vdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0O1xuICAgICAgICAgICAgdmFyIGRiID0gSW5kZXhEYi5kYjtcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgICAgICBsZXQgb2JqU3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgb2JqU3RvcmUuYWRkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgIC8vICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3Q7XG4gICAgLy8gICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQgYXMgSURCRGF0YWJhc2U7XG4gICAgLy8gICAgIHZhciBjb25jZXB0RGIgPSBcImNvbmNlcHRcIjtcbiAgICAvLyAgICAgdmFyIGNvbm5lY3Rpb25EYiA9IFwiY29ubmVjdGlvblwiO1xuICAgIC8vICAgICB2YXIgc2V0dGluZ3MgPSBcInNldHRpbmdzXCJcbiAgICAvLyAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbmNlcHREYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgLy8gICAgICAgbGV0ICBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKGNvbmNlcHREYiwge2tleVBhdGg6ICdpZCd9KTsgLy8gY3JlYXRlIGl0XG4gICAgLy8gICAgICAgb2JqZWN0U3RvcmUudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAvLyAgICAgICAgICAgICAvLyBTdG9yZSB2YWx1ZXMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0U3RvcmUuXG4gICAgLy8gICAgICAgICAgICAgLy8gY29uc3QgbXlPYmplY3RTdG9yZSA9IGRiXG4gICAgLy8gICAgICAgICAgICAgLy8gLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIilcbiAgICAvLyAgICAgICAgICAgICAvLyAub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAvLyAgICAgICAgICAgICAvLyBteU9iamVjdFN0b3JlLmFkZChvYmplY3QpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoY29ubmVjdGlvbkRiKSkgeyAvLyBpZiB0aGVyZSdzIG5vIGRhdGFiYXNlIG5hbWVcbiAgICAvLyAgICAgICBsZXQgIG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29ubmVjdGlvbkRiLCB7a2V5UGF0aDogJ2lkJ30pOyAvLyBjcmVhdGUgaXRcbiAgICAvLyAgICAgICBvYmplY3RTdG9yZS50cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZighZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhzZXR0aW5ncykpe1xuICAgIC8vICAgICAgIGxldCAgb2JqZWN0U3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShzZXR0aW5ncywge2tleVBhdGg6ICdpZCd9KTsgLy8gY3JlYXRlIGl0XG4gICAgLy8gICAgICAgb2JqZWN0U3RvcmUudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG59XG4vLyBleHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlKGRhdGFiYXNlTmFtZTpzdHJpbmcsIGlkOm51bWJlcil7XG4vLyAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oKCk9Pntcbi8vICAgICBsZXQgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpIGFzIElEQlRyYW5zYWN0aW9uO1xuLy8gICAgIGxldCBvYmplY3RTdG9yZSA9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKSBhcyBJREJPYmplY3RTdG9yZTtcbi8vICAgICBsZXQgZ2V0UmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldChpZCk7XG4vLyAgICAgZ2V0UmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihldmVudDpFdmVudCkge1xuLy8gICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0O1xuLy8gICAgICAgY29uY2VwdCA9IHRhcmdldC5yZXN1bHQgYXMgQ29uY2VwdDtcbi8vICAgICAgIHJldHVybiBjb25jZXB0O1xuLy8gICAgICAgLy8gY29uY2VwdCA9ICBldmVudC50YXJnZXQucmVzdWx0O1xuLy8gICAgICAgLy8gQWNjZXNzIHRoZSByZXRyaWV2ZWQgZGF0YVxuLy8gICAgIH07ICBcbi8vICAgICAgcmV0dXJuIGNvbmNlcHQgYXMgQ29uY2VwdDtcbi8vICAgfSk7XG4vLyAgICAgLy8gICAvLyBEYXRhYmFzZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5XG4vLyAgICAgLy8gfTtcbi8vICAgfVxuZXhwb3J0IGZ1bmN0aW9uIEdldFN0YXRzRnJvbURhdGFiYXNlKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBkYXRhYmFzZU5hbWUgPSBcInNldHRpbmdzXCI7XG4gICAgICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGRiID0gSW5kZXhEYi5kYjtcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgdmFyIGFsbG9iamVjdHMgPSBvYmplY3RTdG9yZS5nZXRBbGwoKTtcbiAgICAgICAgICAgIGFsbG9iamVjdHMub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBzZXR0aW5nc0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBzZXR0aW5nc0FycmF5ID0gYWxsb2JqZWN0cy5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXR0aW5nc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzRGF0YSA9IHNldHRpbmdzQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzRGF0YSA9IHNldHRpbmdzRGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzZXR0aW5nc0RhdGEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQWlVcGRhdGVGbGFnKG9iamVjdCkge1xuICAgIHZhciBkYXRhYmFzZU5hbWUgPSBcInNldHRpbmdzXCI7XG4gICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkudGhlbigoKSA9PiB7XG4gICAgICAgIHZhciBkYiA9IEluZGV4RGIuZGI7XG4gICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgIGxldCBvYmpTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKGRhdGFiYXNlTmFtZSk7XG4gICAgICAgIG9ialN0b3JlLnB1dChvYmplY3QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlKGRhdGFiYXNlTmFtZSwgdHlwZSwgaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oQmFzZVVybC5CQVNFX1VSTCArIFwiX0ZyZWVTY2hlbWFcIiwgdmVyc2lvbik7XG4gICAgICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgICAgIHZhciBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdldEN1cnNvclJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgZ2V0Q3Vyc29yUmVxdWVzdC5vbnN1Y2Nlc3MgPSBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3Vyc29yIGxvZ2ljIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vyc29yID0gdGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci52YWx1ZVt0eXBlXSA9PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2VwdExpc3QucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKENvbmNlcHRMaXN0KTtcbiAgICAgICAgICAgICAgICAvLyAgIC8vIERhdGFiYXNlIG9wZW5lZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgICAgICAvLyB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChldmVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBvcGVuRGF0YWJhc2UoZGF0YWJhc2VOYW1lKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGIgPSBJbmRleERiLmRiO1xuICAgICAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICB2YXIgYWxsb2JqZWN0cyA9IG9iamVjdFN0b3JlLmdldEFsbCgpO1xuICAgICAgICAgICAgICAgIGFsbG9iamVjdHMub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHVkZW50cyA9IGFsbG9iamVjdHMucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0dWRlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0TGlzdC5wdXNoKHN0dWRlbnRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKENvbmNlcHRMaXN0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyByZXR1cm4gQ29uY2VwdExpc3Q7XG4gICAgfSk7XG59XG4vLyAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGcm9tRGF0YWJhc2VXaXRoQ2hhcmFjdGVyT2xkKGRhdGFiYXNlTmFtZTpzdHJpbmcsIHR5cGU6c3RyaW5nLCBjaGFyYWN0ZXJWYWx1ZTpzdHJpbmcpe1xuLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuLy8gICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpO1xuLy8gICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihcIkZyZWVTY2hlbWFcIix2ZXJzaW9uKTtcbi8vICAgICB2YXIgY29uY2VwdDogQ29uY2VwdHxudWxsO1xuLy8gICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24oZXZlbnQpIHtcbi8vICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0O1xuLy8gICAgICAgICB2YXIgZGIgPSB0YXJnZXQucmVzdWx0IGFzIElEQkRhdGFiYXNlO1xuLy8gICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKSBhcyBJREJUcmFuc2FjdGlvbjtcbi8vICAgICAgIGxldCBvYmplY3RTdG9yZSA9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKSBhcyBJREJPYmplY3RTdG9yZTtcbi8vICAgICAgIHZhciBhbGxvYmplY3RzID0gb2JqZWN0U3RvcmUuZ2V0QWxsKCk7XG4vLyAgICAgICBhbGxvYmplY3RzLm9uc3VjY2VzcyA9ICgpPT4ge1xuLy8gICAgICAgICBjb25zdCBzdHVkZW50cyA9IGFsbG9iamVjdHMucmVzdWx0O1xuLy8gICAgICAgICBmb3IodmFyIGk9MDsgaTxzdHVkZW50cy5sZW5ndGg7IGkrKyl7XG4vLyAgICAgICAgICAgaWYoc3R1ZGVudHNbaV0uY2hhcmFjdGVyX3ZhbHVlID09IGNoYXJhY3RlclZhbHVlKXtcbi8vICAgICAgICAgICAgIGNvbmNlcHQgPSBzdHVkZW50c1tpXTtcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgY29uc29sZS5sb2coXCJyZXNvbHZpbmdcIik7XG4vLyAgICAgICAgIHJlc29sdmUoY29uY2VwdCk7IFxuLy8gICAgIH1cbi8vICAgICAvLyAgIC8vIERhdGFiYXNlIG9wZW5lZCBzdWNjZXNzZnVsbHlcbi8vICAgICAvLyB9O1xuLy8gICAgIH1cbi8vICAgICByZXF1ZXN0Lm9uZXJyb3IgPWZ1bmN0aW9uKGV2ZW50KXtcbi8vICAgICAgIHJlamVjdChldmVudCk7XG4vLyAgICAgfVxuLy8gfSk7XG4vLyAgICAvLyByZXR1cm4gQ29uY2VwdExpc3Q7XG4vLyAgIH1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tRGF0YWJhc2UoZGF0YWJhc2VOYW1lLCBpZCkge1xuICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYVwiLCB2ZXJzaW9uKTtcbiAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB2YXIgZGIgPSB0YXJnZXQucmVzdWx0O1xuICAgICAgICBsZXQgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcImRlbGV0aW5nIGZyb20gdGhlIGRhdGFiYXNlXCIsIGlkKTtcbiAgICAgICAgbGV0IGdldFJlcXVlc3QgPSBvYmplY3RTdG9yZS5kZWxldGUoTnVtYmVyKGlkKSk7XG4gICAgICAgIGdldFJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJkZWxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAgICAgICAgICAgIC8vIGNvbmNlcHQgPSAgZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIC8vIEFjY2VzcyB0aGUgcmV0cmlldmVkIGRhdGFcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QgPSBbXSwgY29uY2VwdCkge1xuICAgIGxldCBmb3VuZENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuICAgICAgICBjb25zdCBjaGVjayA9IGNvbmNlcHRMaXN0LmZpbmQoYyA9PiBjLmlkID09PSBjb25jZXB0LmlkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbmNlcHQgPSBjaGVjaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25jZXB0O1xufVxuLy8gZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUeXBlQ29uY2VwdEV4aXN0c0luQXJyYXkoXG4vLyAgIGNvbmNlcHRMaXN0OiBDb25jZXB0W10gPSBbXSxcbi8vICAgY29uY2VwdDogQ29uY2VwdCxcbi8vICkge1xuLy8gICBsZXQgbmV3Q29uY2VwdFR5cGUgPSBjb25jZXB0LnR5cGU/LmNoYXJhY3RlclZhbHVlO1xuLy8gICBpZighbmV3Q29uY2VwdFR5cGU/LnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKXtcbi8vICAgICBuZXdDb25jZXB0VHlwZSA9IFwidGhlX1wiICsgbmV3Q29uY2VwdFR5cGU7XG4vLyAgIH1cbi8vICAgbGV0IHN0YXJ0c1dpdGggPSBjb25jZXB0TGlzdFtpXS50eXBlPy5jaGFyYWN0ZXJWYWx1ZTtcbi8vICAgaWYoIXN0YXJ0c1dpdGg/LnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKXtcbi8vICAgICBzdGFydHNXaXRoID0gXCJ0aGVfXCIgKyBzdGFydHNXaXRoO1xuLy8gICB9XG4vLyAgIGxldCBmb3VuZENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpXG4vLyAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuLy8gICAgIGNvbnN0IGNoZWNrID0gY29uY2VwdExpc3QuZmluZChjID0+IGMudHlwZUlkID09IGNvbmNlcHQudHlwZUlkKVxuLy8gICAgIGlmIChjaGVjaykge1xuLy8gICAgICAgZm91bmRDb25jZXB0ID0gY2hlY2tcbi8vICAgICB9XG4vLyAgIH1cbi8vICAgcmV0dXJuIGZvdW5kQ29uY2VwdFxuLy8gfVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUeXBlQ29uY2VwdHNFeGlzdHNJbkFycmF5KGNvbmNlcHRMaXN0ID0gW10sIGNvbmNlcHQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBmb3VuZENvbmNlcHRzID0gW107XG4gICAgbGV0IG5ld0NvbmNlcHRUeXBlID0gKF9hID0gY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWU7XG4gICAgaWYgKCEobmV3Q29uY2VwdFR5cGUgPT09IG51bGwgfHwgbmV3Q29uY2VwdFR5cGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld0NvbmNlcHRUeXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICBuZXdDb25jZXB0VHlwZSA9IFwidGhlX1wiICsgbmV3Q29uY2VwdFR5cGU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRzV2l0aCA9IChfYiA9IGNvbmNlcHRMaXN0W2ldLnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgICAgIGlmICghKHN0YXJ0c1dpdGggPT09IG51bGwgfHwgc3RhcnRzV2l0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhcnRzV2l0aC5zdGFydHNXaXRoKFwidGhlX1wiKSkpIHtcbiAgICAgICAgICAgICAgICBzdGFydHNXaXRoID0gXCJ0aGVfXCIgKyBzdGFydHNXaXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZUlkID09IGNvbmNlcHRMaXN0W2ldLnR5cGVJZCB8fCBuZXdDb25jZXB0VHlwZSA9PSBzdGFydHNXaXRoKSB7XG4gICAgICAgICAgICAgICAgZm91bmRDb25jZXB0cy5wdXNoKGNvbmNlcHRMaXN0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25jZXB0cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBDaGVja0lmVHlwZUxDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QgPSBbXSwgY29uY2VwdCkge1xuICAgIGxldCBmb3VuZENvbmNlcHRzID0gW107XG4gICAgbGV0IG5ld0NvbmNlcHRUeXBlID0gY29uY2VwdC50eXBlQ2hhcmFjdGVyO1xuICAgIGlmICghKG5ld0NvbmNlcHRUeXBlID09PSBudWxsIHx8IG5ld0NvbmNlcHRUeXBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdDb25jZXB0VHlwZS5zdGFydHNXaXRoKFwidGhlX1wiKSkpIHtcbiAgICAgICAgbmV3Q29uY2VwdFR5cGUgPSBcInRoZV9cIiArIG5ld0NvbmNlcHRUeXBlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0c1dpdGggPSBjb25jZXB0TGlzdFtpXS50eXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgaWYgKCEoc3RhcnRzV2l0aCA9PT0gbnVsbCB8fCBzdGFydHNXaXRoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGFydHNXaXRoLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGggPSBcInRoZV9cIiArIHN0YXJ0c1dpdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgPT0gY29uY2VwdExpc3RbaV0udHlwZUlkIHx8IG5ld0NvbmNlcHRUeXBlID09IHN0YXJ0c1dpdGgpIHtcbiAgICAgICAgICAgICAgICBmb3VuZENvbmNlcHRzLnB1c2goY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbmNlcHRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZDb25uZWN0aW9uRXhpc3RzSW5BcnJheShjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25uZWN0aW9uKSB7XG4gICAgbGV0IGZvdW5kQ29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICBjb25zdCBjaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLmlkID09PSBjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb24gPSBjaGVjaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25uZWN0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUb1RoZUNvbmNlcHRFeGlzdHNJbkNvbm5lY3Rpb25BcnJheShjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25jZXB0SWQpIHtcbiAgICBsZXQgZm91bmRDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMudG9UaGVDb25jZXB0SWQgPT09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9uID0gY2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9DaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLm9mVGhlQ29uY2VwdElkID09PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAodG9DaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9uID0gdG9DaGVjaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25uZWN0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkNvbm5lY3Rpb25BcnJheShjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25jZXB0SWQpIHtcbiAgICBsZXQgZm91bmRDb25uZWN0aW9ucyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICBjb25zdCBjaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLnRvVGhlQ29uY2VwdElkID09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9ucy5wdXNoKGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b0NoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMub2ZUaGVDb25jZXB0SWQgPT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKHRvQ2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29ubmVjdGlvbnMucHVzaCh0b0NoZWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25uZWN0aW9ucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5MQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbmNlcHRJZCkge1xuICAgIGxldCBmb3VuZENvbm5lY3Rpb25zID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMudG9UaGVDb25jZXB0SWQgPT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb25zLnB1c2goY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy5vZlRoZUNvbmNlcHRJZCA9PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAodG9DaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9ucy5wdXNoKHRvQ2hlY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb25zO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZUNvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCA9IFtdLCBjb25jZXB0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgIGNvbmNlcHRMaXN0LnNwbGljZShjb25jZXB0TGlzdC5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBjb25jZXB0LmlkO1xuICAgICAgICB9KSwgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZUNvbm5lY3Rpb25Gcm9tTGlzdChjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25uZWN0aW9uKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0LnNwbGljZShjb25uZWN0aW9uTGlzdC5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBjb25uZWN0aW9uLmlkO1xuICAgICAgICB9KSwgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZUxDb25uZWN0aW9uRnJvbUxpc3QoY29ubmVjdGlvbkxpc3QgPSBbXSwgY29ubmVjdGlvbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICBjb25uZWN0aW9uTGlzdC5zcGxpY2UoY29ubmVjdGlvbkxpc3QuZmluZEluZGV4KGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICByZXR1cm4gaS5pZCA9PT0gY29ubmVjdGlvbi5pZDtcbiAgICAgICAgfSksIDEpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEluc2VydFVuaXF1ZU51bWJlcihBcnJheSwgdG9JbnNlcnQpIHtcbiAgICBpZiAoQXJyYXkuaW5kZXhPZih0b0luc2VydCkgPT09IC0xKSB7XG4gICAgICAgIEFycmF5LnB1c2godG9JbnNlcnQpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXk7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuZXhwb3J0IGZ1bmN0aW9uIENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uKG5ld0Nvbm5lY3Rpb25zID0gW10sIG9sZENvbm5lY3Rpb25zID0gW10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZENvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0Nvbm5lY3Rpb25zKSkge1xuICAgICAgICAgICAgaWYgKCFuZXdDb25uZWN0aW9ucy5maW5kKG9iaiA9PiBvYmouaWQgPT09IG9sZENvbm5lY3Rpb25zW2ldLmlkKSkge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLlJlbW92ZUNvbm5lY3Rpb24ob2xkQ29ubmVjdGlvbnNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uV2l0aElkcyhuZXdDb25uZWN0aW9uSWRzID0gW10sIG9sZENvbm5lY3Rpb25zID0gW10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZENvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbmV3Q29ubmVjdGlvbklkcy5pbmNsdWRlcyhvbGRDb25uZWN0aW9uc1tpXS5pZCkpIHtcbiAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLlJlbW92ZUNvbm5lY3Rpb24ob2xkQ29ubmVjdGlvbnNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tICcuLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YSc7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmltcG9ydCB7IGRlZmF1bHQgYXMgR2V0VGhlQ29uY2VwdCB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0dldFRoZUNvbmNlcHQnO1xuLy8gdGhpcyBpcyBhIGRpZmZlcmVudCB0eXBlIG9mIHJlY3VyaXN2ZSBmZXRjaCBiZWNhdXNlIGhlcmUgYWxsIHRoZSBjb25jZXB0cyBhbmQgY29ubmVjdGlvbnMgYXJlIHBhc3NlZCBhcyBpdCBpc1xuLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBxdWVyeSB0aGUgY29ubmVjdGlvbnMgYW5kIGNvbmNlcHRzIGZyb20gb3V0c2lkZVxuLy8gaWYgdGhlIGNvbmNlcHQgY29ubmVjdGlvbiBpcyBub3QgZm91bmQgdGhlbiBpdCB3aWxsIGdvIHRvIHRoZSBiYWNrZW5kIHRvIGZldGNoIGl0XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2hOZXcoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0TGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IG91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgY29uY2VwdCBmcm9tIGEgbGlzdCBvZiBjb25jZXB0c1xuICAgICAgICBsZXQgY29uY2VwdCA9IGdldENvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCwgaWQpO1xuICAgICAgICAvLyBpZiB3ZSBjYW5ub3QgZmluZCB0aGUgY29uY2VwdCBmcm9tIHRoZSBjb25jZXB0IGxpc3QgdGhlbiBmaW5kIGl0IGZyb20gdGhlIGJhY2tlbmRcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgY29uY2VwdC5pZCA9PSAwKSAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25jZXB0cyB0cmllcyB0byBmaW5kIGl0IGZyb20gdGhlIGJpbmFyeSB0cmVlIGVsc2UgZnJvbSB0aGUgYmFja2VuZCBpZiBjYW5ub3QgZmluZCBpdCB0aGVuXG4gICAgICAgICAgICAvLyBpdCB3aWxsIGJlY29tZSBudWxsXG4gICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgY29uY2VwdCB0eXBlIGlzIG5vbiBleGlzdGVudCB0aGVuIHlvdSBoYXZlIHRvIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmNlcHQgdHlwZSBpZCBmcm9tIHRoZSBjb25jZXB0IHdoaWNoIGlzIHN0b3JlZCBpbiB0eXBlSWRcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NvbmNlcHRUeXBlSWQgPSBjb25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRUeXBlID0gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCB0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGUgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL2xldCBtYWluU3RyaW5nID0gY29uY2VwdD8udHlwZT8uY2hhcmFjdGVyVmFsdWUgPz8gJydcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIGNvbm5lY3Rpb25zXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gaGFzIHRoZSBpZCB0aGF0IGhhcyBiZWVuIHBhc3NlZCBpbiB0aGUgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgLy8gb2Z0aGVjb25jZXB0SWQgLS0tLS0+IHRvVGhlQ29uY2VwdElkXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBvbmx5IGdpdmVzIHRoZSB2YWxpZCBjb25jZXB0IGlkIHRoYXQgYXJlIGluc2lkZSBvZiB0aGlzIGlkXG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gdGFrZSBvdXQgdGhlIHRvVGhlQ29uY2VwdElkIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIHRvVGhlQ29uY2VwdElkIHRvIGEgcmVhbCBDb25jZXB0IE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IGdldENvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCwgdG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25jZXB0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdElkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0b0NvbmNlcHQgaXMgdmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIGluIGNhc2VlIHR5cGUgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db25jZXB0VHlwZUlkID0gdG9Db25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdFR5cGUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVnZXggdG8gZmlsdGVyIG91dCB0aGUgdGhlXyBmcm9tIHRoZSB0eXBlIGNvbmNlcHRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9ICd0aGVfJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gY3JlYXRlIHRoZSBrZXkgb2YgdGhlIGtleSB2YWx1ZSBwYWlyIHRoYXQgaXMgdGhlIHR5cGUgb2YgdGhlIGNvbmNlcHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsbWFpblN0cmluZyA9IChfYiA9IChfYSA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgdGhlXyB3aXRoIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxLZXkgPSBsb2NhbG1haW5TdHJpbmcucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlICB0eXBlICBpcyBhIG51bWJlciB0aGVuIHB1dCBpdCBpbnNpZGUgb2YgYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKGxvY2FsS2V5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hOZXcodG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0TGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0eXBlIGlzIGEgbnVtYmVyIHRoZW4gcHV0IGl0IGluc2lkZSBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTmV3KHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29uY2VwdExpc3QsIGNvbXBvc2l0aW9uTGlzdCwgdmlzaXRlZENvbmNlcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuLy8gZ2V0cyB0aGUgY29uY2VwdCBmcm9tIHRoZSBsaXN0IG9mIGNvbmNlcHRzIHVzaW5nIHRoZSBjb25jZXB0SWRcbmZ1bmN0aW9uIGdldENvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCwgY29uY2VwdElkKSB7XG4gICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNvbmNlcHRJZCA9PSBjb25jZXB0TGlzdFtpXS5pZCkge1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhJztcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbkJ1bGsgfSBmcm9tICcuLi8uLi9BcGkvR2V0Q29ubmVjdGlvbkJ1bGsnO1xuaW1wb3J0IHsgR2V0Q29uY2VwdCB9IGZyb20gJy4uLy4uL0FwaS9HZXRDb25jZXB0JztcbmltcG9ydCB7IHJlY3Vyc2l2ZUZldGNoTmV3IH0gZnJvbSAnLi9CdWlsZENvbXBvc2l0aW9uJztcbmltcG9ydCB7IHJlY3Vyc2l2ZUZldGNoIH0gZnJvbSAnLi4vR2V0Q29tcG9zaXRpb24nO1xuaW1wb3J0IHsgQ29tcG9zaXRpb24gfSBmcm9tICcuLi8uLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbic7XG5pbXBvcnQgeyBDb21wb3NpdGlvbkJpbmFyeVRyZWUgfSBmcm9tICcuLi8uLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkJpbmFyeVRyZWUnO1xuaW1wb3J0IHsgQnVsa0NvbmNlcHRHZXR0ZXJBcGkgfSBmcm9tICcuLi8uLi9BcGkvR2V0Q29uY2VwdEJ1bGsnO1xuLy8gZ2V0IHRoZSBjb21wb3NpdGlvbiB3aXRoIHRoZSBwYXNzZWQgaWRcbi8vIGhlcmUgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHBhc3NlZCB3aGljaCB3aWxsIHBhc3MgdGhlIGludGVybmFsIGNvbm5lY3Rpb25zIGlmIGdpdmVuXG4vLyBlbHNlIHRoZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBnZXQgdGhlIGludGVybmFsIGNvbm5lY3Rpb25zIGl0c2VsZlxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aENhY2hlKGlkLCBjb25uZWN0aW9uTGlzdFBhc3NlZCA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29uY2VwdElkTGlzdCA9IFtdO1xuICAgICAgICBsZXQgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIGxldCBvdXRwdXQgPSB7fTtcbiAgICAgICAgY29uc3QgeCA9IHlpZWxkIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDAgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uTGlzdFN0cmluZyA9IFtdO1xuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0UGFzc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdFN0cmluZyA9IGdldE15Q29ubmVjdGlvbnMoaWQsIGNvbm5lY3Rpb25MaXN0UGFzc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0SWRMaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbmNlcHRJZExpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRJZExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgU2F2ZVRvQ29tcG9zaXRpb25DYWNoZShjb25jZXB0LCBjb25uZWN0aW9uTGlzdCwgY29uY2VwdElkTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgICAgIGxldCB2aXNpdGVkQ29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgY29uc3QgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0geC52YWx1ZS5HZXREYXRhQ2FjaGUoKTtcbiAgICAgICAgICAgIHJldHVybk91dHB1dCA9IG91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybk91dHB1dDtcbiAgICB9KTtcbn1cbi8vIHRoaXMgZ2V0cyB0aGUgbGlzdCBvZiBjb25uZWN0aW9ucyBvZiBhIGNvbXBvc2l0aW9uIGZyb20gYSBsaXN0IG9mIGJ1bGsgY29ubmVjdGlvbiBwdWxsXG5mdW5jdGlvbiBnZXRNeUNvbm5lY3Rpb25zKGlkLCBjb25uZWN0aW9uTGlzdCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RbaV0udHlwZUlkID09IGlkKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29ubmVjdGlvbnM7XG59XG4vLyBnZXQgdGhlIGNvbXBvc2l0aW9uIHdpdGggdGhlIHBhc3NlZCBpZFxuLy8gaGVyZSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgcGFzc2VkIHdoaWNoIHdpbGwgcGFzcyB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaWYgZ2l2ZW5cbi8vIGVsc2UgdGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGdldCB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaXRzZWxmXG4vLyB0aGlzIGZ1bmN0aW9uIGhhcyBhICBmb3JtYXQgb2YgZGF0YSAtLSBpZFxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aERhdGFJZFdpdGhDYWNoZShpZCwgY29ubmVjdGlvbkxpc3RQYXNzZWQgPSBbXSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IEZpbmFsUmV0dXJuID0ge307XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0SWRMaXN0ID0gW107XG4gICAgICAgIGxldCBvdXRwdXQ7XG4gICAgICAgIGNvbnN0IHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCB4ID0geWllbGQgQ29tcG9zaXRpb25CaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHggPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gW107XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RQYXNzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gZ2V0TXlDb25uZWN0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3RQYXNzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRJZExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29uY2VwdElkTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdElkTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBTYXZlVG9Db21wb3NpdGlvbkNhY2hlKGNvbmNlcHQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0SWRMaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgY29uc3QgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICAgICAgRmluYWxSZXR1cm5bXCJjcmVhdGVkX2F0XCJdID0gY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgICAgIEZpbmFsUmV0dXJuWydkYXRhJ10gPSByZXR1cm5PdXRwdXQ7XG4gICAgICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0geC52YWx1ZS5HZXREYXRhQ2FjaGUoKTtcbiAgICAgICAgICAgIEZpbmFsUmV0dXJuID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHBhc3NlZCB3aXRoIGJ1bGsgY29tcG9zaXRpb25zIGFuZCBidWxrIGludGVybmFsIGNvbm5lY3Rpb25zIG9mIHRoZW1cbi8vIHNvIHRoYXQgaSBjYW4gY29udmVyIHRoZW0gdG8gYWN0dWFsIGxpc3Qgb2YgY29tcG9zaXRpb25zXG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkQnVsayhpZHMsIGNvbm5lY3Rpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBuZXdDb25uZWN0aW9ucyA9IHlpZWxkIEdldENvbm5lY3Rpb25CdWxrKGNvbm5lY3Rpb25zKTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBuZXdDb25uZWN0aW9ucztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aERhdGFJZFdpdGhDYWNoZShpZHNbaV0sIGNvbm5lY3Rpb25MaXN0KTtcbiAgICAgICAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnMucHVzaChvdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTYXZlVG9Db21wb3NpdGlvbkNhY2hlKGNvbmNlcHQsIGNvbm5lY3Rpb25zLCBjb25jZXB0SWRMaXN0LCBudW1iZXJzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb24gPSBuZXcgQ29tcG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgY29uY2VwdHMgPSB5aWVsZCBCdWxrQ29uY2VwdEdldHRlcihjb25jZXB0SWRMaXN0KTtcbiAgICAgICAgY29tcG9zaXRpb24uY29ubmVjdGlvbnMgPSBjb25uZWN0aW9ucztcbiAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMgPSBjb25jZXB0cztcbiAgICAgICAgY29tcG9zaXRpb24uaWQgPSBjb25jZXB0LmlkO1xuICAgICAgICBjb21wb3NpdGlvbi5zdWJjb21wb3NpdGlvbnMgPSBudW1iZXJzO1xuICAgICAgICBjb21wb3NpdGlvbi5tYWluQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgIGxldCB2aXNpdGVkQ29uY2VwdHMgPSBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hOZXcoY29uY2VwdC5pZCwgY29ubmVjdGlvbnMsIGNvbmNlcHRzLCBudW1iZXJzLCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICBjb21wb3NpdGlvbi5jYWNoZWQgPSBvdXRwdXQ7XG4gICAgICAgIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5hZGRDb21wb3NpdGlvblRvVHJlZShjb21wb3NpdGlvbik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBCdWxrQ29uY2VwdEdldHRlcihjb25jZXB0SWRzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGJ1bGtDb25jZXB0RmV0Y2ggPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoY29uY2VwdElkcyA9PT0gbnVsbCB8fCBjb25jZXB0SWRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0SWRzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFVzZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGNvbmNlcHRJZHNbaV0pO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIGJ1bGtDb25jZXB0RmV0Y2gucHVzaChjb25jZXB0SWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmNlcHRMaXN0LnB1c2goY29uY2VwdFVzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChidWxrQ29uY2VwdEZldGNoID09PSBudWxsIHx8IGJ1bGtDb25jZXB0RmV0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1bGtDb25jZXB0RmV0Y2gubGVuZ3RoKSA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdExpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25jZXB0TGlzdCA9IHlpZWxkIEJ1bGtDb25jZXB0R2V0dGVyQXBpKGJ1bGtDb25jZXB0RmV0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0TGlzdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuLi9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uJztcbmltcG9ydCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IGZyb20gJy4uL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQnO1xuaW1wb3J0IHsgY3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbm5lY3Rpb24nO1xuLy8gY3JlYXRlIGEgY29tcG9zaXRpb24gd2l0aCBjYWNoaW5nIG1lY2hhbmlzbVxuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlKGpzb24sIG9mVGhlQ29uY2VwdElkID0gbnVsbCwgb2ZUaGVDb25jZXB0VXNlcklkID0gbnVsbCwgbWFpbktleSA9IG51bGwsIHVzZXJJZCA9IG51bGwsIGFjY2Vzc0lkID0gbnVsbCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSBudWxsLCBjb21wb3NpdGlvbiA9IG51bGwpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgY29uc3QgbG9jYWxBY2Nlc3NJZCA9IGFjY2Vzc0lkICE9PSBudWxsICYmIGFjY2Vzc0lkICE9PSB2b2lkIDAgPyBhY2Nlc3NJZCA6IDQ7XG4gICAgICAgIGNvbnN0IGxvY2FsU2Vzc2lvbklkID0gc2Vzc2lvbkluZm9ybWF0aW9uSWQgIT09IG51bGwgJiYgc2Vzc2lvbkluZm9ybWF0aW9uSWQgIT09IHZvaWQgMCA/IHNlc3Npb25JbmZvcm1hdGlvbklkIDogOTk5O1xuICAgICAgICBsZXQgTWFpbktleUxvY2FsID0gbWFpbktleSAhPT0gbnVsbCAmJiBtYWluS2V5ICE9PSB2b2lkIDAgPyBtYWluS2V5IDogMDtcbiAgICAgICAgbGV0IE1haW5Db25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGlmIG5vIGNvbXBvc2l0aW9uIGlzIHBhc3NlZCB0aGVuIGNyZWF0ZSBhIG5ldyBjb21wb3NpdGlvblxuICAgICAgICAgICAgY29tcG9zaXRpb24gPSBuZXcgQ29tcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGpzb25ba2V5XSA9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGpzb25ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksICcnLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YganNvbltrZXldICE9ICdzdHJpbmcnICYmIHR5cGVvZiBqc29uW2tleV0gIT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBwYXJlbnQgY29uY2VwdElkIGFuZCBjb25jZXB0VXNlcklkIHBhc3NlZCB0aGVuIHdlIGtub3cgdGhpcyBpcyB0aGUgbWFpbiBjb25jZXB0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgcmVsYXRlZCB0byB0aGlzIGNvbmNlcHQuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxNYWluS2V5ID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbktleUxvY2FsID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uaWQgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbldpdGhDYWNoZShqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBjb21wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjb25jZXB0IHdoaWNoIGhhcyBwYXJlbnQgcGFzc2VkIG9udG8gaXQgYW5kIHRoaXMgaXMgYSBzdWJjb21wb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2ZUaGVVc2VyID0gb2ZUaGVDb25jZXB0VXNlcklkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0VXNlcklkIDogOTk5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlKGpzb25ba2V5XSwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGpzb25ba2V5XSAhPSBudWxsICYmIGpzb25ba2V5XSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uc3ViY29tcG9zaXRpb25zLnB1c2goY29uY2VwdC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgcGFydCB3aGVyZSB0aGUgY29uY2VwdCBpcyBub3cgYSBrZXkgdmFsdWUgcGFpciBhbmQgaGFzIHRoZSBhY3R1YWwgZGF0YVxuICAgICAgICAgICAgICAgIGNvbnN0IG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCBqc29uW2tleV0sIGZhbHNlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uLmNvbmNlcHRzLnB1c2goY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiB0aGUgbWFpbiBjb25jZXB0XG4gICAgICAgIHJldHVybiBNYWluQ29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUgfSBmcm9tIFwiLi4vLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlXCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdEFwaSB9IGZyb20gXCIuLi8uLi9BcGkvU2VhcmNoQ29uY2VwdC9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdFwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhLCBDcmVhdGVEZWZhdWx0Q29uY2VwdCwgU3BsaXRTdHJpbmdzIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KGNoYXJhY3Rlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PSBcInRoZVwiKSB7XG4gICAgICAgICAgICBjb25jZXB0LmlkID0gMTtcbiAgICAgICAgICAgIGNvbmNlcHQudHlwZUlkID0gNTtcbiAgICAgICAgICAgIGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUgPSBcInRoZVwiO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3MoY2hhcmFjdGVyKTtcbiAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IGNhdGVnb3J5ID0gMTtcbiAgICAgICAgICAgIGxldCBwcmVmaXggPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeShzcGxpdHRlZFN0cmluZ0FycmF5WzBdKTtcbiAgICAgICAgICAgIGlmIChwcmVmaXguaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gcHJlZml4LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RnJvbU1lbW9yeShjaGFyYWN0ZXIsIGNhdGVnb3J5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5WzBdID09IGNoYXJhY3Rlcikge1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJWYWx1ZSwgNTEpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RnJvbU1lbW9yeShjaGFyYWN0ZXIsIGNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbChjaGFyYWN0ZXIsIGNhdGVnb3J5KTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0QXBpKGNoYXJhY3RlciwgY2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb25cIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tIFwiLi4vTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KSB7XG4gICAgY29uc3QgTENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICBMQ29uY2VwdC5pZCA9IGNvbmNlcHQuaWQ7XG4gICAgTENvbmNlcHQuZ2hvc3RJZCA9IGNvbmNlcHQuZ2hvc3RJZDtcbiAgICBMQ29uY2VwdC51c2VySWQgPSBjb25jZXB0LnVzZXJJZDtcbiAgICBMQ29uY2VwdC5hY2Nlc3NJZCA9IGNvbmNlcHQuYWNjZXNzSWQ7XG4gICAgTENvbmNlcHQuY2F0ZWdvcnlJZCA9IGNvbmNlcHQuY2F0ZWdvcnlJZDtcbiAgICBMQ29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSA9IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgTENvbmNlcHQuZW50cnlUaW1lU3RhbXAgPSBjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgIExDb25jZXB0LnR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgIExDb25jZXB0LnR5cGUgPSBjb25jZXB0LnR5cGU7XG4gICAgTENvbmNlcHQuaXNUZW1wID0gZmFsc2U7XG4gICAgcmV0dXJuIExDb25jZXB0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQobGNvbmNlcHQpIHtcbiAgICBjb25zdCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICBjb25jZXB0LmlkID0gbGNvbmNlcHQuaWQ7XG4gICAgY29uY2VwdC5naG9zdElkID0gbGNvbmNlcHQuZ2hvc3RJZDtcbiAgICBjb25jZXB0LnVzZXJJZCA9IGxjb25jZXB0LnVzZXJJZDtcbiAgICBjb25jZXB0LmFjY2Vzc0lkID0gbGNvbmNlcHQuYWNjZXNzSWQ7XG4gICAgY29uY2VwdC5lbnRyeVRpbWVTdGFtcCA9IGxjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgIGNvbmNlcHQudHlwZUlkID0gbGNvbmNlcHQudHlwZUlkO1xuICAgIGNvbmNlcHQuY2F0ZWdvcnlJZCA9IGxjb25jZXB0LmNhdGVnb3J5SWQ7XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyb21Db25uZWN0aW9uVG9MQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgTGNvbm5lY3Rpb24gPSBuZXcgTENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgTGNvbm5lY3Rpb24uaWQgPSBjb25uZWN0aW9uLmlkO1xuICAgIExjb25uZWN0aW9uLmdob3N0SWQgPSBjb25uZWN0aW9uLmdob3N0SWQ7XG4gICAgTGNvbm5lY3Rpb24uYWNjZXNzSWQgPSBjb25uZWN0aW9uLmFjY2Vzc0lkO1xuICAgIExjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gY29ubmVjdGlvbi5vZlRoZUNvbmNlcHRJZDtcbiAgICBMY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZCA9IGNvbm5lY3Rpb24udG9UaGVDb25jZXB0SWQ7XG4gICAgTGNvbm5lY3Rpb24uZW50cnlUaW1lU3RhbXAgPSBjb25uZWN0aW9uLmVudHJ5VGltZVN0YW1wO1xuICAgIExjb25uZWN0aW9uLnR5cGVJZCA9IGNvbm5lY3Rpb24udHlwZUlkO1xuICAgIExjb25uZWN0aW9uLmlzVGVtcCA9IGZhbHNlO1xuICAgIHJldHVybiBMY29ubmVjdGlvbjtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKFwiY29uY2VwdFwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdFRvTWVtb3J5KGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBub2RlID0gbmV3IE5vZGUoY29uY2VwdC5pZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gQmluYXJ5VHJlZS5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHZhciB0aW1lID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwgfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbFwiO1xuaW1wb3J0IHsgRGVsZXRlQ29ubmVjdGlvbkJ5SWQgfSBmcm9tIFwiLi9EZWxldGVDb25uZWN0aW9uXCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5pbXBvcnQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlSW5zdGFuY2VDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cyhvZlRoZUNvbmNlcHQsIHRvVGhlQ29uY2VwdCwgbGlua2VyLCBib3RoID0gZmFsc2UsIGNvdW50ID0gZmFsc2UpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHQudXNlcklkO1xuICAgICAgICB2YXIgb3JkZXJVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgaWYgKGJvdGgpIHtcbiAgICAgICAgICAgIGxldCBwcmVmaXgxID0gKChfYSA9IHRvVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICAgICAgbGV0IGxpbmtlckFkZDEgPSBsaW5rZXIgKyBcIl9ieVwiO1xuICAgICAgICAgICAgbGV0IGJhY2t3YXJkTGlua2VyID0gcHJlZml4MSArIFwiX1wiICsgbGlua2VyQWRkMTtcbiAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZDEsIHRvVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBiYWNrd2FyZExpbmtlciwgZmFsc2UsIDk5OSwgOTk5LCA5OTkpO1xuICAgICAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCB0b1RoZUNvbmNlcHQuaWQsIG9mVGhlQ29uY2VwdC5pZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlLmlkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UudXNlcklkLCAxMDAwLCB1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZpeCA9ICgoX2IgPSBvZlRoZUNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIjtcbiAgICAgICAgbGV0IGxpbmtlckFkZCA9IGxpbmtlciArIFwiX3NcIjtcbiAgICAgICAgbGV0IGZvcndhcmRMaW5rZXIgPSBwcmVmaXggKyBcIl9cIiArIGxpbmtlckFkZDtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICB5aWVsZCBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXJBZGQsIG9mVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29ubmVjdGlvbkNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgb2ZUaGVDb25jZXB0LmlkLCB0b1RoZUNvbmNlcHQuaWQsIG9mVGhlQ29uY2VwdC51c2VySWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIG9mVGhlQ29uY2VwdC51c2VySWQsIGNvbm5lY3Rpb25Db25jZXB0LmlkLCBjb25uZWN0aW9uQ29uY2VwdC51c2VySWQsIDEwMDAsIHVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICBTeW5jRGF0YS5BZGRDb25uZWN0aW9uKG5ld0Nvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gbmV3Q29ubmVjdGlvbjtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXIsIGNvbmNlcHQsIHBhc3NlZFVzZXJJZCA9IG51bGwpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHQxID0gY29uY2VwdDtcbiAgICAgICAgdmFyIHVzZXJJZCA9IHBhc3NlZFVzZXJJZCAhPT0gbnVsbCAmJiBwYXNzZWRVc2VySWQgIT09IHZvaWQgMCA/IHBhc3NlZFVzZXJJZCA6IGNvbmNlcHQudXNlcklkO1xuICAgICAgICB2YXIgb3JkZXJVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgdmFyIGZvcndhcmRMaW5rZXJDb3VudCA9IGxpbmtlciArIFwiX2NvdW50XCI7XG4gICAgICAgIHZhciBmb3J3YXJkTGlua2VyQ291bnRTdHJpbmcgPSAoKF9hID0gY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiICsgXCJfXCIgKyBmb3J3YXJkTGlua2VyQ291bnQ7XG4gICAgICAgIHZhciBmb3J3YXJkTGlua2VyQ291bnRDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvbm5lY3Rpb25cIiwgZm9yd2FyZExpbmtlckNvdW50U3RyaW5nLCBmYWxzZSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQpO1xuICAgICAgICB2YXIgY29ubmVjdGlvbnNTdHJpbmcgPSB5aWVsZCBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0KGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIHVzZXJJZCwgMTAsIDEpO1xuICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgdmFyIHByZWZldGNoID0gW107XG4gICAgICAgIHZhciBjb3VudENvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIHZhciBjb3VudENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBjb3VudENvbmNlcHRMaXN0LnB1c2godG9Db25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY291bnRDb25jZXB0TGlzdC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICBjb3VudENvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY291bnRcIiwgXCIxXCIsIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgb2xkY291bnRDb25jZXB0ID0gY291bnRDb25jZXB0TGlzdFswXTtcbiAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gTnVtYmVyKG9sZGNvdW50Q29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTtcbiAgICAgICAgICAgIGNvdW50Q29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb3VudFwiLCBjb3VudC50b1N0cmluZygpLCBmYWxzZSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIERlbGV0ZUNvbm5lY3Rpb25CeUlkKGNvbm5lY3Rpb25zW2ldLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIGNvbmNlcHQxLmlkLCBjb3VudENvbmNlcHQuaWQsIGNvbmNlcHQxLnVzZXJJZCwgY291bnRDb25jZXB0LnVzZXJJZCwgY29uY2VwdDEudXNlcklkLCBmb3J3YXJkTGlua2VyQ291bnRDb25jZXB0LmlkLCBmb3J3YXJkTGlua2VyQ291bnRDb25jZXB0LnVzZXJJZCwgMTAwMCwgdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIHlpZWxkIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c0dlbmVyYWwob2ZUaGVDb25jZXB0LCB0b1RoZUNvbmNlcHQsIGxpbmtlciwgYm90aCA9IGZhbHNlLCBjb3VudCA9IGZhbHNlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgdXNlcklkID0gb2ZUaGVDb25jZXB0LnVzZXJJZDtcbiAgICAgICAgdmFyIG9yZGVyVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgICAgICB2YXIgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSA5OTk7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSA5OTk7XG4gICAgICAgIGlmIChib3RoKSB7XG4gICAgICAgICAgICBsZXQgcHJlZml4MSA9ICgoX2EgPSB0b1RoZUNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIjtcbiAgICAgICAgICAgIGxldCBsaW5rZXJBZGQxID0gbGlua2VyICsgXCJfYnlcIjtcbiAgICAgICAgICAgIGxldCBiYWNrd2FyZExpbmtlciA9IHByZWZpeDEgKyBcIl9cIiArIGxpbmtlckFkZDE7XG4gICAgICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXJBZGQxLCB0b1RoZUNvbmNlcHQsIHVzZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvbm5lY3Rpb25cIiwgYmFja3dhcmRMaW5rZXIsIGZhbHNlLCA5OTksIDk5OSwgOTk5KTtcbiAgICAgICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgdG9UaGVDb25jZXB0LmlkLCBvZlRoZUNvbmNlcHQuaWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIG9mVGhlQ29uY2VwdC51c2VySWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZS5pZCwgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlLnVzZXJJZCwgMTAwMCwgdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgICAgICBTeW5jRGF0YS5BZGRDb25uZWN0aW9uKG5ld0Nvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmaXggPSAoKF9iID0gb2ZUaGVDb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCI7XG4gICAgICAgIGxldCBsaW5rZXJBZGQgPSBsaW5rZXIgKyBcIl9zXCI7XG4gICAgICAgIGxldCBmb3J3YXJkTGlua2VyID0gcHJlZml4ICsgXCJfXCIgKyBsaW5rZXJBZGQ7XG4gICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgeWllbGQgQ291bnRSZWxhdGlvbnNoaXAobGlua2VyQWRkLCBvZlRoZUNvbmNlcHQsIHVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvbm5lY3Rpb25cIiwgZm9yd2FyZExpbmtlciwgZmFsc2UsIDk5OSwgOTk5LCA5OTkpO1xuICAgICAgICBsZXQgbmV3Q29ubmVjdGlvbiA9IHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsKG9mVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LmlkLCB0b1RoZUNvbmNlcHQudXNlcklkLCBjb25uZWN0aW9uQ29uY2VwdC5pZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCAxMDAwLCBhY2Nlc3NJZCk7XG4gICAgICAgIHJldHVybiBuZXdDb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uY2VwdCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKSB7XG4gICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICBsZXQgY29uY2VwdCA9IG5ldyBDb25jZXB0KDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwiMFwiLCAwLCAwLCAwLCAwLCAwLCAwLCBmYWxzZSwgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbik7XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRoZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25uZWN0aW9uXCI7XG5pbXBvcnQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlSW5zdGFuY2VDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDcmVhdGVUaGVDb21wb3NpdGlvbihqc29uLCBvZlRoZUNvbmNlcHRJZCA9IG51bGwsIG9mVGhlQ29uY2VwdFVzZXJJZCA9IG51bGwsIG1haW5LZXkgPSBudWxsLCB1c2VySWQgPSBudWxsLCBhY2Nlc3NJZCA9IG51bGwsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gbnVsbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgdmFyIGxvY2FsQWNjZXNzSWQgPSBhY2Nlc3NJZCAhPT0gbnVsbCAmJiBhY2Nlc3NJZCAhPT0gdm9pZCAwID8gYWNjZXNzSWQgOiA0O1xuICAgICAgICB2YXIgbG9jYWxTZXNzaW9uSWQgPSBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gbnVsbCAmJiBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gdm9pZCAwID8gc2Vzc2lvbkluZm9ybWF0aW9uSWQgOiA5OTk7XG4gICAgICAgIHZhciBNYWluS2V5TG9jYWwgPSBtYWluS2V5ICE9PSBudWxsICYmIG1haW5LZXkgIT09IHZvaWQgMCA/IG1haW5LZXkgOiAwO1xuICAgICAgICB2YXIgTWFpbkNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICAgICAgICBpZiAoKHR5cGVvZiBqc29uW2tleV0gIT0gJ3N0cmluZycgJiYgdHlwZW9mIGpzb25ba2V5XSAhPSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxNYWluS2V5ID0gTWFpbktleUxvY2FsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCBcIlwiLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxNYWluS2V5ID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbktleUxvY2FsID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb24oanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIFwiXCIsIHRydWUsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBjcmVhdGVUaGVDb25uZWN0aW9uKG9mVGhlLCBvZlRoZVVzZXIsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIGxvY2FsU2Vzc2lvbklkLCBjb25jZXB0LnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uKGpzb25ba2V5XSwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICB2YXIgb2ZUaGVVc2VyID0gb2ZUaGVDb25jZXB0VXNlcklkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0VXNlcklkIDogMTAyNjc7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCBqc29uW2tleV0sIGZhbHNlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICB5aWVsZCBjcmVhdGVUaGVDb25uZWN0aW9uKG9mVGhlLCBvZlRoZVVzZXIsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIGxvY2FsU2Vzc2lvbklkLCBjb25jZXB0LnVzZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1haW5Db25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25jZXB0QXBpIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29uY2VwdEFwaVwiO1xuaW1wb3J0IHsgQ29uY2VwdCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0XCI7XG5pbXBvcnQgeyBSZXNlcnZlZElkcyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9SZXNlcnZlZElkc1wiO1xuaW1wb3J0IHsgU3luY0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGFcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0geWllbGQgUmVzZXJ2ZWRJZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGlzTmV3ID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgdXBkYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBjb25jZXB0ID0gbmV3IENvbmNlcHQoaWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHJlZmVyZW50LCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgaXNOZXcsIGNyZWF0ZWRfb24sIHVwZGF0ZWRfb24pO1xuICAgICAgICBjb25jZXB0LmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICBTeW5jRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25jZXB0VGVtcG9yYXJ5KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBpZCA9IHlpZWxkIFJlc2VydmVkSWRzLmdldElkKCk7XG4gICAgICAgIHZhciBpc05ldyA9IHRydWU7XG4gICAgICAgIGxldCBjcmVhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IG5ldyBDb25jZXB0KGlkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCByZWZlcmVudCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uKTtcbiAgICAgICAgY29uY2VwdC5pc1RlbXAgPSB0cnVlO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlKHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBpZCA9IHlpZWxkIFJlc2VydmVkSWRzLmdldElkKCk7XG4gICAgICAgIHZhciBpc05ldyA9IGZhbHNlO1xuICAgICAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBuZXcgQ29uY2VwdChpZCwgdXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgcmVmZXJlbnQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBpc05ldywgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbik7XG4gICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICBDcmVhdGVUaGVDb25jZXB0QXBpKFtjb25jZXB0XSk7XG4gICAgICAgIC8vU3luY0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGhlQ29ubmVjdGlvbihvZlRoZUNvbmNlcHRJZCwgb2ZUaGVDb25jZXB0VXNlcklkLCB0b1RoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB0eXBlSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpIHtcbiAgICB2YXIgb3JkZXJJZCA9IDE7XG4gICAgdmFyIG9yZGVyVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgIHZhciB0eXBlVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIHNlY3VyaXR5SWQgPSAwO1xuICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgIHZhciBhY2Nlc3NVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCBvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgb3JkZXJJZCwgb3JkZXJVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gdG9UaGVDb25jZXB0SWQpIHtcbiAgICAgICAgY29ubmVjdGlvbi5vZlRoZUNvbmNlcHRJZCA9IDA7XG4gICAgICAgIGNvbm5lY3Rpb24udG9UaGVDb25jZXB0SWQgPSAxO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgY29ubmVjdGlvbi5pc1RlbXAgPSB0cnVlO1xuICAgIGNvbm5lY3Rpb24uaWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgUmVzZXJ2ZWRDb25uZWN0aW9uSWRzIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1Jlc2VydmVkSWRzXCI7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YVwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsKG9mVGhlQ29uY2VwdElkLCBvZlRoZUNvbmNlcHRVc2VySWQsIHRvVGhlQ29uY2VwdElkLCB0b1RoZUNvbmNlcHRVc2VySWQsIHR5cGVJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgb3JkZXJJZCA9IDEsIGFjY2Vzc0lkID0gNCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvcmRlclVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICAgICAgdmFyIHR5cGVVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gMDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB2YXIgYWNjZXNzVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB2YXIgaWQgPSB5aWVsZCBSZXNlcnZlZENvbm5lY3Rpb25JZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihpZCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCBvZlRoZUNvbmNlcHRVc2VySWQsIHRvVGhlQ29uY2VwdFVzZXJJZCwgdXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIG9yZGVySWQsIG9yZGVyVXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSB0b1RoZUNvbmNlcHRJZCkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5vZlRoZUNvbmNlcHRJZCA9IDA7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnRvVGhlQ29uY2VwdElkID0gMTtcbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMgd2lsbCBjYXVzZSB0aGUgY29ubmVjdGlvbiB0byBnbyBhbmQgdXBkYXRlIHRoZSBleGlzdGluZyB3aXRoIHRoZSByZXNlcnZlZCBpZFxuICAgICAgICBjb25uZWN0aW9uLnRvVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgY29ubmVjdGlvbi5pc1RlbXAgPSBmYWxzZTtcbiAgICAgICAgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBEZWxldGVUaGVDb25jZXB0IGZyb20gXCIuLi9BcGkvRGVsZXRlVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgQmluYXJ5Q2hhcmFjdGVyVHJlZSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBCaW5hcnlUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeVRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeVR5cGVUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeVR5cGVUcmVlXCI7XG5pbXBvcnQgeyByZW1vdmVGcm9tRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gRGVsZXRlQ29uY2VwdEJ5SWQoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoaWQpO1xuICAgICAgICB5aWVsZCBCaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIHZhciB0eXBlSWQgPSBjb25jZXB0LnR5cGVJZDtcbiAgICAgICAgdmFyIGNoYXJhY3RlciA9IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIHlpZWxkIEJpbmFyeVR5cGVUcmVlLnJlbW92ZVR5cGVDb25jZXB0KHR5cGVJZCwgaWQpO1xuICAgICAgICB5aWVsZCBCaW5hcnlDaGFyYWN0ZXJUcmVlLnJlbW92ZU5vZGVCeUNoYXJhY3RlcihjaGFyYWN0ZXIsIGlkKTtcbiAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29uY2VwdFwiLCBpZCk7XG4gICAgICAgIERlbGV0ZVRoZUNvbmNlcHQoaWQpO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgRGVsZXRlVGhlQ29ubmVjdGlvbiBmcm9tIFwiLi4vQXBpL0RlbGV0ZVRoZUNvbm5lY3Rpb25cIjtcbmltcG9ydCB7IENvbm5lY3Rpb25CaW5hcnlUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25CaW5hcnlUcmVlL0Nvbm5lY3Rpb25CaW5hcnlUcmVlXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHlwZVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvblR5cGVUcmVlXCI7XG5pbXBvcnQgeyByZW1vdmVGcm9tRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnlJZCB9IGZyb20gXCIuL0dldENvbm5lY3Rpb25zXCI7XG5leHBvcnQgZnVuY3Rpb24gRGVsZXRlQ29ubmVjdGlvbkJ5SWQoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHlpZWxkIEdldENvbm5lY3Rpb25CeUlkKGlkKTtcbiAgICAgICAgRGVsZXRlVGhlQ29ubmVjdGlvbihpZCk7XG4gICAgICAgIHJlbW92ZUZyb21EYXRhYmFzZShcImNvbm5lY3Rpb25cIiwgaWQpO1xuICAgICAgICBDb25uZWN0aW9uQmluYXJ5VHJlZS5yZW1vdmVOb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICBDb25uZWN0aW9uVHlwZVRyZWUucmVtb3ZlVHlwZUNvbmNlcHQoY29ubmVjdGlvbi50eXBlSWQsIGlkKTtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ1bGsgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCdWxrXCI7XG5leHBvcnQgZnVuY3Rpb24gRmluZENvbmNlcHRzRnJvbUNvbm5lY3Rpb25zKGNvbm5lY3Rpb25MaXN0ID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIUNvbmNlcHRMaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0TGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFDb25jZXB0TGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29uY2VwdExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ1bGsoQ29uY2VwdExpc3QpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbnNCdWxrSW5NZW1vcnkoY29tcG9zaXRpb25faWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgRmluYWxDb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvc2l0aW9uX2lkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoY29tcG9zaXRpb25faWRzW2ldKTtcbiAgICAgICAgICAgIEZpbmFsQ29ubmVjdGlvbkxpc3QucHVzaCguLi5jb25uZWN0aW9uTGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZpbmFsQ29ubmVjdGlvbkxpc3Q7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRcIjtcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uXCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb24oaWQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgY29ubmVjdGlvbiBsaXN0IG9ubGluZVwiLCBjb25uZWN0aW9uTGlzdCk7XG4gICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aEFsbElkcyhpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoV2l0aFN1YkNvbXBvc2l0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uRnJvbU1lbW9yeShpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeShpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnY3JlYXRlZF9hdCddID0gY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkoaWQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2NyZWF0ZWRfYXQnXSA9IGNvbmNlcHQuZW50cnlUaW1lU3RhbXA7XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnlGcm9tQ29ubmVjdGlvbnMoaWQsIGNvbm5lY3Rpb25MaXN0KSB7XG4gICAgdmFyIGNvbm5lY3Rpb25MaXN0O1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gYXdhaXQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJiB0b0NvbmNlcHRJZCAhPSBudWxsICYmIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IHRvQ29uY2VwdC50eXBlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9Db25jZXB0VHlwZSA9PSBudWxsICYmIHRvQ29uY2VwdFR5cGVJZCAhPSBudWxsICYmIHRvQ29uY2VwdFR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbG1haW5TdHJpbmcgPSAoX2QgPSAoX2MgPSB0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsS2V5ID0gbG9jYWxtYWluU3RyaW5nLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIHRoZSBmYXVsdHkgY29ubmVjdGlvbiBcIiwgY29ubmVjdGlvbkxpc3RbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2hXaXRoU3ViQ29tcG9zaXRpb25zKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFtcImlkXCJdID0gaWQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJiB0b0NvbmNlcHRJZCAhPSBudWxsICYmIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbkJ1bGtcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25XaXRoSWRzIH0gZnJvbSBcIi4vQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25cIjtcbmltcG9ydCB7IEZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25zQnVsa0luTWVtb3J5IH0gZnJvbSBcIi4vRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtJbk1lbW9yeVwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5LCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkgfSBmcm9tIFwiLi9HZXRDb21wb3NpdGlvblwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uQnVsayhpZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsoaWRzKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbkZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25CdWxrV2l0aERhdGFJZChpZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsoaWRzKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkKGlkcyA9IFtdLCBjb25uZWN0aW9ucyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIG5ld0Nvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsoY29ubmVjdGlvbnMpO1xuICAgICAgICB2YXIgbXlOZXdDb25uZWN0aW9ucyA9IG5ld0Nvbm5lY3Rpb25zO1xuICAgICAgICB2YXIgb2xkQ29ubmVjdGlvbnMgPSB5aWVsZCBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeShpZHMpO1xuICAgICAgICBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbldpdGhJZHMoY29ubmVjdGlvbnMsIG9sZENvbm5lY3Rpb25zKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QoaWRzID0gW10sIGNvbm5lY3Rpb25zID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVtYWluaW5nQ29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25zW2ldKTtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmlkID09IDApIHtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdDb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb25zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBHZXRDb25uZWN0aW9uQnVsayhyZW1haW5pbmdDb25uZWN0aW9ucyk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJ0SElTIElTIFRIRSBTVEFSVFwiLCBpZHNbaV0pXG4gICAgICAgICAgICB2YXIgY29tcCA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeShpZHNbaV0pO1xuICAgICAgICAgICAgY29tcG9zaXRpb25zW2lkc1tpXV0gPSBjb21wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldEFsbENvbmNlcHRzQnlUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25jZXB0c0J5VHlwZVwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1wiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbCwgR2V0Q29tcG9zaXRpb25Mb2NhbFdpdGhJZCB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbU1lbW9yeSwgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5IH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25cIjtcbmltcG9ydCBHZXRDb25jZXB0QnlDaGFyYWN0ZXIgZnJvbSBcIi4vR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyXCI7XG5pbXBvcnQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwgZnJvbSBcIi4vTG9jYWwvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWxcIjtcbi8vIGdldCB0aGUgbGlzdCBvZiBjb21wb3NpdGlvbnMgZnJvbSB0aGUgdHlwZSBcbi8vIGZvciBlZyBnZXQgbGlzdCBvZiBib29tZ3B0XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0KGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3Rlcihjb21wb3NpdGlvbk5hbWUpO1xuICAgICAgICB2YXIgQ29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGlmIChjb25jZXB0KSB7XG4gICAgICAgICAgICB5aWVsZCBHZXRBbGxDb25jZXB0c0J5VHlwZShjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCk7XG4gICAgICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdHNCeVR5cGVJZEFuZFVzZXIoY29uY2VwdC5pZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBzdGFydFBhZ2UgPSBpbnBhZ2UgKiAocGFnZSAtIDEpO1xuICAgICAgICAgICAgdmFyIHByZWZldGNoQ29tcG9zaXRpb24gPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICBwcmVmZXRjaENvbXBvc2l0aW9uLnB1c2goY29uY2VwdExpc3RbaV0uaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsocHJlZmV0Y2hDb21wb3NpdGlvbik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRQYWdlOyBpIDwgc3RhcnRQYWdlICsgaW5wYWdlOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBvc2l0aW9uSnNvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uRnJvbU1lbW9yeShjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIENvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbXBvc2l0aW9uSnNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0QWxsKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgTG9jYWxDb21wb3NpdGlvbkxpc3QgPSBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbChjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCk7XG4gICAgICAgIGxldCBDb21wb3NpdGlvbkxpc3QgPSBHZXRDb21wb3NpdGlvbkxpc3QoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpO1xuICAgICAgICBsZXQgQWxsTGlzdCA9IFtdO1xuICAgICAgICBQcm9taXNlLnJhY2UoW0xvY2FsQ29tcG9zaXRpb25MaXN0LCBDb21wb3NpdGlvbkxpc3RdKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9taXNlIHJlc3VsdFwiLCByZXN1bHQpO1xuICAgICAgICAgICAgQWxsTGlzdC5wdXNoKC4uLnJlc3VsdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGhhbmRsaW5nXCIsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIENvbXBvc2l0aW9uTGlzdC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2Vjb25kIHByb21pc2UgcmVzdWx0XCIsIHJlc3VsdCk7XG4gICAgICAgICAgICBBbGxMaXN0LnB1c2goLi4ucmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBBbGxMaXN0O1xuICAgIH0pO1xufVxuLy8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uTGlzdEFsbFdpdGhJZChjb21wb3NpdGlvbk5hbWU6IHN0cmluZyx1c2VySWQ6bnVtYmVyLCAgaW5wYWdlOm51bWJlciA9IDEwLCBwYWdlOm51bWJlciA9MSl7XG4vLyAgICBsZXQgTG9jYWxDb21wb3NpdGlvbkxpc3QgPSAgYXdhaXQgR2V0Q29tcG9zaXRpb25MaXN0TG9jYWxXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpO1xuLy8gICAgY29uc29sZS5sb2coXCJ0YmlzIGlzIHRoZSBsb2NhbCBjb21wb3NpdGlvbiBsaXN0XCIsIExvY2FsQ29tcG9zaXRpb25MaXN0KTtcbi8vICAgIGxldCBDb21wb3NpdGlvbkxpc3QgPSAgICBhd2FpdCBHZXRDb21wb3NpdGlvbkxpc3RXaXRoSWQoY29tcG9zaXRpb25OYW1lLHVzZXJJZClcbi8vICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgb25saW5lIGNvbXBvc2l0aW9uIGxpc3RcIiwgQ29tcG9zaXRpb25MaXN0KTtcbi8vICAgIGxldCBBbGxMaXN0OiBhbnlbXSA9IFtdO1xuLy8gICAgLy8gUHJvbWlzZS5yYWNlKFtMb2NhbENvbXBvc2l0aW9uTGlzdCwgQ29tcG9zaXRpb25MaXN0XSlcbi8vICAgIC8vIC50aGVuKChyZXN1bHQpPT4ge1xuLy8gICAgLy8gICAgY29uc29sZS5sb2coXCJQcm9taXNlIHJlc3VsdFwiLCByZXN1bHQpO1xuLy8gICAgLy8gICAgQWxsTGlzdC5wdXNoKC4uLnJlc3VsdCk7XG4vLyAgICAvLyB9KVxuLy8gICAgLy8gLmNhdGNoKChlcnJvcik9Pntcbi8vICAgIC8vICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gaGFuZGxpbmdcIiwgZXJyb3IpO1xuLy8gICAgLy8gfSk7XG4vLyAgICAvLyBDb21wb3NpdGlvbkxpc3QudGhlbigocmVzdWx0KT0+e1xuLy8gICAgLy8gICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWNvbmQgcHJvbWlzZSByZXN1bHRcIiwgcmVzdWx0KTtcbi8vICAgIC8vICAgIEFsbExpc3QucHVzaCguLi5yZXN1bHQpO1xuLy8gICAgLy8gfSlcbi8vICAgIEFsbExpc3QucHVzaCguLi5Mb2NhbENvbXBvc2l0aW9uTGlzdCk7XG4vLyAgICBBbGxMaXN0LnB1c2goLi4uQ29tcG9zaXRpb25MaXN0KTtcbi8vICAgIHJldHVybiBBbGxMaXN0O1xuLy8gfVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uTGlzdEFsbFdpdGhJZChjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHRMb2NhbCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBjb25jZXB0T25saW5lID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgbGV0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGxldCBjb25jZXB0TGlzdExvY2FsID0gW107XG4gICAgICAgIGxldCBmaW5hbExvY2FsID0gW107XG4gICAgICAgIGxldCBjb25jZXB0TGlzdE9ubGluZSA9IFtdO1xuICAgICAgICBpZiAoY29uY2VwdExvY2FsLmlkICE9IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHRMaXN0TG9jYWwgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0TG9jYWwuaWQsIHVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHRPbmxpbmUuaWQgIT0gMCkge1xuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29uY2VwdHNCeVR5cGUoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdExpc3RPbmxpbmUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdHNCeVR5cGVJZEFuZFVzZXIoY29uY2VwdE9ubGluZS5pZCwgdXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHRMaXN0ID0gY29uY2VwdExpc3RPbmxpbmU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0TGlzdExvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaXNEdXBsaWNhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29uY2VwdExpc3RPbmxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdExpc3RMb2NhbFtpXS5naG9zdElkID09IGNvbmNlcHRMaXN0T25saW5lW2pdLmdob3N0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICBmaW5hbExvY2FsLnB1c2goY29uY2VwdExpc3RMb2NhbFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBhbGwgbGlzdFwiLCBmaW5hbExvY2FsKTtcbiAgICAgICAgbGV0IEFsbExpc3QgPSBbXTtcbiAgICAgICAgQWxsTGlzdCA9IHlpZWxkIEZvcm1hdFRoZUNvbmNlcHRzKGNvbmNlcHRMaXN0LCBmaW5hbExvY2FsLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICByZXR1cm4gQWxsTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3RXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbmNlcHRzQnlUeXBlKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UGFnZSA9IGlucGFnZSAqIChwYWdlIC0gMSk7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2hDb21wb3NpdGlvbiA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRUaGVDb25jZXB0cyhjb25jZXB0TGlzdCwgbG9jYWxDb25jZXB0TGlzdCwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IENvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgc3RhcnRQYWdlID0gaW5wYWdlICogKHBhZ2UgLSAxKTtcbiAgICAgICAgdmFyIHByZWZldGNoQ29tcG9zaXRpb24gPSBbXTtcbiAgICAgICAgbGV0IGxvY2FsQ29uY2VwdExlbmd0aCA9IGxvY2FsQ29uY2VwdExpc3QubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRQYWdlOyBpIDwgc3RhcnRQYWdlICsgaW5wYWdlIC0gbG9jYWxDb25jZXB0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbENvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25Mb2NhbFdpdGhJZChsb2NhbENvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgIENvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbXBvc2l0aW9uSnNvbik7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZSAtIGxvY2FsQ29uY2VwdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkxpc3QucHVzaChjb21wb3NpdGlvbkpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZVwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB2YXIgbGl0ZXJhbENoYXJhY3RlciA9IGAke2NoYXJhY3RlclZhbHVlfWA7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IChjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuaWQpID09IDApICYmIGxpdGVyYWxDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKGNoYXJhY3RlclZhbHVlLCA1MSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVXBkYXRlZChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgIHZhciBsaXRlcmFsQ2hhcmFjdGVyID0gYCR7Y2hhcmFjdGVyVmFsdWV9YDtcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgKGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC5pZCkgPT0gMCkgJiYgbGl0ZXJhbENoYXJhY3Rlcikge1xuICAgICAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb25CeUlkKGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uKGlkKTtcbiAgICAgICAgaWYgKChjb25uZWN0aW9uID09IG51bGwgfHwgY29ubmVjdGlvbi5pZCA9PSAwKSAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25TdHJpbmcgPSB5aWVsZCBHZXRDb25uZWN0aW9uKGlkKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgTG9jYWxDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbm5lY3Rpb25EYXRhXCI7XG5pbXBvcnQgeyBnZXRBbGxGcm9tTG9jYWxEYiB9IGZyb20gXCIuLi9EYXRhYmFzZS9pbmRleGRibG9jYWxcIjtcbmltcG9ydCB7IGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkIH0gZnJvbSBcIi4uL0RhdGFiYXNlL2luZGV4ZWRkYlwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldERhdGFGcm9tSW5kZXhEYigpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyB2YXIgY29uY2VwdExpc3QgPSBhd2FpdCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZChcImNvbmNlcHRcIik7XG4gICAgICAgIEdldENvbm5lY3Rpb25zRnJvbUluZGV4RGIoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coY29uY2VwdExpc3QpO1xuICAgICAgICAvLyBpZihBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSl7XG4gICAgICAgIC8vICAgICBmb3IodmFyIGk9MCA7aSA8IGNvbmNlcHRMaXN0Lmxlbmd0aCA7aSsrKXtcbiAgICAgICAgLy8gICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0TGlzdFtpXSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXREYXRhRnJvbUluZGV4RGJMb2NhbCgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyB2YXIgY29uY2VwdExpc3QgPSBhd2FpdCBnZXRBbGxGcm9tTG9jYWxEYihcImxvY2FsY29uY2VwdFwiKTtcbiAgICAgICAgR2V0Q29ubmVjdGlvbnNGcm9tSW5kZXhEYkxvY2FsKCk7XG4gICAgICAgIC8vIGlmKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKXtcbiAgICAgICAgLy8gICAgIGZvcih2YXIgaT0wIDtpIDwgY29uY2VwdExpc3QubGVuZ3RoIDtpKyspe1xuICAgICAgICAvLyAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBHZXRDb25uZWN0aW9uc0Zyb21JbmRleERiKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKFwiY29ubmVjdGlvblwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuQWRkQ29ubmVjdGlvblRvTWVtb3J5KGNvbm5lY3Rpb25MaXN0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gR2V0Q29ubmVjdGlvbnNGcm9tSW5kZXhEYkxvY2FsKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIGdldEFsbEZyb21Mb2NhbERiKFwibG9jYWxjb25uZWN0aW9uXCIpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBMb2NhbENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24oY29ubmVjdGlvbkxpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVcIjtcbmltcG9ydCB7IEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldENvbm5lY3Rpb25PZlRoZUNvbmNlcHRcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkgfSBmcm9tIFwiLi9HZXRDb21wb3NpdGlvblwiO1xuaW1wb3J0IEdldFRoZUNvbmNlcHQgZnJvbSBcIi4vR2V0VGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1wiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldExpbmsoaWQsIGxpbmtlciwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIGxpbmtTdHJpbmcgPSAoKF9hID0gY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiICsgXCJfXCIgKyBsaW5rZXI7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUobGlua1N0cmluZywgMTYpO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHQgPSByZWxhdGVkQ29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKHJlbGF0ZWRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdChyZWxhdGVkQ29uY2VwdC5pZCwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGlucGFnZSwgcGFnZSk7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIHZhciBwcmVmZXRjaCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByZWZldGNoLnB1c2goY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdElkID0gY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb21wb3NpdGlvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkodG9Db25jZXB0LmlkKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChuZXdDb21wb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rUmF3KGlkLCBsaW5rZXIsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciBsaW5rU3RyaW5nID0gKChfYSA9IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIiArIFwiX1wiICsgbGlua2VyO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKGxpbmtTdHJpbmcsIDE2KTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9Db25jZXB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc1RvVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNUb1RoZUNvbmNlcHRcIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rZXJDb25uZWN0aW9uRnJvbUNvbmNlcHRzKGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0geWllbGQgR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdChpZCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbm5lY3Rpb24gPSBjb25uZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uSWRlbnRpZmllciA9IGxvY2FsQ29ubmVjdGlvbi50eXBlSWQ7XG4gICAgICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbklkZW50aWZpZXIpO1xuICAgICAgICAgICAgbG9jYWxDb25uZWN0aW9uLnR5cGUgPSBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0cyhpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IHlpZWxkIEdldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0KGlkKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zW2ldO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25JZGVudGlmaWVyID0gbG9jYWxDb25uZWN0aW9uLnR5cGVJZDtcbiAgICAgICAgICAgIGxldCBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChjb25uZWN0aW9uSWRlbnRpZmllcik7XG4gICAgICAgICAgICBsb2NhbENvbm5lY3Rpb24udHlwZSA9IGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5IH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25cIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsgfSBmcm9tIFwiLi4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5IH0gZnJvbSBcIi4vQ29uY2VwdEZpbmRpbmcvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZWxhdGlvbihpZCwgcmVsYXRpb24sIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkocmVsYXRpb24pO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHQgPSByZWxhdGVkQ29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKHJlbGF0ZWRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdChyZWxhdGVkQ29uY2VwdC5pZCwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGlucGFnZSwgcGFnZSk7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIHZhciBwcmVmZXRjaCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByZWZldGNoLnB1c2goY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdElkID0gY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb21wb3NpdGlvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkodG9Db25jZXB0LmlkKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChuZXdDb21wb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRSZWxhdGlvblJhdyhpZCwgcmVsYXRpb24sIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkocmVsYXRpb24pO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHQgPSByZWxhdGVkQ29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKHJlbGF0ZWRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdChyZWxhdGVkQ29uY2VwdC5pZCwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGlucGFnZSwgcGFnZSk7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIHZhciBwcmVmZXRjaCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByZWZldGNoLnB1c2goY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b0NvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRcIjtcbmltcG9ydCB7IGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQsIEdldFVzZXJHaG9zdElkIH0gZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHZXRUaGVDb25jZXB0KGlkLCB1c2VySWQgPSA5OTkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGlmIChpZCA8IDApIHtcbiAgICAgICAgICAgIGxldCBsY29uY2VwdCA9IHlpZWxkIEdldFVzZXJHaG9zdElkKHVzZXJJZCwgaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQobGNvbmNlcHQpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgY29uY2VwdC5pZCA9PSAwKSAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIGlmIChjb25jZXB0LnR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0VHlwZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdFR5cGUgPT0gbnVsbCAmJiBjb25jZXB0LnR5cGVJZCAhPSBudWxsICYmIGNvbmNlcHQudHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHR5cGVDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0QWlEYXRhIH0gZnJvbSBcIi4uL0FwaS9HZXRBaURhdGFcIjtcbmltcG9ydCB7IFNldHRpbmdEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdEYXRhXCI7XG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TZXR0aW5nc1wiO1xuaW1wb3J0IHsgQWlVcGRhdGVGbGFnLCBHZXRTdGF0c0Zyb21EYXRhYmFzZSB9IGZyb20gXCIuLi9EYXRhYmFzZS9pbmRleGVkZGJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEluaXRpYWxpemVTeXN0ZW0oZW5hYmxlQWkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKGVuYWJsZUFpKSB7XG4gICAgICAgICAgICB2YXIgc3RhdHNEYXRhID0geWllbGQgR2V0U3RhdHNGcm9tRGF0YWJhc2UoKTtcbiAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHN0YXRzRGF0YTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5pc09ubGluZVN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFpRGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFB1cmdhdG9yeURhdGFiYXNlVXBkYXRlZCgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBTZXR0aW5ncy5pc09ubGluZVN5bmMgPSB0cnVlO1xuICAgICAgICB2YXIgc2V0dGluZ0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEoU2V0dGluZ3MuaXNPbmxpbmVTeW5jKTtcbiAgICAgICAgQWlVcGRhdGVGbGFnKHNldHRpbmdEYXRhKTtcbiAgICB9KTtcbn1cbiIsImltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdChsY29uY2VwdCkge1xuICAgIGxldCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICBjb25jZXB0LmlkID0gbGNvbmNlcHQuaWQ7XG4gICAgY29uY2VwdC5naG9zdElkID0gbGNvbmNlcHQuZ2hvc3RJZDtcbiAgICBjb25jZXB0LmFjY2Vzc0lkID0gbGNvbmNlcHQuYWNjZXNzSWQ7XG4gICAgY29uY2VwdC5jYXRlZ29yeUlkID0gbGNvbmNlcHQuY2F0ZWdvcnlJZDtcbiAgICBjb25jZXB0LnR5cGVJZCA9IGxjb25jZXB0LnR5cGVJZDtcbiAgICBjb25jZXB0LnR5cGUgPSBsY29uY2VwdC50eXBlO1xuICAgIGNvbmNlcHQuZW50cnlUaW1lU3RhbXAgPSBsY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICBjb25jZXB0LnVzZXJJZCA9IGxjb25jZXB0LnVzZXJJZDtcbiAgICBjb25jZXB0LmNoYXJhY3RlclZhbHVlID0gbGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmV4cG9ydCBmdW5jdGlvbiBDb252ZXJ0RnJvbUxDb25uZWN0aW9uVG9Db25uZWN0aW9uKGxjb25uZWN0aW9uKSB7XG4gICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gbGNvbm5lY3Rpb24ub2ZUaGVDb25jZXB0SWQ7XG4gICAgY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZCA9IGxjb25uZWN0aW9uLnRvVGhlQ29uY2VwdElkO1xuICAgIGNvbm5lY3Rpb24udHlwZUlkID0gbGNvbm5lY3Rpb24udHlwZUlkO1xuICAgIGNvbm5lY3Rpb24ub3JkZXJJZCA9IGxjb25uZWN0aW9uLm9yZGVySWQ7XG4gICAgY29ubmVjdGlvbi5pZCA9IGxjb25uZWN0aW9uLmlkO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwsIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzTG9jYWwob2ZUaGVDb25jZXB0LCB0b1RoZUNvbmNlcHQsIGxpbmtlciwgYm90aCA9IGZhbHNlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgdXNlcklkID0gb2ZUaGVDb25jZXB0LnVzZXJJZDtcbiAgICAgICAgaWYgKGJvdGgpIHtcbiAgICAgICAgICAgIGxldCBwcmVmaXgxID0gKChfYSA9IHRvVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICAgICAgbGV0IGxpbmtlckFkZDEgPSBsaW5rZXIgKyBcIl9ieVwiO1xuICAgICAgICAgICAgbGV0IGJhY2t3YXJkTGlua2VyID0gcHJlZml4MSArIFwiX1wiICsgbGlua2VyQWRkMTtcbiAgICAgICAgICAgIC8vIGlmKGNvdW50KXtcbiAgICAgICAgICAgIC8vICAgIGF3YWl0IENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZDEsIHRvVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZSA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChcImNvbm5lY3Rpb25cIiwgYmFja3dhcmRMaW5rZXIsIGZhbHNlLCA5OTksIDk5OSwgOTk5KTtcbiAgICAgICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKHRvVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LmlkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UuaWQsIDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmaXggPSAoKF9iID0gb2ZUaGVDb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCI7XG4gICAgICAgIGxldCBsaW5rZXJBZGQgPSBsaW5rZXIgKyBcIl9zXCI7XG4gICAgICAgIGxldCBmb3J3YXJkTGlua2VyID0gcHJlZml4ICsgXCJfXCIgKyBsaW5rZXJBZGQ7XG4gICAgICAgIC8vIGlmKGNvdW50KXtcbiAgICAgICAgLy8gLy8gYXdhaXQgQ291bnRSZWxhdGlvbnNoaXAobGlua2VyQWRkLCBvZlRoZUNvbmNlcHQsIHVzZXJJZCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKG9mVGhlQ29uY2VwdC5pZCwgdG9UaGVDb25jZXB0LmlkLCBjb25uZWN0aW9uQ29uY2VwdC5pZCwgMTAwMCk7XG4gICAgICAgIHJldHVybiBuZXdDb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgTENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKSB7XG4gICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICBsZXQgY29uY2VwdCA9IG5ldyBMQ29uY2VwdCgwLCAwLCAwLCAwLCAwLCBcIjBcIiwgXCIwXCIsIGZhbHNlLCBjcmVhdGVkX29uLCB1cGRhdGVkX29uLCAwKTtcbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgZ2V0QWxsRnJvbUxvY2FsRGIgfSBmcm9tIFwiLi4vLi4vRGF0YWJhc2UvaW5kZXhkYmxvY2FsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBnZXRBbGxGcm9tTG9jYWxEYihcImxvY2FsY29uY2VwdFwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0VG9NZW1vcnkoY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG5vZGUgPSBuZXcgTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBMb2NhbEJpbmFyeVRyZWUuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tIFwiLi4vTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0XCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwgfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25uZWN0aW9uTG9jYWxcIjtcbmltcG9ydCB7IE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCB9IGZyb20gXCIuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbFwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwoanNvbiwgb2ZUaGVDb25jZXB0SWQgPSBudWxsLCBvZlRoZUNvbmNlcHRVc2VySWQgPSBudWxsLCBtYWluS2V5ID0gbnVsbCwgdXNlcklkID0gbnVsbCwgYWNjZXNzSWQgPSBudWxsLCBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IG51bGwsIGF1dG9tYXRpY1N5bmMgPSBmYWxzZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgdmFyIGxvY2FsQWNjZXNzSWQgPSBhY2Nlc3NJZCAhPT0gbnVsbCAmJiBhY2Nlc3NJZCAhPT0gdm9pZCAwID8gYWNjZXNzSWQgOiA5OTk7XG4gICAgICAgIHZhciBsb2NhbFNlc3Npb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSBudWxsICYmIHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSB2b2lkIDAgPyBzZXNzaW9uSW5mb3JtYXRpb25JZCA6IDk5OTtcbiAgICAgICAgdmFyIE1haW5LZXlMb2NhbCA9IG1haW5LZXkgIT09IG51bGwgJiYgbWFpbktleSAhPT0gdm9pZCAwID8gbWFpbktleSA6IDA7XG4gICAgICAgIHZhciBNYWluQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGpzb25ba2V5XSAhPSAnc3RyaW5nJyAmJiB0eXBlb2YganNvbltrZXldICE9ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkID09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwoa2V5LCBcIlwiLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxNYWluS2V5ID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbktleUxvY2FsID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwoa2V5LCBcIlwiLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChvZlRoZSwgY29uY2VwdC5pZCwgbG9jYWxNYWluS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgdmFyIG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxNYWluS2V5ID0gTWFpbktleUxvY2FsO1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwganNvbltrZXldLCBmYWxzZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKG9mVGhlLCBjb25jZXB0LmlkLCBsb2NhbE1haW5LZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYWluQ29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHRcIjtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IHN0b3JlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9pbmRleGRibG9jYWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHRMb2NhbChyZWZlcmVudCwgdHlwZWNoYXJhY3RlciwgdXNlcklkLCBjYXRlZ29yeUlkLCB0eXBlSWQsIGFjY2Vzc0lkLCBpc0NvbXBvc2l0aW9uID0gZmFsc2UsIHJlZmVyZW50SWQgPSAwKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0gLU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgICAgIHZhciBpc05ldyA9IHRydWU7XG4gICAgICAgIGxldCBjcmVhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAocmVmZXJlbnQgPT0gXCJ0aGVcIikge1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBuZXcgTENvbmNlcHQoMSwgOTk5LCA1LCA1LCBhY2Nlc3NJZCwgcmVmZXJlbnQsIHR5cGVjaGFyYWN0ZXIsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uLCByZWZlcmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0gbmV3IExDb25jZXB0KGlkLCB1c2VySWQsIHR5cGVJZCwgY2F0ZWdvcnlJZCwgYWNjZXNzSWQsIHJlZmVyZW50LCB0eXBlY2hhcmFjdGVyLCBpc05ldywgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbiwgcmVmZXJlbnRJZCk7XG4gICAgICAgIGNvbmNlcHQuaXNUZW1wID0gdHJ1ZTtcbiAgICAgICAgY29uY2VwdC5pc0NvbXBvc2l0aW9uID0gaXNDb21wb3NpdGlvbjtcbiAgICAgICAgTG9jYWxDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25jZXB0XCIsIGNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb25cIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL2luZGV4ZGJsb2NhbFwiO1xuaW1wb3J0IHsgTG9jYWxTeW5jRGF0YSB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwob2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQgPSAxLCB0eXBlU3RyaW5nID0gXCJcIikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIGxldCByYW5kb21pZCA9IC1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgICAgICBsZXQgcmVhbE9mVGhlQ29uY2VwdElkID0gMDtcbiAgICAgICAgbGV0IHJlYWxUb1RoZUNvbmNlcHRJZCA9IDA7XG4gICAgICAgIGxldCByZWFsVHlwZUlkID0gMDtcbiAgICAgICAgcmVhbE9mVGhlQ29uY2VwdElkID0gb2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgIHJlYWxUb1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICByZWFsVHlwZUlkID0gdHlwZUlkO1xuICAgICAgICBsZXQgY29ubmVjdGlvbiA9IG5ldyBMQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkICE9IHRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uID0gbmV3IExDb25uZWN0aW9uKHJhbmRvbWlkLCByZWFsT2ZUaGVDb25jZXB0SWQsIHJlYWxUb1RoZUNvbmNlcHRJZCwgdHlwZUlkLCBvcmRlcklkLCBhY2Nlc3NJZCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmlzVGVtcCA9IHRydWU7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnR5cGVDaGFyYWN0ZXIgPSB0eXBlU3RyaW5nO1xuICAgICAgICAgICAgTG9jYWxDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgTG9jYWxTeW5jRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkxvY2FsLCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkIH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25Mb2NhbFwiO1xuaW1wb3J0IEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsIGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wb3NpdGlvbkpzb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbkxvY2FsKGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkxpc3QucHVzaChjb21wb3NpdGlvbkpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0TG9jYWxXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wb3NpdGlvbkpzb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkKGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkxpc3QucHVzaChjb21wb3NpdGlvbkpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTG9jYWxUb1JlYWwgfSBmcm9tIFwiLi4vLi4vQXBpL1RyYW5zbGF0ZS9UcmFuc2xhdGVMb2NhbFRvUmVhbFwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb24gfSBmcm9tIFwiLi4vR2V0Q29tcG9zaXRpb25cIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgbGV0IHJlYWxDb25jZXB0ID0geWllbGQgVHJhbnNsYXRlTG9jYWxUb1JlYWwoaWQpO1xuICAgICAgICAgICAgaWYgKHJlYWxDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCBHZXRDb21wb3NpdGlvbihyZWFsQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHJldHVybk91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBMb2NhbENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcInRvcFwiO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIEZpbmFsUmV0dXJuWydkYXRhJ10gPSByZXR1cm5PdXRwdXQ7XG4gICAgICAgIEZpbmFsUmV0dXJuWydpZCddID0gaWQ7XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGFycm91dHB1dCA9IFtdO1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gY29uY2VwdC50eXBlSWQ7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGUgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2aXNpdGVkQ29uY2VwdHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2aXNpdGVkQ29uY2VwdHMucHVzaChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwidG9wXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaExvY2FsKHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hMb2NhbCh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldExvY2FsQ29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUgfSBmcm9tIFwiLi4vLi4vQXBpL0xvY2FsL0dldExvY2FsQ29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVcIjtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCwgU3BsaXRTdHJpbmdzIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJWYWx1ZSwgNTEpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKGNoYXJhY3Rlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBsY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09IFwidGhlXCIpIHtcbiAgICAgICAgICAgIGxjb25jZXB0LmlkID0gMTtcbiAgICAgICAgICAgIGxjb25jZXB0LnR5cGVJZCA9IDU7XG4gICAgICAgICAgICBsY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSA9IFwidGhlXCI7XG4gICAgICAgICAgICByZXR1cm4gbGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3MoY2hhcmFjdGVyKTtcbiAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IGNhdGVnb3J5ID0gMTtcbiAgICAgICAgICAgIGxldCBwcmVmaXggPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0pO1xuICAgICAgICAgICAgaWYgKHByZWZpeC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSBwcmVmaXguaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNhdGVnb3J5QW5kQ2hhcmFjdGVyTG9jYWxNZW1vcnkoY2hhcmFjdGVyLCBjYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3BsaXR0ZWRTdHJpbmdBcnJheVswXSA9PSBjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIGxjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwoY2hhcmFjdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2F0ZWdvcnlBbmRDaGFyYWN0ZXJMb2NhbE1lbW9yeSh2YWx1ZSwgY2F0ZWdvcnlJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25jZXB0ID0gTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbCh2YWx1ZSwgY2F0ZWdvcnlJZCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsRnVsbChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgdmFyIGxpdGVyYWxDaGFyYWN0ZXIgPSBgJHtjaGFyYWN0ZXJWYWx1ZX1gO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCAoY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmlkKSA9PSAwKSAmJiBsaXRlcmFsQ2hhcmFjdGVyKSB7XG4gICAgICAgICAgICB5aWVsZCBHZXRMb2NhbENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWwob2ZUaGVDb25jZXB0LCB0eXBlSWQsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25uZWN0aW9ucyA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbk9mQ29tcG9zaXRpb25BbmRUeXBlTG9jYWwodHlwZUlkLCBvZlRoZUNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uTG9jYWwsIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5TG9jYWwgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWwgfSBmcm9tIFwiLi9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWxcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZWxhdGlvbkxvY2FsKGlkLCByZWxhdGlvbiwgdXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHR5cGVDb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbChyZWxhdGlvbik7XG4gICAgICAgIGxldCBsb2NhbENvbm5lY3Rpb25zID0gW107XG4gICAgICAgIGlmICh0eXBlQ29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBsb2NhbENvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdExvY2FsKGlkLCB0eXBlQ29uY2VwdC5pZCwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0cHV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxDb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbkxvY2FsKGxvY2FsQ29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goY29tcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0LCBHZXRUaGVDb25jZXB0IH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHsgY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdCB9IGZyb20gXCIuLi9Db252ZXJzaW9uL0NvbnZlcnRDb25jZXB0c1wiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldFRoZUNvbmNlcHRMb2NhbChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBsY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgICAgICBsY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGxjb25jZXB0ID0gY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0TG9jYWwgZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ29uY2VwdExvY2FsKHJlZmVyZW50LCB0eXBlQ2hhcmFjdGVyLCB1c2VySWQsIGNhdGVnb3J5SWQsIHR5cGVJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKHJlZmVyZW50LCB0eXBlSWQpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIGxldCBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIGlmICh0eXBlQ2hhcmFjdGVyID09IFwidGhlXCIpIHtcbiAgICAgICAgICAgIGNhdGVnb3J5SWQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGVDaGFyYWN0ZXIsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUlkLCBhY2Nlc3NJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IENyZWF0ZVRoZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0TG9jYWxcIjtcbmltcG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsIH0gZnJvbSBcIi4vTWFrZVRoZVR5cGVMb2NhbFwiO1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgTG9jYWxTeW5jRGF0YSB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwodHlwZSwgcmVmZXJlbnQsIGNvbXBvc2l0aW9uID0gZmFsc2UsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5LCByZWZlcmVudElkID0gMCkge1xuICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCwgYWNjZXNzSWQ7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSA5OTk7XG4gICAgICAgIHZhciBjYXRlZ29yeUlkID0gNDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgYWNjZXNzSWQgPSA0O1xuICAgICAgICB2YXIgc3RyaW5nVG9DaGVjayA9IFwiXCI7XG4gICAgICAgIHZhciBzdHJpbmdMZW5ndGggPSByZWZlcmVudC5sZW5ndGg7XG4gICAgICAgIHZhciB0eXBlQ29uY2VwdDtcbiAgICAgICAgdmFyIGNvbmNlcHQ7XG4gICAgICAgIHZhciBzdGFydHNXaXRoVGhlID0gdHlwZS5zdGFydHNXaXRoKFwidGhlX1wiKTtcbiAgICAgICAgaWYgKHN0YXJ0c1dpdGhUaGUpIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IFwidGhlX1wiICsgdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHR5cGUsIHNlc3Npb25JbmZvcm1hdGlvbklkLCB1c2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGUsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkLCB0cnVlLCByZWZlcmVudElkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3RyaW5nVG9DaGVjaywgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRMb2NhbChyZWZlcmVudCwgc3RyaW5nVG9DaGVjaywgdXNlcklkLCBjYXRlZ29yeUlkLCB0eXBlQ29uY2VwdC5pZCwgYWNjZXNzSWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbChzdHJpbmdUb0NoZWNrLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIHZhciBjb25jZXB0QnlDaGFyVHlwZVN0cmluZyA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChyZWZlcmVudCwgdHlwZUNvbmNlcHQuaWQpO1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRUeXBlQ2hhcmFjdGVyID0gY29uY2VwdEJ5Q2hhclR5cGVTdHJpbmc7XG4gICAgICAgICAgICAvLyB2YXIgbWFrZVRoZU5hbWVTdHJpbmcgPSBhd2FpdCBNYWtlVGhlTmFtZShyZWZlcmVudCx1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsY29uY2VwdFR5cGVDaGFyYWN0ZXIgKTtcbiAgICAgICAgICAgIC8vIHZhciBtYWtlVGhlTmFtZUNvbmNlcHQgPSBtYWtlVGhlTmFtZVN0cmluZyBhcyBDb25jZXB0O1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRUeXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRUeXBlQ2hhcmFjdGVyLmlkID09IDAgJiYgY29uY2VwdFR5cGVDaGFyYWN0ZXIudXNlcklkID09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRMb2NhbChyZWZlcmVudCwgc3RyaW5nVG9DaGVjaywgdXNlcklkLCBjYXRlZ29yeUlkLCB0eXBlQ29uY2VwdC5pZCwgYWNjZXNzSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbmNlcHQudHlwZSA9IHR5cGVDb25jZXB0O1xuICAgICAgICBMb2NhbFN5bmNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgQ3JlYXRlVGhlQ29uY2VwdExvY2FsIGZyb20gXCIuL0NyZWF0ZVRoZUNvbmNlcHRMb2NhbFwiO1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbCB9IGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsXCI7XG5pbXBvcnQgeyBTcGxpdFN0cmluZ3MgfSBmcm9tIFwiLi4vU3BsaXRTdHJpbmdzXCI7XG5pbXBvcnQgTWFrZVRoZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9NYWtlVGhlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwodHlwZVN0cmluZywgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgICAgICB2YXIgZXhpc3RpbmdDb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbCh0eXBlU3RyaW5nKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdCkge1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdC5pZCA9PSAwIHx8IGV4aXN0aW5nQ29uY2VwdC51c2VySWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzcGxpdHRlZFN0cmluZ0FycmF5ID0gU3BsaXRTdHJpbmdzKHR5cGVTdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5WzBdID09IHR5cGVTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlQ29uY2VwdExvY2FsKHR5cGVTdHJpbmcsIFwidGhlXCIsIHVzZXJJZCwgMSwgNTEpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGNhdGVnb3J5Q29uY2VwdCA9IGF3YWl0IE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0sIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIHR5cGVDb25jZXB0ID0gYXdhaXQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3BsaXR0ZWRTdHJpbmdBcnJheVsxXSwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYodHlwZUNvbmNlcHQpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlDb25jZXB0ID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3BsaXR0ZWRTdHJpbmdBcnJheVswXSwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbChzcGxpdHRlZFN0cmluZ0FycmF5WzFdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdExvY2FsKHR5cGVTdHJpbmcsIHNwbGl0dGVkU3RyaW5nQXJyYXlbMV0sIHVzZXJJZCwgY2F0ZWdvcnlDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC5pZCwgYWNjZXNzSWQpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9jYWxTeW5jRGF0YS5BZGRDb25jZXB0KGV4aXN0aW5nQ29uY2VwdCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBJbnNlcnRVbmlxdWVOdW1iZXIgZnJvbSAnLi4vLi4vSGVscGVycy9VbmlxdWVJbnNlcnQnO1xuaW1wb3J0IHsgQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluTENvbm5lY3Rpb25BcnJheSwgQ2hlY2tJZlR5cGVMQ29uY2VwdHNFeGlzdHNJbkFycmF5LCB9IGZyb20gJy4uLy4uL0hlbHBlcnMvQ2hlY2tJZkV4aXN0cyc7XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24gfSBmcm9tICcuLi8uLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uJztcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gJy4vLi4vR2V0VGhlQ29uY2VwdCc7XG5pbXBvcnQgeyBEZWxldGVDb25uZWN0aW9uQnlJZCB9IGZyb20gJy4vLi4vRGVsZXRlQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhJztcbmltcG9ydCB7IENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL0NyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwnO1xuaW1wb3J0IHsgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsIH0gZnJvbSAnLi9NYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwnO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0LCBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwgfSBmcm9tICcuLi8uLi9hcHAnO1xuaW1wb3J0IHsgY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdCwgY29udmVydEZyb21Db25uZWN0aW9uVG9MQ29ubmVjdGlvbiB9IGZyb20gJy4uL0NvbnZlcnNpb24vQ29udmVydENvbmNlcHRzJztcbi8vIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgY2FjaGUgY29tcG9zaXRpb25cbmV4cG9ydCBmdW5jdGlvbiBVcGRhdGVDb21wb3NpdGlvbkxvY2FsKHBhdGNoZXJTdHJ1Y3R1cmUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBkZWZhdWx0IHVzZXJJZCwgc2Vzc2lvbklkLCBhY2Nlc3NJZCBwYXNzZWQgYnkgdGhlIHBhdGNoZXJTdHJ1Y3R1cmVcbiAgICAgICAgY29uc3QgdXNlcklkID0gcGF0Y2hlclN0cnVjdHVyZS51c2VySWQ7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuc2Vzc2lvbklkO1xuICAgICAgICBjb25zdCBhY2Nlc3NJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuYWNjZXNzSWQ7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgbGV0IHBhcmVudENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgY29uc3QgdG9EZWxldGVDb25jZXB0cyA9IFtdO1xuICAgICAgICAvLyB0aGUgbWFpbiBjb21wb3NpdGlvbiBJZCB0aGF0IGhhcyB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHBhdGNoZWRcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25JZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuY29tcG9zaXRpb25JZDtcbiAgICAgICAgLy8gaWYgeW91IHdhbnQgdG8gZWRpdCB0aGUgc3ViY29tcG9zaXRpb25zIG9mIHRoZSBjb21wb3NpdGlvbiB0aGVuIHlvdSBoYXZlIHRvIHBhc3MgdG8gdGhpc1xuICAgICAgICBjb25zdCBvZlRoZUNvbmNlcHRJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUub2ZUaGVDb21wb3NpdGlvbklkO1xuICAgICAgICBsZXQgdG9EZWxldGVDb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICAvLyBnZXQgYWxsIGNvbm5lY3Rpb25zIGZyb20gdGhlIGJhY2tlbmQgYmVjYXVzZSBpdCBuZWVkcyBsYXRlc3QgZGF0YVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihjb21wb3NpdGlvbklkKTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0T3JpZ2luYWwgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdE9yaWdpbmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbnZlcnRGcm9tQ29ubmVjdGlvblRvTENvbm5lY3Rpb24oY29ubmVjdGlvbkxpc3RPcmlnaW5hbFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbmNlcHRJZExpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIC8vIHB1dCB0aGlzIGluIHRoZSB1cHBlciBzZWN0aW9uIGJlZm9yZSB1cGRhdGluZyBiZWNhdXNlIHRoaXMgd2lsbCB0ZWxsIGFsbCBvdGhlciBkaXN0cmlidXRlZFxuICAgICAgICAvL3NlcnZlcnMgdG8gZGVzdHJveSB0aGUgY29weSBvZiB0aGUgY29tcG9zaXRpb24gdGhhdCB0aGV5IGhhdmUgYXMgbmV3IGNvbXBvc2l0aW9uIGlzIGNvbWluZyB1cFxuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjb25uZWN0aW9ucyB0aGF0IGFyZSBpbnNpZGUgb2YgdGhlIGNvbXBvc2l0aW9uIGFuZCBzdG9yZSB0aGVtIGluXG4gICAgICAgIGxldCBhbGxDb25jZXB0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29tcG9zaXRpb25MaXN0LCBjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29uY2VwdElkTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgSW5zZXJ0VW5pcXVlTnVtYmVyKGNvbmNlcHRJZExpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIGFsbENvbmNlcHRzLnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNvbmNlcHRzIHRoYXQgYXJlIGluc2lkZSBvZiB0aGUgY29tcG9zaXRpb24gYW5kIHN0b3JlIHRoZW0gaW4gYSBjb25jZXB0TGlzdFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRJZExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbmNlcHRJZExpc3RbaV0pO1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JZCA9PSBjb25jZXB0SWRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb24gPSBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkID09IGNvbmNlcHRJZExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25jZXB0ID0gY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmNlcHRMaXN0LnB1c2goY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IHRyeWluZyB0byBwYXRjaCB0aGUgbmV3IG9iamVjdCBpbnRvIHRoZSBjb21wb3NpdGlvblxuICAgICAgICBjb25zdCBvYmplY3QgPSBwYXRjaGVyU3RydWN0dXJlLnBhdGNoT2JqZWN0O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIGxldCBpbnNlcnRpbmdDb25jZXB0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29uY2VwdCA9IGNvbXBvc2l0aW9uO1xuICAgICAgICAgICAgLy8gaWYgdGhlIGltbWVkaWRhdGUgcGFyZW50IGV4aXN0cyBpbiB0aGUgY29tcG9zaXRpb24gKGkuZS4gZm9yIG11bHRpbGV2ZWwgY29tcG9zaXRpb24pXG4gICAgICAgICAgICBpZiAocGFyZW50Q29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbENvbmNlcHQgPSBwYXJlbnRDb25jZXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGluc2VydGluZ0NvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwoa2V5LCBcIlwiLCB0cnVlLCBjb21wb3NpdGlvbi51c2VySWQsIDQsIDk5OSk7XG4gICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChvYmplY3Rba2V5XSwgaW5zZXJ0aW5nQ29uY2VwdC5pZCwgaW5zZXJ0aW5nQ29uY2VwdC51c2VySWQsIGNvbXBvc2l0aW9uLmlkLCBjb21wb3NpdGlvbi51c2VySWQsIDQsIDk5OSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSBuZXcgY29uY2VwdCBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW5nQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChrZXksIHZhbHVlLCBmYWxzZSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25jZXB0IGV4aXN0cyBpbiB0aGUgY29uY2VwdCBsaXN0IGJlY2F1c2UgaWYgaXQgZXhpc3RzIHRoZW4gd2UgaGF2ZSB0byBkZWxldGUgb2xkIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IEV4aXN0aW5nQ29uY2VwdHMgPSBDaGVja0lmVHlwZUxDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QsIGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICAgICAgLy8gaWYgdGhlIGV4aXN0aW5nIGNvbmNlcHQgdGhlbiBzdGFydCB0aGUgcHJvY2VzcyBmb3IgZGVsZXRpbmcgdGhlIGNvbmNlcHQgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRXhpc3RpbmdDb25jZXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChFeGlzdGluZ0NvbmNlcHRzW2ldLmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGluZ0Nvbm5lY3Rpb25zID0gQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluTENvbm5lY3Rpb25BcnJheShjb25uZWN0aW9uTGlzdCwgRXhpc3RpbmdDb25jZXB0c1tpXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29ubmVjdGlvbnMgPSB0b0RlbGV0ZUNvbm5lY3Rpb25zLmNvbmNhdChkZWxldGluZ0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25jZXB0cy5wdXNoKEV4aXN0aW5nQ29uY2VwdHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBuZXcgY29uY2VwdCBhbmQgdGhlIG9sZCBjb21wb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChsb2NhbENvbmNlcHQuaWQsIGluc2VydGluZ0NvbmNlcHQuaWQsIGNvbXBvc2l0aW9uLmlkLCAyKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChpbnNlcnRpbmdDb25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgeW91IGhhdmUgdG8gZGVsZXRlIHRoZSBjb25uZWN0aW9uIGluIGJ1bGtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b0RlbGV0ZUNvbm5lY3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgZnJvbSB0aGUgY2FjaGUgbGlzdFxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSBjb25uZWN0aW9uIGluIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICBEZWxldGVDb25uZWN0aW9uQnlJZCh0b0RlbGV0ZUNvbm5lY3Rpb25zW2pdLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBTeW5jRGF0YS5TeW5jRGF0YU9ubGluZSgpO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgTWFrZVRoZUNoYXJhY3RlckRhdGEgZnJvbSBcIi4vTWFrZVRoZUNoYXJhY3RlckRhdGFcIjtcbmltcG9ydCBNYWtlVGhlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlQ29uY2VwdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWFrZVRoZUNoYXJhY3Rlcih0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkKSB7XG4gICAgdmFyIGFjY2Vzc1VzZXJJZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIHZhciB0eXBlSWQgPSA1MTtcbiAgICAgICAgdmFyIHR5cGVVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgcmVmZXJlbnRVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBsZW5ndGhPZkNoYXJhY3RlcnMgPSB0aGVfY2hhcmFjdGVyX2RhdGEubGVuZ3RoO1xuICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgaWYgKGxlbmd0aE9mQ2hhcmFjdGVycyA9PSAxKSB7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbnRJZCA9IHRoZV9jaGFyYWN0ZXJfZGF0YS5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgdmFyIHR5cGVJZEZvckNoYXJhY3RlciA9IDQ5O1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlckRhdGFTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ2hhcmFjdGVyRGF0YSh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gTWFrZVRoZUNvbmNlcHQodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgdHlwZUlkRm9yQ2hhcmFjdGVyLCB0eXBlVXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjaGFyYWN0ZXJEYXRhU3RyaW5nID0geWllbGQgTWFrZVRoZUNoYXJhY3RlckRhdGEodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIHNlY3VyaXR5SWQsIGFjY2Vzc0lkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlckRhdGEgPSBjaGFyYWN0ZXJEYXRhU3RyaW5nO1xuICAgICAgICAgICAgaWYgKGNoYXJhY3RlckRhdGEuaXNOZXcpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVDb25jZXB0KHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjaGFyYWN0ZXJEYXRhLmlkLCBjaGFyYWN0ZXJEYXRhLnVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVDb25jZXB0KHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjaGFyYWN0ZXJEYXRhLmlkLCBjaGFyYWN0ZXJEYXRhLnVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZVRoZUNoYXJhY3RlciB9IGZyb20gXCIuLi9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNoYXJhY3RlclwiO1xuaW1wb3J0IHsgVGhlQ2hhcmFjdGVyIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1RoZUNoYXJhY3RlclwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWFrZVRoZUNoYXJhY3RlckRhdGEodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIHNlY3VyaXR5SWQsIGFjY2Vzc0lkLCBzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHRoZUNoYXJhY3RlciA9IG5ldyBUaGVDaGFyYWN0ZXIodXNlcklkLCB0aGVfY2hhcmFjdGVyX2RhdGEsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgXCJcIiwgZmFsc2UpO1xuICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgQ3JlYXRlVGhlQ2hhcmFjdGVyKHRoZUNoYXJhY3Rlcik7XG4gICAgICAgIHZhciByZXR1cm5lciA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlXCI7XG5pbXBvcnQgQ3JlYXRlVGhlQ29uY2VwdCBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUocmVmZXJlbnQsIHR5cGVJZCk7XG4gICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUZXh0RGF0YSB9IGZyb20gXCIuLi9BcGkvQ3JlYXRlL0NyZWF0ZVRoZVRleHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlXCI7XG5pbXBvcnQgeyBNYWtlVGhlTmFtZUluQmFja2VuZCB9IGZyb20gXCIuLi9BcGkvTWFrZVRoZU5hbWVJbkJhY2tlbmRcIjtcbmltcG9ydCB7IFRoZVRleHRzIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1RoZVRleHRzXCI7XG5pbXBvcnQgeyBNYWtlVGhlVHlwZUNvbmNlcHRBcGkgfSBmcm9tIFwiLi4vYXBwXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgQ3JlYXRlVGhlQ29uY2VwdCwgeyBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlIH0gZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWFrZVRoZUluc3RhbmNlQ29uY2VwdCh0eXBlLCByZWZlcmVudCwgY29tcG9zaXRpb24gPSBmYWxzZSwgdXNlcklkLCBwYXNzZWRBY2Nlc3NJZCA9IDQsIHBhc3NlZFNlc3Npb25JZCA9IDk5OSwgcmVmZXJlbnRJZCA9IDApIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSBwYXNzZWRTZXNzaW9uSWQ7XG4gICAgICAgIGxldCBjYXRlZ29yeUlkID0gNDtcbiAgICAgICAgbGV0IGNhdGVnb3J5VXNlcklkID0gdXNlcklkO1xuICAgICAgICBsZXQgcmVmZXJlbnRVc2VySWQgPSA5OTk7XG4gICAgICAgIGxldCBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICBsZXQgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIGxldCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIC8vIGNoYW5nZSB0aGlzXG4gICAgICAgIGxldCBhY2Nlc3NJZCA9IHBhc3NlZEFjY2Vzc0lkO1xuICAgICAgICBsZXQgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICBsZXQgc3RyaW5nVG9DaGVjayA9IFwiXCI7XG4gICAgICAgIGxldCBzdHJpbmdMZW5ndGggPSByZWZlcmVudC5sZW5ndGg7XG4gICAgICAgIGxldCB0eXBlQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGxldCBjb25jZXB0O1xuICAgICAgICBsZXQgc3RhcnRzV2l0aFRoZSA9IHR5cGUuc3RhcnRzV2l0aChcInRoZV9cIik7XG4gICAgICAgIGlmIChzdGFydHNXaXRoVGhlKSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSBcInRoZV9cIiArIHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkodHlwZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdXNlcklkLCB0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkoc3RyaW5nVG9DaGVjaywgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdXNlcklkLCB0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgVGhlVGV4dHNEYXRhID0gbmV3IFRoZVRleHRzKHVzZXJJZCwgcmVmZXJlbnQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBEYXRlLm5vdygpLnRvU3RyaW5nKCksIHRydWUpO1xuICAgICAgICAgICAgQ3JlYXRlVGV4dERhdGEoVGhlVGV4dHNEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdEFwaShzdHJpbmdUb0NoZWNrLCB1c2VySWQpO1xuICAgICAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIGxldCBjb25jZXB0QnlDaGFyVHlwZVN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUocmVmZXJlbnQsIHR5cGVDb25jZXB0LmlkKTtcbiAgICAgICAgICAgIGxldCBjb25jZXB0VHlwZUNoYXJhY3RlciA9IGNvbmNlcHRCeUNoYXJUeXBlU3RyaW5nO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRUeXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRUeXBlQ2hhcmFjdGVyLmlkID09IDAgJiYgY29uY2VwdFR5cGVDaGFyYWN0ZXIudXNlcklkID09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBsZXQgbWFrZVRoZU5hbWVTdHJpbmcgPSBhd2FpdCBNYWtlVGhlTmFtZShyZWZlcmVudCx1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsY29uY2VwdFR5cGVDaGFyYWN0ZXIgKTtcbiAgICAgICAgICAgICAgICAvLyBsZXQgbWFrZVRoZU5hbWVDb25jZXB0ID0gbWFrZVRoZU5hbWVTdHJpbmcgYXMgQ29uY2VwdDtcbiAgICAgICAgICAgICAgICAvLyBjb25jZXB0ID0gY29uY2VwdFR5cGVDaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlKHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgMTIsIDEyLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgTWFrZVRoZU5hbWVJbkJhY2tlbmQoY29uY2VwdC5pZCwgYCR7cmVmZXJlbnR9YCwgdHlwZUNvbmNlcHQuaWQsIHVzZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYoY29uY2VwdCl7XG4gICAgICAgIC8vICAgICBpZihjb25jZXB0LnR5cGUgPT0gbnVsbCl7XG4gICAgICAgIC8vICAgICAgICAgbGV0IGNvbmNlcHRUeXBlID0gQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoY29uY2VwdC50eXBlSWQpO1xuICAgICAgICAvLyAgICAgICAgIGlmKGNvbmNlcHRUeXBlID09IG51bGwgJiYgY29uY2VwdC50eXBlSWQgIT0gbnVsbCAmJiBjb25jZXB0LnR5cGVJZCAhPSB1bmRlZmluZWQpe1xuICAgICAgICAvLyAgICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmdOZXcgPSBhd2FpdCBHZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgbGV0IG5ld1R5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmdOZXcgYXMgQ29uY2VwdDtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uY2VwdC50eXBlID0gbmV3VHlwZUNvbmNlcHQ7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIGNvbmNlcHQudHlwZSA9IHR5cGVDb25jZXB0O1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTWFrZVRoZVR5cGVDb25jZXB0QXBpIH0gZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuaW1wb3J0IE1ha2VUaGVDb25jZXB0IGZyb20gXCIuL01ha2VUaGVDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZVRpbWVzdGFtcCh0eXBlLCByZWZlcmVudCwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSA5OTkpIHtcbiAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGFjY2Vzc0lkO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHJlZmVyZW50SWQgPSAwO1xuICAgICAgICB2YXIgcmVmZXJlbnRVc2VySWQgPSA5OTk7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHN0cmluZ1RvQ2hlY2sgPSBcIlwiO1xuICAgICAgICB2YXIgc3RhcnRzV2l0aFRoZSA9IHR5cGUuc3RhcnRzV2l0aChcInRoZV9cIik7XG4gICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHZhciBjb25jZXB0O1xuICAgICAgICBpZiAoc3RhcnRzV2l0aFRoZSkge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gXCJ0aGVfXCIgKyB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdEFwaShzdHJpbmdUb0NoZWNrLCB1c2VySWQpO1xuICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlIH0gZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdFwiO1xuaW1wb3J0IEdldENvbmNlcHRCeUNoYXJhY3RlciBmcm9tIFwiLi9HZXRDb25jZXB0QnlDaGFyYWN0ZXJcIjtcbmltcG9ydCBNYWtlVGhlQ2hhcmFjdGVyIGZyb20gXCIuL01ha2VUaGVDaGFyYWN0ZXJcIjtcbmltcG9ydCB7IFNwbGl0U3RyaW5ncyB9IGZyb20gXCIuL1NwbGl0U3RyaW5nc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIE1ha2VUaGVUeXBlQ29uY2VwdCh0eXBlU3RyaW5nLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciByZWZlcmVudElkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgZXhpc3RpbmdDb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKHR5cGVTdHJpbmcpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0KSB7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0LmlkID09IDAgfHwgZXhpc3RpbmdDb25jZXB0LnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3ModHlwZVN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzcGxpdHRlZFN0cmluZ0FycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0gPT0gdHlwZVN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ2hhcmFjdGVyKHR5cGVTdHJpbmcsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnlDb25jZXB0ID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0KHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0sIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdChzcGxpdHRlZFN0cmluZ0FycmF5WzFdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUNvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRJbW1lZGlhdGUodHlwZVN0cmluZywgdXNlcklkLCBjYXRlZ29yeUNvbmNlcHQuaWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHVzZXJJZCwgcmVmZXJlbnRJZCwgdXNlcklkLCBzZWN1cml0eUlkLCB1c2VySWQsIGFjY2Vzc0lkLCB1c2VySWQsIHNlc3Npb25JZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoTWVzc2FnZSh0b3BpYywgbWVzc2FnZSkge1xuICAgIGlmIChCYXNlVXJsLk1RVFRfQ09OTkVDVElPTikge1xuICAgICAgICBCYXNlVXJsLk1RVFRfQ09OTkVDVElPTi5wdWJsaXNoKHRvcGljLCBtZXNzYWdlKTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFNlYXJjaEludGVybmFsQXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9TZWFyY2gvU2VhcmNoSW50ZXJuYWxBcGlcIjtcbmltcG9ydCB7IFZpZXdJbnRlcm5hbERhdGEgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoTGlua0ludGVybmFsKHNlYXJjaFF1ZXJ5LCB0b2tlbiA9IFwiXCIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdHNDb25uZWN0aW9ucyA9IHlpZWxkIFNlYXJjaEludGVybmFsQXBpKHNlYXJjaFF1ZXJ5LCB0b2tlbik7XG4gICAgICAgIGxldCBvdXQgPSB5aWVsZCBWaWV3SW50ZXJuYWxEYXRhKGNvbmNlcHRzQ29ubmVjdGlvbnMpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBTZWFyY2hMaW5rTXVsdGlwbGVBcGkgfSBmcm9tIFwiLi4vLi4vQXBpL1NlYXJjaC9TZWFyY2hMaW5rTXVsdGlwbGVBcGlcIjtcbmltcG9ydCB7IEdldENvbm5lY3Rpb25CdWxrLCBHZXRUaGVDb25jZXB0IH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QgfSBmcm9tIFwiLi4vR2V0Q29tcG9zaXRpb25CdWxrXCI7XG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoTGlua011bHRpcGxlQWxsKHNlYXJjaFF1ZXJ5LCB0b2tlbiA9IFwiXCIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgbGV0IGNvbmNlcHRzQ29ubmVjdGlvbnMgPSB5aWVsZCBTZWFyY2hMaW5rTXVsdGlwbGVBcGkoc2VhcmNoUXVlcnksIHRva2VuKTtcbiAgICAgICAgbGV0IG1haW5Db21wb3NpdGlvbklkID0gc2VhcmNoUXVlcnlbMF0uY29tcG9zaXRpb247XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNlcHRzQ29ubmVjdGlvbnM7XG4gICAgICAgIGxldCBjb25jZXB0SWRzID0gcmVzdWx0LmNvbXBvc2l0aW9uSWRzO1xuICAgICAgICBsZXQgY29ubmVjdGlvbnMgPSByZXN1bHQuaW50ZXJuYWxDb25uZWN0aW9ucztcbiAgICAgICAgbGV0IGxpbmtlcnMgPSByZXN1bHQubGlua2VycztcbiAgICAgICAgbGV0IHJldmVyc2UgPSByZXN1bHQucmV2ZXJzZTtcbiAgICAgICAgY29uY2VwdHMgPSB5aWVsZCBHZXRDb21wb3NpdGlvbkZyb21Db25uZWN0aW9uc1dpdGhEYXRhSWRJbk9iamVjdChjb25jZXB0SWRzLCBjb25uZWN0aW9ucyk7XG4gICAgICAgIGxldCBvdXQgPSB5aWVsZCBGb3JtYXRGcm9tQ29ubmVjdGlvbnMobGlua2VycywgY29uY2VwdHMsIG1haW5Db21wb3NpdGlvbklkLCByZXZlcnNlKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRGcm9tQ29ubmVjdGlvbnMobGlua2VycywgY29tcG9zaXRpb25EYXRhLCBtYWluQ29tcG9zaXRpb24sIHJldmVyc2UgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBtYWluRGF0YSA9IHt9O1xuICAgICAgICBsZXQgY29ubmVjdGlvbnMgPSB5aWVsZCBHZXRDb25uZWN0aW9uQnVsayhsaW5rZXJzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJldmVyc2VGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocmV2ZXJzZS5pbmNsdWRlcyhjb25uZWN0aW9uc1tpXS5pZCkpIHtcbiAgICAgICAgICAgICAgICByZXZlcnNlRmxhZyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmV2ZXJzZUZsYWcgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdICYmIGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15ZGF0YSA9IGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5rZXJDb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChjb25uZWN0aW9uc1tpXS50eXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RGF0YSA9IG15ZGF0YSA9PT0gbnVsbCB8fCBteWRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG15ZGF0YS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gT2JqZWN0LmtleXMobmV3RGF0YSlbMF07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV2ZXJzZUNoYXJhdGVyID0gbGlua2VyQ29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSArIFwiX3JldmVyc2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3RGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0RhdGFba2V5XVtyZXZlcnNlQ2hhcmF0ZXJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtyZXZlcnNlQ2hhcmF0ZXJdLnB1c2goY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLm9mVGhlQ29uY2VwdElkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGFba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldW3JldmVyc2VDaGFyYXRlcl0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV1bcmV2ZXJzZUNoYXJhdGVyXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS5vZlRoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdICYmIGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15ZGF0YSA9IGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS5vZlRoZUNvbmNlcHRJZF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5rZXJDb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChjb25uZWN0aW9uc1tpXS50eXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RGF0YSA9IG15ZGF0YSA9PT0gbnVsbCB8fCBteWRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG15ZGF0YS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gT2JqZWN0LmtleXMobmV3RGF0YSlbMF07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdEYXRhW2tleV1bbGlua2VyQ29uY2VwdC5jaGFyYWN0ZXJWYWx1ZV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldW2xpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWVdLnB1c2goY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGFba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldW2xpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldW2xpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWVdLnB1c2goY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInRoaXMgaXMgZXJyb3JcIiwgZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1haW5EYXRhID0gY29tcG9zaXRpb25EYXRhW21haW5Db21wb3NpdGlvbl07XG4gICAgICAgIHJldHVybiBtYWluRGF0YTtcbiAgICB9KTtcbn1cbiIsImltcG9ydCB7IFRva2VuU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9TZWN1cml0eS9Ub2tlblN0b3JhZ2VcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZXF1ZXN0SGVhZGVyKGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nLCBBY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICB2YXIgaGVhZGVycyA9IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlLFxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IFwiQmVhcmVyIFwiICsgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuLFxuICAgICAgICAnQWNjZXB0JzogQWNjZXB0LFxuICAgIH07XG4gICAgcmV0dXJuIGhlYWRlcnM7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nLCB0b2tlbiA9IFwiXCIsIEFjY2VwdCA9ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgIGlmICh0b2tlbiA9PSBcIlwiKSB7XG4gICAgICAgIHRva2VuID0gVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuO1xuICAgIH1cbiAgICB2YXIgaGVhZGVycyA9IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlLFxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IFwiQmVhcmVyIFwiICsgdG9rZW4sXG4gICAgICAgICdBY2NlcHQnOiBBY2NlcHQsXG4gICAgfTtcbiAgICByZXR1cm4gaGVhZGVycztcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRPbmx5VG9rZW5IZWFkZXIoKSB7XG4gICAgbGV0IHRva2VuID0gVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuO1xuICAgIGNvbnN0IG15SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgbXlIZWFkZXJzLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIHRva2VuKTtcbiAgICByZXR1cm4gbXlIZWFkZXJzO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFNwbGl0U3RyaW5ncyh0eXBlU3RyaW5nKSB7XG4gICAgY29uc3QgcG9zID0gdHlwZVN0cmluZy5sYXN0SW5kZXhPZihcIl9cIik7XG4gICAgbGV0IFNwbGl0dGVkU3RyaW5ncyA9IFtdO1xuICAgIGlmIChwb3MgPiAwKSB7XG4gICAgICAgIHZhciByZXN0ID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKTtcbiAgICAgICAgdmFyIGxhc3QgPSB0eXBlU3RyaW5nLnN1YnN0cmluZyhwb3MgKyAxLCB0eXBlU3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIFNwbGl0dGVkU3RyaW5ncyA9IFtyZXN0LCBsYXN0XTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIFNwbGl0dGVkU3RyaW5ncyA9IFt0eXBlU3RyaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuIFNwbGl0dGVkU3RyaW5ncztcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IEluc2VydFVuaXF1ZU51bWJlciBmcm9tICcuLi9IZWxwZXJzL1VuaXF1ZUluc2VydCc7XG5pbXBvcnQgeyBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5Db25uZWN0aW9uQXJyYXksIENoZWNrSWZUeXBlQ29uY2VwdHNFeGlzdHNJbkFycmF5LCB9IGZyb20gJy4uL0hlbHBlcnMvQ2hlY2tJZkV4aXN0cyc7XG5pbXBvcnQgeyBSZW1vdmVDb25jZXB0RnJvbUxpc3QsIFJlbW92ZUNvbm5lY3Rpb25Gcm9tTGlzdCwgfSBmcm9tICcuLi9IZWxwZXJzL1JlbW92ZUZyb21BcnJheSc7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gJy4vQ3JlYXRlRGVmYXVsdENvbmNlcHQnO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uIH0gZnJvbSAnLi4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbic7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tICcuL0dldFRoZUNvbmNlcHQnO1xuaW1wb3J0IE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQgZnJvbSAnLi9NYWtlVGhlSW5zdGFuY2VDb25jZXB0JztcbmltcG9ydCB7IGNyZWF0ZVRoZUNvbm5lY3Rpb24gfSBmcm9tICcuL0NyZWF0ZVRoZUNvbm5lY3Rpb24nO1xuaW1wb3J0IHsgRGVsZXRlQ29ubmVjdGlvbkJ5SWQgfSBmcm9tICcuL0RlbGV0ZUNvbm5lY3Rpb24nO1xuaW1wb3J0IHsgU3luY0RhdGEgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvbkJpbmFyeVRyZWUgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkJpbmFyeVRyZWUnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb24gfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbic7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb21wb3NpdGlvbldpdGhDYWNoZSB9IGZyb20gJy4vQ29tcG9zaXRpb24vQ3JlYXRlQ29tcG9zaXRpb25DYWNoZSc7XG4vLyBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIGNhY2hlIGNvbXBvc2l0aW9uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBVcGRhdGVDb21wb3NpdGlvbihwYXRjaGVyU3RydWN0dXJlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgZGVmYXVsdCB1c2VySWQsIHNlc3Npb25JZCwgYWNjZXNzSWQgcGFzc2VkIGJ5IHRoZSBwYXRjaGVyU3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUudXNlcklkO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSBwYXRjaGVyU3RydWN0dXJlLnNlc3Npb25JZDtcbiAgICAgICAgY29uc3QgYWNjZXNzSWQgPSBwYXRjaGVyU3RydWN0dXJlLmFjY2Vzc0lkO1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgbGV0IHBhcmVudENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBjb25zdCB0b0RlbGV0ZUNvbmNlcHRzID0gW107XG4gICAgICAgIC8vIHRoZSBtYWluIGNvbXBvc2l0aW9uIElkIHRoYXQgaGFzIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcGF0Y2hlZFxuICAgICAgICBsZXQgY29tcG9zaXRpb25JZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuY29tcG9zaXRpb25JZDtcbiAgICAgICAgLy8gaWYgeW91IHdhbnQgdG8gZWRpdCB0aGUgc3ViY29tcG9zaXRpb25zIG9mIHRoZSBjb21wb3NpdGlvbiB0aGVuIHlvdSBoYXZlIHRvIHBhc3MgdG8gdGhpc1xuICAgICAgICBjb25zdCBvZlRoZUNvbmNlcHRJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUub2ZUaGVDb21wb3NpdGlvbklkO1xuICAgICAgICBsZXQgdG9EZWxldGVDb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoY29tcG9zaXRpb25JZCA8IDApIHtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbXBvc2l0aW9uSWQsIHVzZXJJZCk7XG4gICAgICAgICAgICBpZiAobG9jYWxDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uSWQgPSBsb2NhbENvbmNlcHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgYWxsIGNvbm5lY3Rpb25zIGZyb20gdGhlIGJhY2tlbmQgYmVjYXVzZSBpdCBuZWVkcyBsYXRlc3QgZGF0YVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihjb21wb3NpdGlvbklkKTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgY29uc3QgY29uY2VwdElkTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbkNhY2hlID0gbmV3IENvbXBvc2l0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLmlkID0gY29tcG9zaXRpb25JZDtcbiAgICAgICAgLy8gcHV0IHRoaXMgaW4gdGhlIHVwcGVyIHNlY3Rpb24gYmVmb3JlIHVwZGF0aW5nIGJlY2F1c2UgdGhpcyB3aWxsIHRlbGwgYWxsIG90aGVyIGRpc3RyaWJ1dGVkXG4gICAgICAgIC8vc2VydmVycyB0byBkZXN0cm95IHRoZSBjb3B5IG9mIHRoZSBjb21wb3NpdGlvbiB0aGF0IHRoZXkgaGF2ZSBhcyBuZXcgY29tcG9zaXRpb24gaXMgY29taW5nIHVwXG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuaXNVcGRhdGluZygpO1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjb25uZWN0aW9ucyB0aGF0IGFyZSBpbnNpZGUgb2YgdGhlIGNvbXBvc2l0aW9uIGFuZCBzdG9yZSB0aGVtIGluXG4gICAgICAgIGxldCBhbGxDb25jZXB0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29tcG9zaXRpb25MaXN0LCBjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29uY2VwdElkTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgSW5zZXJ0VW5pcXVlTnVtYmVyKGNvbmNlcHRJZExpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIGFsbENvbmNlcHRzLnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuc3ViY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25MaXN0O1xuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLmNvbm5lY3Rpb25zID0gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNvbmNlcHRzIHRoYXQgYXJlIGluc2lkZSBvZiB0aGUgY29tcG9zaXRpb24gYW5kIHN0b3JlIHRoZW0gaW4gYSBjb25jZXB0TGlzdFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRJZExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbmNlcHRJZExpc3RbaV0pO1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JZCA9PSBjb25jZXB0SWRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb24gPSBjb25jZXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkID09IGNvbmNlcHRJZExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmNlcHRMaXN0LnB1c2goY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IHRyeWluZyB0byBwYXRjaCB0aGUgbmV3IG9iamVjdCBpbnRvIHRoZSBjb21wb3NpdGlvblxuICAgICAgICBjb25zdCBvYmplY3QgPSBwYXRjaGVyU3RydWN0dXJlLnBhdGNoT2JqZWN0O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIGxldCBpbnNlcnRpbmdDb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25jZXB0ID0gY29tcG9zaXRpb247XG4gICAgICAgICAgICAvLyBpZiB0aGUgaW1tZWRpZGF0ZSBwYXJlbnQgZXhpc3RzIGluIHRoZSBjb21wb3NpdGlvbiAoaS5lLiBmb3IgbXVsdGlsZXZlbCBjb21wb3NpdGlvbilcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsQ29uY2VwdCA9IHBhcmVudENvbmNlcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW5nQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCBcIlwiLCB0cnVlLCBjb21wb3NpdGlvbi51c2VySWQsIDQsIDk5OSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25DYWNoZS5zdWJjb21wb3NpdGlvbnMucHVzaChpbnNlcnRpbmdDb25jZXB0LmlkKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY29uY2VwdCBleGlzdHMgaW4gdGhlIGNvbmNlcHQgbGlzdCBiZWNhdXNlIGlmIGl0IGV4aXN0cyB0aGVuIHdlIGhhdmUgdG8gZGVsZXRlIG9sZCBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgRXhpc3RpbmdDb25jZXB0cyA9IENoZWNrSWZUeXBlQ29uY2VwdHNFeGlzdHNJbkFycmF5KGNvbmNlcHRMaXN0LCBpbnNlcnRpbmdDb25jZXB0KTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZXhpc3RpbmcgY29uY2VwdCB0aGVuIHN0YXJ0IHRoZSBwcm9jZXNzIGZvciBkZWxldGluZyB0aGUgY29uY2VwdCBpbiB0aGUgbGlzdFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRXhpc3RpbmdDb25jZXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRXhpc3RpbmdDb25jZXB0c1tpXS5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0aW5nQ29ubmVjdGlvbnMgPSBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5Db25uZWN0aW9uQXJyYXkoY29tcG9zaXRpb25DYWNoZS5jb25uZWN0aW9ucywgRXhpc3RpbmdDb25jZXB0c1tpXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b0RlbGV0ZUNvbm5lY3Rpb25zID0gdG9EZWxldGVDb25uZWN0aW9ucy5jb25jYXQoZGVsZXRpbmdDb25uZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b0RlbGV0ZUNvbmNlcHRzLnB1c2goRXhpc3RpbmdDb25jZXB0c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUob2JqZWN0W2tleV0sIGluc2VydGluZ0NvbmNlcHQuaWQsIGluc2VydGluZ0NvbmNlcHQudXNlcklkLCBjb21wb3NpdGlvbi5pZCwgY29tcG9zaXRpb24udXNlcklkLCA0LCA5OTksIGNvbXBvc2l0aW9uQ2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSB0aGUgbmV3IGNvbmNlcHQgaW4gdGhlIG9iamVjdFxuICAgICAgICAgICAgICAgIGluc2VydGluZ0NvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KGtleSwgdmFsdWUsIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25jZXB0IGV4aXN0cyBpbiB0aGUgY29uY2VwdCBsaXN0IGJlY2F1c2UgaWYgaXQgZXhpc3RzIHRoZW4gd2UgaGF2ZSB0byBkZWxldGUgb2xkIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBFeGlzdGluZ0NvbmNlcHRzID0gQ2hlY2tJZlR5cGVDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QsIGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBleGlzdGluZyBjb25jZXB0IHRoZW4gc3RhcnQgdGhlIHByb2Nlc3MgZm9yIGRlbGV0aW5nIHRoZSBjb25jZXB0IGluIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFeGlzdGluZ0NvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFeGlzdGluZ0NvbmNlcHRzW2ldLmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRpbmdDb25uZWN0aW9ucyA9IENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkNvbm5lY3Rpb25BcnJheShjb21wb3NpdGlvbkNhY2hlLmNvbm5lY3Rpb25zLCBFeGlzdGluZ0NvbmNlcHRzW2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29ubmVjdGlvbnMgPSB0b0RlbGV0ZUNvbm5lY3Rpb25zLmNvbmNhdChkZWxldGluZ0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29uY2VwdHMucHVzaChFeGlzdGluZ0NvbmNlcHRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBuZXcgY29uY2VwdCBhbmQgdGhlIG9sZCBjb21wb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IGNyZWF0ZVRoZUNvbm5lY3Rpb24obG9jYWxDb25jZXB0LmlkLCBsb2NhbENvbmNlcHQudXNlcklkLCBpbnNlcnRpbmdDb25jZXB0LmlkLCBpbnNlcnRpbmdDb25jZXB0LnVzZXJJZCwgY29tcG9zaXRpb24uaWQsIHNlc3Npb25JZCwgdXNlcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChpbnNlcnRpbmdDb25jZXB0KTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgeW91IGhhdmUgdG8gZGVsZXRlIHRoZSBjb25uZWN0aW9uIGluIGJ1bGtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b0RlbGV0ZUNvbm5lY3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgZnJvbSB0aGUgY2FjaGUgbGlzdFxuICAgICAgICAgICAgUmVtb3ZlQ29ubmVjdGlvbkZyb21MaXN0KGNvbXBvc2l0aW9uQ2FjaGUuY29ubmVjdGlvbnMsIHRvRGVsZXRlQ29ubmVjdGlvbnNbal0pO1xuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSBjb25uZWN0aW9uIGluIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICBEZWxldGVDb25uZWN0aW9uQnlJZCh0b0RlbGV0ZUNvbm5lY3Rpb25zW2pdLmlkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbHNvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY29uY2VwdCBmcm9tIHRoZSBjYWNoZS5cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0b0RlbGV0ZUNvbmNlcHRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgY29uY2VwdCBmcm9tIHRoZSBjYWNoZSBjb25jZXB0IGxpc3RcbiAgICAgICAgICAgIFJlbW92ZUNvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCwgdG9EZWxldGVDb25jZXB0c1trXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IGNyZWF0ZSBhIGNvbXBvc2l0aW9uIGNhY2hlIG9iamVjdCB0byBjYWNoZSBpdCBpbnRvIG5vZGUgc2VydmVyXG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuY29uY2VwdHMgPSBjb21wb3NpdGlvbkNhY2hlLmNvbmNlcHRzLmNvbmNhdChjb25jZXB0TGlzdCk7XG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUubWFpbkNvbmNlcHQgPSBjb21wb3NpdGlvbjtcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5pZCA9IGNvbXBvc2l0aW9uLmlkO1xuICAgICAgICAvLyAvLyBjcmVhdGUgYSBjYWNoZVxuICAgICAgICB5aWVsZCBjb21wb3NpdGlvbkNhY2hlLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgIC8vIHVwZGF0ZSBpdCB0aGUgYmluYXJ5IHRyZWVcbiAgICAgICAgQ29tcG9zaXRpb25CaW5hcnlUcmVlLmFkZENvbXBvc2l0aW9uVG9UcmVlKGNvbXBvc2l0aW9uQ2FjaGUpO1xuICAgICAgICBTeW5jRGF0YS5TeW5jRGF0YU9ubGluZSgpO1xuICAgICAgICBsZXQgeCA9IGNvbXBvc2l0aW9uQ2FjaGUuR2V0RGF0YUNhY2hlKCk7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tICcuLy4uLy4uL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdCc7XG5pbXBvcnQgeyBVc2VyQmluYXJ5VHJlZSB9IGZyb20gJy4vLi4vLi4vRGF0YVN0cnVjdHVyZXMvVXNlci9Vc2VyQmluYXJ5VHJlZSc7XG5leHBvcnQgZnVuY3Rpb24gR2V0VXNlckdob3N0SWQodXNlcklkLCBnaG9zdElkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgdXNlck5vZGUgPSB5aWVsZCBVc2VyQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUodXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhcInRoaXMgaXMgdGhlIGdob3N0IGlkXCIsIHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgbGV0IHJlYWxDb25jZXB0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgIGlmICh1c2VyTm9kZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyTm9kZS52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0Q29uY2VwdCA9IHVzZXJOb2RlLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0Q29uY2VwdC5naG9zdElkID09IGdob3N0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhbENvbmNlcHQgPSB0ZXN0Q29uY2VwdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlYWxDb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEFkZEdob3N0Q29uY2VwdChjb25jZXB0LCB1c2VySWQsIHNlc3Npb25JZCA9IDk5OSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIFVzZXJCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCwgdXNlcklkLCBzZXNzaW9uSWQpO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBWaWV3SW50ZXJuYWxEYXRhQXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9WaWV3L1ZpZXdJbnRlcm5hbERhdGFBcGlcIjtcbmltcG9ydCB7IEdldFRoZUNvbmNlcHQsIHJlY3Vyc2l2ZUZldGNoIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIFZpZXdJbnRlcm5hbERhdGEoaWRzKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25uZWN0aW9ucyA9IHlpZWxkIFZpZXdJbnRlcm5hbERhdGFBcGkoaWRzKTtcbiAgICAgICAgbGV0IG91dHB1dCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGlkID0gaWRzW2ldO1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1tpZF07XG4gICAgICAgICAgICBpZiAoaWQgJiYgbG9jYWxDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBmb3JtYXR0ZWRPdXRwdXQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxvY2FsQ29ubmVjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25jZXB0cy5pbmNsdWRlcyhsb2NhbENvbm5lY3Rpb25zW2pdLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHMucHVzaChsb2NhbENvbm5lY3Rpb25zW2pdLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgb3V0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2goaWQsIGxvY2FsQ29ubmVjdGlvbnMsIGNvbmNlcHRzKTtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRPdXRwdXQuZGF0YSA9IG91dDtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRPdXRwdXQuaWQgPSBpZDtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChmb3JtYXR0ZWRPdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZvcm1hdHRlZE91dHB1dCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZE91dHB1dC5pZCA9IGlkO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgICAgICAgICAgbGV0IG5vY29ubiA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9jb25uWyhfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWVdID0gY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkT3V0cHV0LmRhdGEgPSBub2Nvbm47XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGZvcm1hdHRlZE91dHB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG4iLCJleHBvcnQgeyBpbml0LCB1cGRhdGVBY2Nlc3NUb2tlbiB9O1xuaW1wb3J0IENyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YSc7XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0lkZW50aWZpZXJGbGFncyc7XG5leHBvcnQgeyBTcGxpdFN0cmluZ3MgfSBmcm9tICcuL1NlcnZpY2VzL1NwbGl0U3RyaW5ncyc7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbkxpc3QsIEdldENvbXBvc2l0aW9uTGlzdFdpdGhJZCB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29tcG9zaXRpb25MaXN0JztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uTGlzdExvY2FsLCBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbFdpdGhJZCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwnO1xuZXhwb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uIH0gZnJvbSAnLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uLCBHZXRDb21wb3NpdGlvbldpdGhJZCwgcmVjdXJzaXZlRmV0Y2gsIEdldENvbXBvc2l0aW9uV2l0aEFsbElkcyB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29tcG9zaXRpb24nO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25Mb2NhbCwgR2V0Q29tcG9zaXRpb25Mb2NhbFdpdGhJZCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvR2V0Q29tcG9zaXRpb25Mb2NhbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENyZWF0ZUNvbXBvc2l0aW9uIH0gZnJvbSAnLi9TZXJ2aWNlcy9DcmVhdGVUaGVDb21wb3NpdGlvbic7XG5leHBvcnQgeyBDcmVhdGVUaGVDb21wb3NpdGlvbkxvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb21wb3NpdGlvbkxvY2FsJztcbmV4cG9ydCB7IENyZWF0ZUNvbm5lY3Rpb25CZXR3ZWVuVHdvQ29uY2VwdHMsIENyZWF0ZUNvbm5lY3Rpb25CZXR3ZWVuVHdvQ29uY2VwdHNHZW5lcmFsIH0gZnJvbSAnLi9TZXJ2aWNlcy9DcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR2V0VGhlQ29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvR2V0VGhlQ29uY2VwdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQnO1xuZXhwb3J0IHsgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9NYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwnO1xuZXhwb3J0IHsgc3RvcmVUb0RhdGFiYXNlLCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZSwgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQgfSBmcm9tICcuL0RhdGFiYXNlL05vSW5kZXhEYic7XG5leHBvcnQgeyBjcmVhdGVUaGVDb25uZWN0aW9uIGFzIENyZWF0ZVRoZUNvbm5lY3Rpb24gfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbm5lY3Rpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHZXRDb25jZXB0QnlDaGFyYWN0ZXIgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbmNlcHRCeUNoYXJhY3Rlcic7XG5leHBvcnQgeyBHZXRMaW5rLCBHZXRMaW5rUmF3IH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRMaW5rJztcbmV4cG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5leHBvcnQgeyBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvTWFrZVRoZVR5cGVMb2NhbCc7XG5leHBvcnQgeyBNYWtlVGhlVHlwZUNvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL01ha2VUaGVUeXBlQ29uY2VwdCc7XG5leHBvcnQgeyBNYWtlVGhlVHlwZUNvbmNlcHRBcGkgfSBmcm9tICcuL0FwaS9NYWtlVGhlVHlwZUNvbmNlcHRBcGknO1xuZXhwb3J0IHsgR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0cywgR2V0TGlua2VyQ29ubmVjdGlvblRvQ29uY2VwdHMgfSBmcm9tICcuL1NlcnZpY2VzL0dldExpbmtlckNvbm5lY3Rpb25Gcm9tQ29uY2VwdCc7XG5leHBvcnQgeyBEZWxldGVDb25jZXB0QnlJZCB9IGZyb20gJy4vU2VydmljZXMvRGVsZXRlQ29uY2VwdCc7XG5leHBvcnQgeyBEZWxldGVDb25uZWN0aW9uQnlJZCB9IGZyb20gJy4vU2VydmljZXMvRGVsZXRlQ29ubmVjdGlvbic7XG5leHBvcnQgeyBUcmFzaFRoZUNvbmNlcHQgfSBmcm9tICcuL0FwaS9EZWxldGUvRGVsZXRlQ29uY2VwdEluQmFja2VuZCc7XG5leHBvcnQgeyBHZXRDb25uZWN0aW9uQnlJZCB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29ubmVjdGlvbnMnO1xuZXhwb3J0IHsgTWFrZVRoZVRpbWVzdGFtcCB9IGZyb20gJy4vU2VydmljZXMvTWFrZVRoZVRpbWVzdGFtcCc7XG5leHBvcnQgeyBSZWN1cnNpdmVTZWFyY2hBcGkgfSBmcm9tICcuL0FwaS9SZWN1cnNpdmVTZWFyY2gnO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25CdWxrV2l0aERhdGFJZCwgR2V0Q29tcG9zaXRpb25CdWxrLCBHZXRDb21wb3NpdGlvbkZyb21Db25uZWN0aW9uc1dpdGhEYXRhSWQgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uQnVsayc7XG5leHBvcnQgeyBHZXRDb25jZXB0QnVsayB9IGZyb20gJy4vQXBpL0dldENvbmNlcHRCdWxrJztcbmV4cG9ydCB7IEdldENvbm5lY3Rpb25CdWxrIH0gZnJvbSAnLi9BcGkvR2V0Q29ubmVjdGlvbkJ1bGsnO1xuZXhwb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayB9IGZyb20gJy4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsnO1xuZXhwb3J0IHsgTG9naW5Ub0JhY2tlbmQgfSBmcm9tICcuL0FwaS9Mb2dpbic7XG5leHBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0IH0gZnJvbSAnLi9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNpZ251cCB9IGZyb20gJy4vQXBpL1NpZ251cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNpZ25pbiB9IGZyb20gJy4vQXBpL1NpZ25pbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFVwZGF0ZUNvbXBvc2l0aW9uIH0gZnJvbSAnLi9TZXJ2aWNlcy9VcGRhdGVDb21wb3NpdGlvbic7XG5leHBvcnQgeyBTZWFyY2hBbGxDb25jZXB0cyB9IGZyb20gJy4vQXBpL1NlYXJjaC9TZWFyY2gnO1xuZXhwb3J0IHsgU2VhcmNoV2l0aExpbmtlciB9IGZyb20gJy4vQXBpL1NlYXJjaC9TZWFyY2hXaXRoTGlua2VyJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uV2l0aENhY2hlLCBHZXRDb21wb3NpdGlvbldpdGhEYXRhSWRXaXRoQ2FjaGUsIEdldENvbXBvc2l0aW9uV2l0aERhdGFJZEJ1bGsgfSBmcm9tICcuL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQ2FjaGUnO1xuZXhwb3J0IHsgQ3JlYXRlU2Vzc2lvbiB9IGZyb20gJy4vQXBpL1Nlc3Npb24vQ3JlYXRlU2Vzc2lvbic7XG5leHBvcnQgeyBDcmVhdGVTZXNzaW9uVmlzaXQgfSBmcm9tICcuL0FwaS9TZXNzaW9uL0NyZWF0ZVNlc3Npb25WaXNpdCc7XG5leHBvcnQgeyBHZXRSZWxhdGlvbiwgR2V0UmVsYXRpb25SYXcgfSBmcm9tICcuL1NlcnZpY2VzL0dldFJlbGF0aW9uJztcbmV4cG9ydCB7IHJlY3Vyc2l2ZUZldGNoTmV3IH0gZnJvbSAnLi9TZXJ2aWNlcy9Db21wb3NpdGlvbi9CdWlsZENvbXBvc2l0aW9uJztcbmV4cG9ydCB7IENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlIH0gZnJvbSAnLi9TZXJ2aWNlcy9Db21wb3NpdGlvbi9DcmVhdGVDb21wb3NpdGlvbkNhY2hlJztcbmV4cG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0JztcbmV4cG9ydCB7IENyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsIH0gZnJvbSAnLi9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbCc7XG5leHBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbCc7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbkxpc3RBbGwsIEdldENvbXBvc2l0aW9uTGlzdEFsbFdpdGhJZCB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29tcG9zaXRpb25MaXN0JztcbmV4cG9ydCB7IEdldFVzZXJHaG9zdElkLCBBZGRHaG9zdENvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL1VzZXIvVXNlclRyYW5zbGF0aW9uJztcbmV4cG9ydCB7IFNlYXJjaExpbmtNdWx0aXBsZUFsbCwgRm9ybWF0RnJvbUNvbm5lY3Rpb25zIH0gZnJvbSAnLi9TZXJ2aWNlcy9TZWFyY2gvU2VhcmNoTGlua011bHRpcGxlJztcbmV4cG9ydCB7IEdldFRoZUNvbmNlcHRMb2NhbCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvR2V0VGhlQ29uY2VwdExvY2FsJztcbmV4cG9ydCB7IFVwZGF0ZUNvbXBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL1VwZGF0ZUNvbXBvc2l0aW9uTG9jYWwnO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uQnVsayc7XG5leHBvcnQgeyBHZXRSZWxhdGlvbkxvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9HZXRSZWxhdGlvbkxvY2FsJztcbmV4cG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5TG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsJztcbmV4cG9ydCB7IFZpZXdJbnRlcm5hbERhdGEgfSBmcm9tICcuL1NlcnZpY2VzL1ZpZXcvVmlld0ludGVybmFsRGF0YSc7XG5leHBvcnQgeyBWaWV3SW50ZXJuYWxEYXRhQXBpIH0gZnJvbSAnLi9BcGkvVmlldy9WaWV3SW50ZXJuYWxEYXRhQXBpJztcbmV4cG9ydCB7IGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL0NvbnZlcnNpb24vQ29udmVydENvbmNlcHRzJztcbmV4cG9ydCB7IFNlYXJjaExpbmtJbnRlcm5hbCB9IGZyb20gJy4vU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtJbnRlcm5hbCc7XG5leHBvcnQgeyBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZUNvbm5lY3Rpb25CZXR3ZWVuVHdvQ29uY2VwdHNMb2NhbCc7XG5leHBvcnQgeyBTeW5jRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGEnO1xuZXhwb3J0IHsgQ29uY2VwdCB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdCc7XG5leHBvcnQgeyBMQ29uY2VwdCB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHQnO1xuZXhwb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25uZWN0aW9uJztcbmV4cG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb24nO1xuZXhwb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YSc7XG5leHBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGEnO1xuZXhwb3J0IHsgQmluYXJ5VHJlZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHJlZSc7XG5leHBvcnQgeyBTZWFyY2hRdWVyeSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU2VhcmNoUXVlcnknO1xuZXhwb3J0IHsgUGF0Y2hlclN0cnVjdHVyZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvUGF0Y2hlclN0cnVjdHVyZSc7XG5leHBvcnQgeyBTZXNzaW9uRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU2Vzc2lvbi9TZXNzaW9uRGF0YSc7XG5leHBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgQ29tcG9zaXRpb25CaW5hcnlUcmVlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkJpbmFyeVRyZWUnO1xuZXhwb3J0IHsgQ29tcG9zaXRpb25Ob2RlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbk5vZGUnO1xuZXhwb3J0IHsgTG9jYWxTeW5jRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxTeW5jRGF0YSc7XG5leHBvcnQgeyBVc2VyQmluYXJ5VHJlZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvVXNlci9Vc2VyQmluYXJ5VHJlZSc7XG5leHBvcnQgeyBGaWx0ZXJTZWFyY2ggfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0ZpbHRlclNlYXJjaCc7XG5leHBvcnQgeyBTZWFyY2hTdHJ1Y3R1cmUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1NlYXJjaC9TZWFyY2hTdHJ1Y3R1cmUnO1xuaW1wb3J0IHsgR2V0RGF0YUZyb21JbmRleERiLCBHZXREYXRhRnJvbUluZGV4RGJMb2NhbCB9IGZyb20gJy4vU2VydmljZXMvR2V0RGF0YUZyb21JbmRleERiJztcbmltcG9ydCBDcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhJztcbmltcG9ydCBJbml0aWFsaXplU3lzdGVtIGZyb20gJy4vU2VydmljZXMvSW5pdGlhbGl6ZVN5c3RlbSc7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsJztcbmltcG9ydCB7IFRva2VuU3RvcmFnZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlJztcbmV4cG9ydCB7IEJhc2VVcmwgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmwnO1xuZnVuY3Rpb24gdXBkYXRlQWNjZXNzVG9rZW4oYWNjZXNzVG9rZW4gPSBcIlwiKSB7XG4gICAgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG59XG5mdW5jdGlvbiBpbml0KHVybCA9IFwiXCIsIGFpdXJsID0gXCJcIiwgYWNjZXNzVG9rZW4gPSBcIlwiLCBub2RlVXJsID0gXCJcIiwgZW5hYmxlQWkgPSB0cnVlKSB7XG4gICAgQmFzZVVybC5CQVNFX1VSTCA9IHVybDtcbiAgICBCYXNlVXJsLkFJX1VSTCA9IGFpdXJsO1xuICAgIEJhc2VVcmwuTk9ERV9VUkwgPSBub2RlVXJsO1xuICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpc3QgaGUgYmFzZSB1cmxcIiwgQmFzZVVybC5CQVNFX1VSTCk7XG4gICAgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgSW5pdGlhbGl6ZVN5c3RlbShlbmFibGVBaSkudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIENyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzRGF0YUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNDaGFyYWN0ZXJMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzVHlwZUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSB0aW1lIHRha2VuIHRvIHByZXBhcmUgY29uY2VwdCAgZGF0YSBpcyAgXCIsIGVsYXBzZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgQ3JlYXRlTG9jYWxCaW5hcnlUcmVlRnJvbURhdGEoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0xvY2FsRGF0YUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbFR5cGVMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDaGFyYWN0ZXJMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgdGltZSB0YWtlbiB0byBwcmVwYXJlIGxvY2FsIGNvbmNlcHQgIFwiLCBlbGFwc2VkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEdldERhdGFGcm9tSW5kZXhEYkxvY2FsKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENvbm5lY3Rpb25Mb2FkZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgR2V0RGF0YUZyb21JbmRleERiKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25UeXBlTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIHRpbWUgdGFrZW4gdG8gcHJlcGFyZSBjb25uZWN0aW9ucyAgXCIsIGVsYXBzZWQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9zcmMvYXBwLnRzXCIpO1xuIiwiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
12757
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7O0FDbERPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25KQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsMEJBQTBCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDcE9PO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE1BQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLDBCQUEwQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsMEJBQTBCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQ0FBZ0M7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNqRk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUpBLGlCQUFpQixTQUFJLElBQUks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QTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztVRU5BO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNvbmNlcHRBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0NyZWF0ZS9DcmVhdGVUaGVHaG9zdENvbmNlcHRBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlVGV4dERhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9EZWxldGVUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvRGVsZXRlVGhlQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0RlbGV0ZS9EZWxldGVDb25jZXB0SW5CYWNrZW5kLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0QWlEYXRhLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0QWxsQ29uY2VwdHNCeVR5cGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldENvbmNlcHRCdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldENvbm5lY3Rpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldFJlc2VydmVkQ29ubmVjdGlvbklkcy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0dldFJlc2VydmVkSWRzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvTG9jYWwvR2V0TG9jYWxDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL0xvZ2luLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvTWFrZVRoZU5hbWVJbkJhY2tlbmQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9NYWtlVGhlVHlwZUNvbmNlcHRBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9SZWN1cnNpdmVTZWFyY2gudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9TZWFyY2hDb25jZXB0L0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvU2VhcmNoL1NlYXJjaC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1NlYXJjaC9TZWFyY2hJbnRlcm5hbEFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1NlYXJjaC9TZWFyY2hMaW5rTXVsdGlwbGVBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0FwaS9TZWFyY2gvU2VhcmNoV2l0aExpbmtlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1Nlc3Npb24vQ3JlYXRlU2Vzc2lvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvQXBpL1Nlc3Npb24vQ3JlYXRlU2Vzc2lvblZpc2l0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvU2lnbmluLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvU2lnbnVwLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvVHJhbnNsYXRlL1RyYW5zbGF0ZUxvY2FsVG9SZWFsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9BcGkvVmlldy9WaWV3SW50ZXJuYWxEYXRhQXBpLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CYXNlVXJsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CaW5hcnlDaGFyYWN0ZXJUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CaW5hcnlUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9CaW5hcnlUeXBlVHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ2hhcmFjdGVyUmVwb3NpdG9yeS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQmluYXJ5VHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25Ob2RlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvbkJpbmFyeVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25CaW5hcnlUcmVlL0Nvbm5lY3Rpb25Ob2RlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uVHlwZVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9GaWx0ZXJTZWFyY2gudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0lkZW50aWZpZXJGbGFncy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MTm9kZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbEJpbmFyeVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQmluYXJ5VHlwZVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29ubmVjdGlvbkRhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsR2hvc3RJZFRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsU3luY0RhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL05vZGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1BhdGNoZXJTdHJ1Y3R1cmUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1Jlc2VydmVkSWRzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9SZXR1cm5lci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2VhcmNoUXVlcnkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NlYXJjaC9TZWFyY2hTdHJ1Y3R1cmUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NlY3VyaXR5L1Rva2VuU3RvcmFnZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2Vzc2lvbi9TZXNzaW9uRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2V0dGluZ0RhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhU3RydWN0dXJlcy9UaGVUZXh0cy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvVXNlci9Vc2VyQmluYXJ5VHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YVN0cnVjdHVyZXMvVXNlci9Vc2VyTm9kZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvRGF0YWJhc2UvTm9JbmRleERiLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9EYXRhYmFzZS9pbmRleGRibG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL0RhdGFiYXNlL2luZGV4ZWRkYi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvSGVscGVycy9DaGVja0lmRXhpc3RzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9IZWxwZXJzL1JlbW92ZUZyb21BcnJheS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvSGVscGVycy9VbmlxdWVJbnNlcnQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0NoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9CdWlsZENvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkNhY2hlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9DcmVhdGVDb21wb3NpdGlvbkNhY2hlLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Db25jZXB0RmluZGluZy9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvQ29udmVyc2lvbi9Db252ZXJ0Q29uY2VwdHMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvRGVsZXRlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvRGVsZXRlQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvRmluZENvbmVjZXB0c0Zyb21Db25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9GaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa0luTWVtb3J5LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0Q29tcG9zaXRpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkxpc3QudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0dldENvbmNlcHRCeUNoYXJhY3Rlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0Q29ubmVjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0dldERhdGFGcm9tSW5kZXhEYi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0TGluay50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9HZXRSZWxhdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvR2V0VGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvSW5pdGlhbGl6ZVN5c3RlbS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvQ29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvQ29udmVydEZyb21MQ29ubmVjdGlvblRvQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c0xvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb21wb3NpdGlvbkxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb25jZXB0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldENvbXBvc2l0aW9uTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldFJlbGF0aW9uTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldFRoZUNvbmNlcHRMb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvTWFrZVRoZUNvbmNlcHRMb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTG9jYWwvTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9NYWtlVGhlVHlwZUxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9VcGRhdGVDb21wb3NpdGlvbkxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9NYWtlVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9NYWtlVGhlQ2hhcmFjdGVyRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTWFrZVRoZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVUaW1lc3RhbXAudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVUeXBlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvTXF0dC9wdWJsaXNoTWVzc2FnZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtJbnRlcm5hbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtNdWx0aXBsZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvU3BsaXRTdHJpbmdzLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci8uL3NyYy9TZXJ2aWNlcy9VcGRhdGVDb21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvU2VydmljZXMvVXNlci9Vc2VyVHJhbnNsYXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyLy4vc3JjL1NlcnZpY2VzL1ZpZXcvVmlld0ludGVybmFsRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvLi9zcmMvYXBwLnRzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9tZnRzY2NzLWJyb3dzZXIvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL21mdHNjY3MtYnJvd3Nlci93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1icm93c2VyL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENoYXJhY3RlclJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ2hhcmFjdGVyUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmV0dXJuZXIgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvUmV0dXJuZXJcIjtcbmltcG9ydCB7IFRoZUNoYXJhY3RlciB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9UaGVDaGFyYWN0ZXJcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ2hhcmFjdGVyKGNoYXJhY3RlckRhdGEpIHtcbiAgICB2YXIgY2hhcmFjdGVyRGF0YTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2hhcmFjdGVyRGF0YSA9IENoYXJhY3RlclJlcG9zaXRvcnkuR2V0Q2hhcmFjdGVyKGNoYXJhY3RlckRhdGEuZGF0YSk7XG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyRGF0YS5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlVGhlQ2hhcmFjdGVyRGF0YVVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNoYXJhY3RlckRhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFN0cmluZztcbiAgICAgICAgICAgICAgICB2YXIgc2F2aW5nQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3RlcihyZXN1bHQudXNlcklkLCBjaGFyYWN0ZXJEYXRhLmRhdGEsIDAsIDAsIDQsIDQsIDk5OSwgOTk5LCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgc2F2aW5nQ2hhcmFjdGVyLmlkID0gcmVzdWx0LmlkO1xuICAgICAgICAgICAgICAgIENoYXJhY3RlclJlcG9zaXRvcnkuQWRkQ2hhcmFjdGVyKHNhdmluZ0NoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5pbmdEYXRhID0gbmV3IFJldHVybmVyKGNoYXJhY3RlckRhdGEuaWQsIGNoYXJhY3RlckRhdGEudXNlcklkLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmluZ0RhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVhdGUgdGhlIGNoYXJhY3RlciBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVhdGUgdGhlIGNoYXJhY3RlciB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29uY2VwdEFwaShjb25jZXB0RGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uY2VwdERhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFN0cmluZyA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFN0cmluZztcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbmNlcHQgYXBpIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29uY2VwdCBhcGkgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaShjb25uZWN0aW9uRGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICB2YXIganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShjb25uZWN0aW9uRGF0YSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlVGhlQ29ubmVjdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGpzb25EYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIENyZWF0ZSB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IFRva2VuU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9TZWN1cml0eS9Ub2tlblN0b3JhZ2VcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVHaG9zdENvbmNlcHRBcGkoY29uY2VwdERhdGEsIGNvbm5lY3Rpb25EYXRhKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIFwiY29uY2VwdHNcIjogW10sXG4gICAgICAgICAgICBcImNvbm5lY3Rpb25zXCI6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKFwiYXBwbGljYXRpb24vanNvblwiLCBUb2tlblN0b3JhZ2UuQmVhcmVyQWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBoZWFkZXJcIiwgaGVhZGVyKTtcbiAgICAgICAgICAgIGxldCBteUJvZHkgPSB7XG4gICAgICAgICAgICAgICAgXCJjb25jZXB0c1wiOiBjb25jZXB0RGF0YSxcbiAgICAgICAgICAgICAgICBcImNvbm5lY3Rpb25zXCI6IGNvbm5lY3Rpb25EYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkNyZWF0ZUdob3N0Q29uY2VwdEFwaVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG15Qm9keSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgcmVzdWx0LmNvbmNlcHRzID0gcmVzdWx0U3RyaW5nLmNvbmNlcHRzO1xuICAgICAgICAgICAgcmVzdWx0LmNvbm5lY3Rpb25zID0gcmVzdWx0U3RyaW5nLmNvbm5lY3Rpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29uY2VwdCBhcGkgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlIHRoZSBjb25jZXB0IGFwaSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGV4dERhdGEodGV4dERhdGEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVUZXh0RGF0YVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHRleHREYXRhKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTdHJpbmcgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRTdHJpbmc7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlIHRoZSB0ZXh0IGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgdGV4dCB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRPbmx5VG9rZW5IZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRGVsZXRlVGhlQ29uY2VwdChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9ybWRhdGEuYXBwZW5kKFwiaWRcIiwgaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyID0gR2V0T25seVRva2VuSGVhZGVyKCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuRGVsZXRlQ29uY2VwdFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGZvcm1kYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbmNlcHQgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbmNlcHQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0T25seVRva2VuSGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERlbGV0ZVRoZUNvbm5lY3Rpb24oaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1kYXRhLmFwcGVuZChcImlkXCIsIGlkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlciA9IEdldE9ubHlUb2tlbkhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkRlbGV0ZVRoZUNvbm5lY3Rpb25VcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBmb3JtZGF0YSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogXCJmb2xsb3dcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25uZWN0aW9uIGVycm9yIHN0YXR1czogJywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25uZWN0aW9uIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBUcmFzaFRoZUNvbmNlcHQoaWQsIHRva2VuKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG15SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgICAgICBteUhlYWRlcnMuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdG9rZW4pO1xuICAgICAgICAgICAgY29uc3QgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1kYXRhLmFwcGVuZCgnaWQnLCBpZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5EZWxldGVDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBib2R5OiBmb3JtZGF0YSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBteUhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlbGV0ZSBjb21wb3NpdGlvbiBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb21wb3NpdGlvbiBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgY29tcG9zaXRpb24gdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmwnO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGEnO1xuaW1wb3J0IHsgUHVyZ2F0b3J5RGF0YWJhc2VVcGRhdGVkIH0gZnJvbSAnLi4vU2VydmljZXMvSW5pdGlhbGl6ZVN5c3RlbSc7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyJztcbmV4cG9ydCBmdW5jdGlvbiBHZXRBaURhdGEoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxBaURhdGEoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FpIEVycm9yIE1lc3NhZ2U6ICcsIFwiQ2Fubm90IGdldCByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFB1cmdhdG9yeURhdGFiYXNlVXBkYXRlZCgpO1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgdGltZSB0YWtlbiBpcyBcIiwgZWxhcHNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBaSBFcnJvciBNZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBaSBFcnJvciBNZXNzYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxDb25jZXB0c0J5VHlwZSh0eXBlLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHVybGVuY29kZWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInR5cGVcIiwgdHlwZSk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInVzZXJfaWRcIiwgdXNlcklkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbmNlcHRzQnlUeXBlVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogdXJsZW5jb2RlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldEFsbENvbmNlcHRzQnlUeXBlIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXRBbGxDb25jZXB0c0J5VHlwZSBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXRBbGxDb25jZXB0c0J5VHlwZSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YSc7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uIH0gZnJvbSAnLi4vU2VydmljZXMvQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24nO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gJy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXInO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihjb21wb3NpdGlvbl9pZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGNvbXBvc2l0aW9uX2lkKTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25PbmxpbmUoY29tcG9zaXRpb25faWQpO1xuICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBuZXdDb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbk9ubGluZShjb21wb3NpdGlvbl9pZCk7XG4gICAgICAgICAgICB2YXIgbmV3Q29ubmVjdGlvbnMgPSBuZXdDb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uKG5ld0Nvbm5lY3Rpb25zLCBjb25uZWN0aW9uTGlzdCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9IG5ld0Nvbm5lY3Rpb25zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25PbmxpbmUoY29tcG9zaXRpb25faWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25VcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY29tcG9zaXRpb25faWQ9JHtjb21wb3NpdGlvbl9pZH1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyBnZXR0aW5nIGNvbm5lY3Rpb24gZnJvbSBvbmxpbmVcIiwgQmFzZVVybC5HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25VcmwoKSwgY29tcG9zaXRpb25faWQpO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24ocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb24gb2YgY29tcG9zaXRpb24gZXJyb3IgOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb24gb2YgY29tcG9zaXRpb24gZXJyb3IgOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YSc7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEZpbmRDb25jZXB0c0Zyb21Db25uZWN0aW9ucyB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbmRDb25lY2VwdHNGcm9tQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrSW5NZW1vcnknO1xuaW1wb3J0IHsgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9DaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbic7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSAnLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlcic7XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhjb21wb3NpdGlvbl9pZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgY29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uX2lkcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBvbGRDb25uZWN0aW9uTGlzdCA9IHlpZWxkIEZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25zQnVsa0luTWVtb3J5KGNvbXBvc2l0aW9uX2lkcyk7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbk9ubGluZShjb21wb3NpdGlvbl9pZHMpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbihjb25uZWN0aW9uTGlzdCwgb2xkQ29ubmVjdGlvbkxpc3QpO1xuICAgICAgICB5aWVsZCBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uT25saW5lKGNvbXBvc2l0aW9uX2lkcyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb21wb3NpdGlvbl9pZHMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2gocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBjb25uZWN0aW9ucyBvZiBjb21wb3NpdGlvbiBidWxrIGVycm9yIG1lc3NhZ2U6ICcsIFwiQ2Fubm90IGdldCByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgY29ubmVjdGlvbnMgb2YgY29tcG9zaXRpb24gYnVsayBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb25zIG9mIGNvbXBvc2l0aW9uIGJ1bGsgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0KGNvbmNlcHRJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxMaW5rZXJDb25uZWN0aW9uT2ZDb25jZXB0VXJsKCkgKyBgP2NvbmNlcHRJZD0ke2NvbmNlcHRJZH1gLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29uY2VwdHMgZXJyb3JcIiwgXCJjYW5ub3QgZ2V0IHJlc3BvbmVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGxpbmtlciBjb25uZWN0aW9uIGZyb20gdGhlIGNvbmNlcHRzIGVycm9yOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGxpbmtlciBjb25uZWN0aW9uIGZyb20gdGhlIGNvbmNlcHRzIGVycm9yKFVuZXhwZWN0ZWQpOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0KGNvbmNlcHRJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0VXJsKCkgKyBgP2NvbmNlcHRJZD0ke2NvbmNlcHRJZH1gLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gVG8gdGhlIGNvbmNlcHRzIGVycm9yXCIsIFwiY2Fubm90IGdldCByZXNwb25lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBsaW5rZXIgY29ubmVjdGlvbiBUbyB0aGUgY29uY2VwdHMgZXJyb3I6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gVG8gdGhlIGNvbmNlcHRzIGVycm9yKFVuZXhwZWN0ZWQpOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0KGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFVzZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGxldCBpc05wYyA9IENvbmNlcHRzRGF0YS5HZXROcGMoaWQpO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgIT0gMCB8fCBpc05wYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25jZXB0VXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYGlkPSR7aWR9YFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkTnBjKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgdGhlIGNvbmNlcHQgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCB0aGUgY29uY2VwdCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgdGhlIGNvbmNlcHQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnVsayhjb25jZXB0SWRzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGJ1bGtDb25jZXB0RmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0VXNlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWxrQ29uY2VwdEZldGNoLnB1c2goY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1bGtDb25jZXB0RmV0Y2gubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShidWxrQ29uY2VwdEZldGNoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgQ29uY2VwdCBCdWxrIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29uY2VwdCBCdWxrICBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29uY2VwdCBCdWxrICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQnVsa0NvbmNlcHRHZXR0ZXJBcGkoYnVsa0NvbmNlcHRGZXRjaCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGlmIChidWxrQ29uY2VwdEZldGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG15SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldENvbmNlcHRCdWxrVXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYnVsa0NvbmNlcHRGZXRjaCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSByZXN1bHRbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdidWxrIGNvbmNlcHQgZ2V0dGVyIGFwaSBlcnJvcjogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYnVsayBjb25jZXB0IGdldHRlciBhcGkgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKGNoYXJhY3RlclZhbHVlLCB0eXBlSWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlTG9jYWwoY2hhcmFjdGVyVmFsdWUsIHR5cGVJZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdCA9PSBudWxsIHx8IGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBqc29uID0ge1xuICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyX3ZhbHVlJzogYCR7Y2hhcmFjdGVyVmFsdWV9YCxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGVfaWQnOiB0eXBlSWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB0b1NlbmRKc29uID0gSlNPTi5zdHJpbmdpZnkoanNvbik7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZVVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHRvU2VuZEpzb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IHR5cGUgYW5kIGNoYXJhY3RlciBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgdHlwZSBhbmQgY2hhcmFjdGVyIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IHR5cGUgYW5kIGNoYXJhY3RlciB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY2hhcmFjdGVyX3ZhbHVlPSR7Y2hhcmFjdGVyVmFsdWV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgaW4gR2V0dGluZyBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSBFcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgY29uY2VwdCBieSBjaGFyYWN0ZXIgdmFsdWUgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgY29uY2VwdCBieSBjaGFyYWN0ZXIgdmFsdWUgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb24oaWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29ubmVjdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGBpZD0ke2lkfWBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHlpZWxkIHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IENvbm5lY3Rpb24gRXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25uZWN0aW9uIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25uZWN0aW9uIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMgfSBmcm9tIFwiLi4vU2VydmljZXMvRmluZENvbmVjZXB0c0Zyb21Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uQnVsayhjb25uZWN0aW9uSWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBidWxrQ29ubmVjdGlvbkZldGNoID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25JZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdFVzZSA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWxrQ29ubmVjdGlvbkZldGNoLnB1c2goY29ubmVjdGlvbklkc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbmNlcHRVc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWxrQ29ubmVjdGlvbkZldGNoLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29ubmVjdGlvbkJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShidWxrQ29ubmVjdGlvbkZldGNoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBDb25uZWN0aW9uIEJ1bGsgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IENvbm5lY3Rpb24gQnVsayBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29ubmVjdGlvbiBCdWxrIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQodHlwZUlkLCBvZlRoZUNvbmNlcHRJZCwgdXNlcklkLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciB1cmxlbmNvZGVkID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ0eXBlSWRcIiwgYCR7dHlwZUlkfWApO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJvZlRoZUNvbmNlcHRJZFwiLCBgJHtvZlRoZUNvbmNlcHRJZH1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwidXNlcklkXCIsIGAke3VzZXJJZH1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwiaW5wYWdlXCIsIGAke2lucGFnZX1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwicGFnZVwiLCBgJHtwYWdlfWApO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbm5lY3Rpb25zT2ZDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogdXJsZW5jb2RlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9ICh5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0IGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0ICBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0IHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBSZXNlcnZlZENvbm5lY3Rpb25JZHMgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvUmVzZXJ2ZWRJZHNcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRzKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgUmVzZXJ2ZWRDb25uZWN0aW9uSWRzLkFkZElkKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXQgcmVzZXJ2ZWQgY29ubmVjdGlvbiBpZHMgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0IHJlc2VydmVkIGNvbm5lY3Rpb24gaWRzICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBSZXNlcnZlZElkcyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9SZXNlcnZlZElkc1wiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZXNlcnZlZElkcygpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldFJlc2VydmVkSWRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgUmVzZXJ2ZWRJZHMuQWRkSWQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dldCByZXNlcnZlZCBpZHMgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0IHJlc2VydmVkIGlkcyAgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldExvY2FsQ29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY2hhcmFjdGVyX3ZhbHVlPSR7Y2hhcmFjdGVyVmFsdWV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBpbiBHZXR0aW5nIExvY2FsIGNvbmNlcHQgYnkgY2hhcmFjdGVyIHZhbHVlIEVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBMb2NhbCBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSBlcnJvciBtZXNzYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBMb2NhbCBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgVG9rZW5TdG9yYWdlIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlJztcbmV4cG9ydCBmdW5jdGlvbiBMb2dpblRvQmFja2VuZChlbWFpbCwgcGFzc3dvcmQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICAnZW1haWwnOiBlbWFpbCxcbiAgICAgICAgICAgICAgICAncGFzc3dvcmQnOiBwYXNzd29yZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBteUhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICAgICAgbXlIZWFkZXJzLmFwcGVuZChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdE9iamVjdCA9IEpTT04uc3RyaW5naWZ5KG9iamVjdCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuTG9naW5VcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0T2JqZWN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gcmVzdWx0LmRhdGEudG9rZW47XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIHRoZSB0b2tlblwiLCBUb2tlblN0b3JhZ2UuQmVhcmVyQWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTG9naW4gdHNjY3MgZXJyb3IgbWVzc2FnZTogJywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0xvZ2luIHRzY2NzIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBMb2dpbiB0c2NjcyAgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZU5hbWVJbkJhY2tlbmQobmV3Q29uY2VwdElkLCByZWZlcmVudCwgdHlwZUlkLCB0eXBlVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgJ25ld0NvbmNlcHRJZCc6IG5ld0NvbmNlcHRJZCxcbiAgICAgICAgICAgICAgICAncmVmZXJlbnQnOiByZWZlcmVudCxcbiAgICAgICAgICAgICAgICAndHlwZUlkJzogdHlwZUlkLFxuICAgICAgICAgICAgICAgICd0eXBlVXNlcklkJzogdHlwZVVzZXJJZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBteUhlYWRlcnMgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdE9iamVjdCA9IEpTT04uc3RyaW5naWZ5KG9iamVjdCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGZldGNoKEJhc2VVcmwuTWFrZVRoZU5hbWVJbkJhY2tlbmRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0T2JqZWN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21ha2UgdGhlIG5hbWUgaW4gYmFja2VuZCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYWtlIHRoZSBuYW1lIGluIGJhY2tlbmQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeSB9IGZyb20gXCIuLi9TZXJ2aWNlcy9Db25jZXB0RmluZGluZy9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeVwiO1xuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSB0eXBlIGNvbmNwZXQgb2YgYSBwYXNzZWQgc3RyaW5nXG4vLyBpZiB0aGUgdGV4dCBpcyBcInRoZV9wZXJzb25cIiB0aGVuIHRoZSBmdW5jdGlvbiBmaW5kcyB0aGUgcmVsYXRlZCBjb25jZXB0XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZVR5cGVDb25jZXB0QXBpKHR5cGUsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIC8vIGNyZWF0ZSAgYSBkZWZhdWx0IGNvbmNlcHQgd2l0aCBhbGwgZGVmYXVsdGluZyB0byB6ZXJvXG4gICAgICAgIGxldCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGdldCB0aGUgY29uY2VwdCBieSBjaGFyYWN0ZXIgYW5kIGNhdGVnb3J5IGZyb20gdGhlIGFwaVxuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHR5cGUpO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCB8fCBjb25jZXB0LnR5cGVJZCA9PSA0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5NYWtlVGhlVHlwZUNvbmNlcHRVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBgdHlwZT0ke3R5cGV9YFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNYWtlIFRoZSBUeXBlIENvbmNlcHQgQXBpIGVycm9yIDogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTWFrZSBUaGUgVHlwZSBDb25jZXB0IEFwaSBlcnJvciA6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU2VhcmNoUXVlcnlcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkJ1bGtcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFJlY3Vyc2l2ZVNlYXJjaEFwaShjb21wb3NpdGlvbiA9IDAsIGxpc3RMaW5rZXJzID0gW10sIHRleHRTZWFyY2ggPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHRzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc2VhcmNoUXVlcnkgPSBuZXcgU2VhcmNoUXVlcnkoKTtcbiAgICAgICAgICAgIHNlYXJjaFF1ZXJ5LmNvbXBvc2l0aW9uID0gY29tcG9zaXRpb247XG4gICAgICAgICAgICBzZWFyY2hRdWVyeS5saXN0TGlua2VycyA9IGxpc3RMaW5rZXJzO1xuICAgICAgICAgICAgc2VhcmNoUXVlcnkudGV4dFNlYXJjaCA9IHRleHRTZWFyY2g7XG4gICAgICAgICAgICB2YXIgcmF3ID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNoUXVlcnkpO1xuICAgICAgICAgICAgdmFyIENvbm5lY3Rpb25zID0gW107XG4gICAgICAgICAgICB2YXIgbXlIZWFkZXJzID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLlJlY3Vyc2l2ZVNlYXJjaFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHJhd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRJZHMgPSByZXN1bHQuY29tcG9zaXRpb25JZHM7XG4gICAgICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gcmVzdWx0LmludGVybmFsQ29ubmVjdGlvbnM7XG4gICAgICAgICAgICAgICAgdmFyIGV4dGVybmFsQ29ubmVjdGlvbnMgPSByZXN1bHQuZXh0ZXJuYWxDb25uZWN0aW9ucztcbiAgICAgICAgICAgICAgICBjb25jZXB0cyA9IHlpZWxkIEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZChjb25jZXB0SWRzLCBjb25uZWN0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlY3Vyc2l2ZSBzZWFyY2ggZXJyb3IgXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZWN1cnNpdmUgc2VhcmNoIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlY3Vyc2l2ZSBzZWFyY2ggdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlEaXJlY3RBcGkoY2hhcmFjdGVyVmFsdWUsIGNhdGVnb3J5X2lkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogYGNoYXJhY3Rlcl92YWx1ZT0ke2NoYXJhY3RlclZhbHVlfSZjYXRlZ29yeV9pZD0ke2NhdGVnb3J5X2lkfWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IGNhdGVnb3J5IGFuZCBjaGFyYWN0ZXIgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgY2F0ZWdvcnkgYW5kIGNoYXJhY3RlciBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgVGhpcyBpcyB0aGUgY29uY2VwdCBieSBjYXRlZ29yeSBhbmQgY2hhcmFjdGVyIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbiB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBTZWFyY2hBbGxDb25jZXB0cyh0eXBlLCBzZWFyY2gsIGNvbXBvc2l0aW9uLCB0b2tlbiwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywgdG9rZW4pO1xuICAgICAgICB2YXIgdXJsZW5jb2RlZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInNlYXJjaFwiLCBzZWFyY2gpO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcImNvbXBvc2l0aW9uXCIsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJpbnBhZ2VcIiwgaW5wYWdlLnRvU3RyaW5nKCkpO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInBhZ2VcIiwgcGFnZS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgcXVlcnlVcmwgPSBCYXNlVXJsLlNlYXJjaENvbXBvc2l0aW9uc1VybCgpICsgXCI/XCIgKyB1cmxlbmNvZGVkLnRvU3RyaW5nKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHF1ZXJ5VXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgZXJyb3JcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaEludGVybmFsQXBpKHNlYXJjaCwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihcImFwcGxpY2F0aW9uL2pzb25cIiwgdG9rZW4pO1xuICAgICAgICBsZXQgcXVlcnlVcmwgPSBCYXNlVXJsLlNlYXJjaEludGVybmFsV2l0aEF1dGhlbnRpY2F0ZWRDY3NVcmwoKTtcbiAgICAgICAgcXVlcnlVcmwgPSBxdWVyeVVybCArICc/Y29tcG9zaXRpb249JyArIHNlYXJjaC5jb21wb3NpdGlvbiArICcmc2VhcmNoPScgKyBzZWFyY2guc2VhcmNoICsgJyZpbnRlcm5hbENvbXBvc2l0aW9uPScgKyBzZWFyY2guaW50ZXJuYWxDb21wb3NpdGlvbiArICcmdHlwZT0nICsgc2VhcmNoLnR5cGUgKyAnJmlucGFnZT0nICsgc2VhcmNoLmlucGFnZSArICcmcGFnZT0nICsgc2VhcmNoLnBhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHF1ZXJ5VXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgaW50ZXJuYWwgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBpbnRlcm5hbCBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaExpbmtNdWx0aXBsZUFwaShzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihcImFwcGxpY2F0aW9uL2pzb25cIiwgdG9rZW4pO1xuICAgICAgICBjb25zdCBxdWVyeVVybCA9IEJhc2VVcmwuU2VhcmNoTGlua011bHRpcGxlQWxsQXBpVXJsKCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShzZWFyY2hRdWVyeSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHF1ZXJ5VXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgbXVsdGlwbGUgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBtdWx0aXBsZSBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaFdpdGhMaW5rZXIoc2VhcmNoUXVlcnksIHRva2VuID0gXCJcIikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oXCJhcHBsaWNhdGlvbi9qc29uXCIsIHRva2VuKTtcbiAgICAgICAgY29uc3QgcXVlcnlVcmwgPSBCYXNlVXJsLlNlYXJjaExpbmtNdWx0aXBsZUFsbCgpO1xuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNoUXVlcnkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChxdWVyeVVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgZXJyb3JcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlU2Vzc2lvbihzZXNzaW9uRGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHNlc3Npb25EYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVTZXNzaW9uSWQoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIHNlc3Npb24gZmFpbGVkXCIsIHlpZWxkIHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgc2Vzc2lvbiBmYWlsZWRcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVTZXNzaW9uVmlzaXQoc2Vzc2lvbklkLCB1cmwpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgICAgICAgICBjb25zdCB1cmxlbmNvZGVkID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJzZXNzaW9uSWRcIiwgc2Vzc2lvbklkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ1cmxcIiwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVTZXNzaW9uVmlzaXRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiB1cmxlbmNvZGVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIHNlc3Npb24gdXJsIGZhaWxlZFwiLCB5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIHNlc3Npb24gdXJsIGZhaWxlZFwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2lnbmluKHNpZ25pbkluZm8pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCByYXcgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBlbWFpbDogc2lnbmluSW5mby5lbWFpbCxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBzaWduaW5JbmZvLnBhc3N3b3JkLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICBtZXNzYWdlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG15SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIG15SGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIGNvbnN0IHVybCA9IEJhc2VVcmwuTG9naW5VcmwoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHJhdyxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPYmplY3QgPSBvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdXRwdXQuZGF0YTtcbiAgICAgICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhT2JqZWN0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnY2Fubm90IGF1dGhlbnRpY2F0ZScsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmcmVlc2NoZW1hUmVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpZ24gaW4gYXBpIGVycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBmcmVlc2NoZW1hUmVzO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vYXBwXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTaWdudXAoc2lnbnVwTW9kZWwpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBzaWdudXBSZXNwb25zZSA9IHlpZWxkIHBvc3REYXRhKEJhc2VVcmwuU2lnbnVwVXJsKCksIHNpZ251cE1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHNpZ251cFJlc3BvbnNlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcG9zdERhdGEodXJsID0gJycsIGRhdGEgPSB7fSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICB9O1xuICAgICAgICAvLyBEZWZhdWx0IG9wdGlvbnMgYXJlIG1hcmtlZCB3aXRoICpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsIC8vICpHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBldGMuXG4gICAgICAgICAgICAgICAgbW9kZTogJ2NvcnMnLCAvLyBuby1jb3JzLCAqY29ycywgc2FtZS1vcmlnaW5cbiAgICAgICAgICAgICAgICBjYWNoZTogJ25vLWNhY2hlJywgLy8gKmRlZmF1bHQsIG5vLWNhY2hlLCByZWxvYWQsIGZvcmNlLWNhY2hlLCBvbmx5LWlmLWNhY2hlZFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCAvLyBpbmNsdWRlLCAqc2FtZS1vcmlnaW4sIG9taXRcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgIC8vICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gbWFudWFsLCAqZm9sbG93LCBlcnJvclxuICAgICAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXInLCAvLyBuby1yZWZlcnJlciwgKm5vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlLCBvcmlnaW4sIG9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiwgc2FtZS1vcmlnaW4sIHN0cmljdC1vcmlnaW4sIHN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4sIHVuc2FmZS11cmxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSwgLy8gYm9keSBkYXRhIHR5cGUgbXVzdCBtYXRjaCBcIkNvbnRlbnQtVHlwZVwiIGhlYWRlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBvdXRwdXQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdjYW5ub3QgY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZyZWVzY2hlbWFSZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2lnbnVwIEVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGZyZWVzY2hlbWFSZXM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhLCBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2xhdGVMb2NhbFRvUmVhbChjb25jZXB0SWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldFJlYWxDb25jZXB0QnlJZCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGBpZD0ke2NvbmNlcHRJZH1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGluIEdldHRpbmcgVHJhbnNsYXRpbmcgY29uY2VwdCBFcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgVHJhbnNsYXRpbmcgY29uY2VwdCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBUcmFuc2xhdGluZyBjb25jZXB0IHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCdWxrIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIFZpZXdJbnRlcm5hbERhdGFBcGkoaWRzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLlZpZXdJbnRlcm5hbERhdGFVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9uRGljdGlvbmFyeSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdFN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29uY2VwdExpc3QgPSBjb25jZXB0U3RyaW5nW2ldLmNvbmNlcHRzO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbmNlcHRTdHJpbmdbaV0uY29ubmVjdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGNvbmNlcHRTdHJpbmdbaV0uaWQ7XG4gICAgICAgICAgICAgICAgICAgIEdldENvbmNlcHRCdWxrKGNvbmNlcHRMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkRpY3Rpb25hcnlbaWRdID0gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uRGljdGlvbmFyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmlldyBJbnRlcm5hbCBEYXRhIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgVGhpcyBpcyB0aGUgdmlldyBpbnRlcm5hbCBkYXRhIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSB2aWV3IGludGVybmFsIGRhdGEgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJleHBvcnQgY2xhc3MgQmFzZVVybCB7XG4gICAgLy8gc3RhdGljIEdldENvbmNlcHRVcmw6c3RyaW5nID0gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldENvbmNlcHQnO1xuICAgIHN0YXRpYyBHZXRDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldENvbmNlcHQnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvblVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtY29ubmVjdGlvbi1ieS1pZCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnVsa1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9idWxrJztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25CdWxrVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jb25uZWN0aW9uX2J1bGsnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29uY2VwdHNPZlVzZXJVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25jZXB0c19vZl91c2VyJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbENvbm5lY3Rpb25zT2ZVc2VyVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29ubmVjdGlvbnNfb2ZfdXNlcic7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25uZWN0aW9uc19vZl9jb21wb3NpdGlvbic7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29ubmVjdGlvbnNfb2ZfY29tcG9zaXRpb25fYnVsayc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9ieV9jaGFyYWN0ZXJfdmFsdWUnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9ieV9jaGFyYWN0ZXJfYW5kX3R5cGUnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2NvbmNlcHRfYnlfY2hhcmFjdGVyX2FuZF9jYXRlZ29yeSc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9ieV9jaGFyYWN0ZXJfYW5kX2NhdGVnb3J5X2RpcmVjdCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDaGFyYWN0ZXJCeUNoYXJhY3RlclVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY2hhcmFjdGVyX2J5X2NoYXJhY3Rlcic7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25jZXB0c0J5VHlwZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2NvbmNlcHRzX2J5X3R5cGUnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0LWxpbmstY29ubmVjdGlvbnMnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQWlEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1wcmVsb2FkZWQtY29uY2VwdHMnO1xuICAgICAgICAvLyByZXR1cm4gdGhpcy5BSV9VUkwgKyAnL2FwaS9nZXRfcmFua2VkX3R5cGVfaWQ/aW5wYWdlPTMwMCcgfHwgcHJvY2Vzcy5lbnYuQUlfVVJMIHx8ICAnaHR0cHM6Ly9haS5mcmVlc2NoZW1hLmNvbS9hcGkvZ2V0X3JhbmtlZF90eXBlX2lkP2lucGFnZT0zMDAnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsUHJlZmV0Y2hDb25uZWN0aW9uc1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2Nvbm5lY3Rpb25zX29mX3VzZXI/aW5wYWdlPTUwMCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxMaW5rZXJDb25uZWN0aW9uT2ZDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1hbGwtbGlua2Vycy1mcm9tLWNvbmNlcHQnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsTGlua2VyQ29ubmVjdGlvblRvQ29uY2VwdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtYWxsLWxpbmtlcnMtdG8tY29uY2VwdCc7XG4gICAgfVxuICAgIHN0YXRpYyBEZWxldGVDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2RlbGV0ZV9jb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIFJlY3Vyc2l2ZVNlYXJjaFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9yZWN1cnNpdmVzZWFyY2gtY29uY2VwdC1jb25uZWN0aW9uJztcbiAgICB9XG4gICAgc3RhdGljIFNlYXJjaExpbmtNdWx0aXBsZUFsbEFwaVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9Db25uZWN0aW9uL3NlYXJjaC1saW5rLW11bHRpcGxlLWFsbC1jY3MnO1xuICAgIH1cbiAgICBzdGF0aWMgTWFrZVRoZU5hbWVJbkJhY2tlbmRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvbWFrZS1uYW1lLWZyb20tZnJvbnRlbmQnO1xuICAgIH1cbiAgICBzdGF0aWMgTG9naW5VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvYXV0aC9sb2dpbic7XG4gICAgfVxuICAgIHN0YXRpYyBTaWdudXBVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvYXV0aC9zaWdudXAnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29tcG9zaXRpb25Db25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1jb21wb3NpdGlvbi1jb25uZWN0aW9uLWJldHdlZW4tdHdvLWNvbmNlcHRzJztcbiAgICB9XG4gICAgc3RhdGljIFNlYXJjaENvbXBvc2l0aW9uc1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9zZWFyY2gtY29tcG9zaXRpb25zJztcbiAgICB9XG4gICAgc3RhdGljIFNlYXJjaExpbmtNdWx0aXBsZUFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9Db25uZWN0aW9uL3NlYXJjaC1saW5rLW11bHRpcGxlLWFsbCc7XG4gICAgfVxuICAgIHN0YXRpYyBDcmVhdGVTZXNzaW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlLXNlc3Npb24taWQtcmVtb3RlJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVNlc3Npb25WaXNpdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9jcmVhdGUtcmVtb3RlLXNlc3Npb24tdmlzaXQnO1xuICAgIH1cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy9BcGkgZm9yIHZpZXdpbmcgaW50ZXJuYWwgZGF0YSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIHN0YXRpYyBWaWV3SW50ZXJuYWxEYXRhVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL3ZpZXctYXBpLWludGVybmFsLWRhdGEtY2NzLWlkLWJ1bGsnO1xuICAgIH1cbiAgICBzdGF0aWMgU2VhcmNoSW50ZXJuYWxXaXRoQXV0aGVudGljYXRlZENjc1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9zZWFyY2gtY29tcG9zaXRpb24taW50ZXJuYWwtYXV0aGVudGljYXRlZC1jY3MnO1xuICAgIH1cbiAgICBzdGF0aWMgQ3JlYXRlR2hvc3RDb25jZXB0QXBpVXJsKCkge1xuICAgICAgICByZXR1cm4gQmFzZVVybC5OT0RFX1VSTCArICcvYXBpL3YxL2xvY2FsLWNvbmNlcHRzJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZUdob3N0Q29ubmVjdGlvbkFwaVVybCgpIHtcbiAgICAgICAgcmV0dXJuIEJhc2VVcmwuTk9ERV9VUkwgKyAnL2FwaS92MS9sb2NhbC1jb25uZWN0aW9ucyc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRSZWFsQ29uY2VwdEJ5SWQoKSB7XG4gICAgICAgIHJldHVybiBCYXNlVXJsLk5PREVfVVJMICsgJy9hcGkvdjEvbG9jYWwtY29uY2VwdHMtdHJhbnNsYXRlJztcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLyBBUEkgRm9yIFJlc2VydmVkIElkcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgR2V0UmVzZXJ2ZWRJZFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfcmVzZXJ2ZWRfaWRzJztcbiAgICB9XG4gICAgc3RhdGljIEdldFJlc2VydmVkQ29ubmVjdGlvbklkVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9yZXNlcnZlZF9jb25uZWN0aW9uX2lkcyc7XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vL0FQSSBGb3IgQ3JlYXRpbmcgRGF0YSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIHN0YXRpYyBDcmVhdGVUaGVUZXh0RGF0YVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9jcmVhdGVfdGV4dF9kYXRhJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNoYXJhY3RlckRhdGFVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX2NoYXJhY3Rlcl9kYXRhJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbm5lY3Rpb25VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25uZWN0aW9uJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbm5lY3Rpb25OZXdVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25uZWN0aW9uX25ldyc7XG4gICAgfVxuICAgIHN0YXRpYyBNYWtlVGhlVHlwZUNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvbWFrZV90aGVfdHlwZV9jb25jZXB0JztcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vQVBJIEZPUiBEZWxldGluZyBDb25uZWN0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgRGVsZXRlVGhlQ29ubmVjdGlvblVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9kZWxldGVfY29ubmVjdGlvbic7XG4gICAgfVxufVxuQmFzZVVybC5CQVNFX1VSTCA9IFwiaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1My9cIjtcbkJhc2VVcmwuQUlfVVJMID0gXCJodHRwczovL2FpLmZyZWVzY2hlbWEuY29tXCI7XG5CYXNlVXJsLk1RVFRfVVJMID0gJzE5Mi4xNjguMS4yNDknO1xuQmFzZVVybC5OT0RFX1VSTCA9IFwiaHR0cDovL2xvY2FsaG9zdDo1MDAxXCI7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuL0lkZW50aWZpZXJGbGFnc1wiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL05vZGVcIjtcbmV4cG9ydCBjbGFzcyBCaW5hcnlDaGFyYWN0ZXJUcmVlIHtcbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0NoYXJhY3RlckxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChCaW5hcnlDaGFyYWN0ZXJUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhcmFjdGVyUm9vdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmFjdGVyUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhcmFjdGVyUm9vdCA9IHRoaXMuY2hhcmFjdGVyUm9vdC5hZGRDaGFyYWN0ZXJOb2RlKG5vZGUsIHRoaXMuY2hhcmFjdGVyUm9vdCwgdGhpcy5jaGFyYWN0ZXJSb290LmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZU5vZGVCeUNoYXJhY3RlcihjaGFyYWN0ZXIsIGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5jaGFyYWN0ZXJSb290LCBjaGFyYWN0ZXIsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3QuY291bnROb2RlQmVsb3codGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNoYXJhY3RlclJvb3QuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlVXBkYXRlZCh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgdGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUodmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldENoYXJhY3RlckFuZENhdGVnb3J5RnJvbVRyZWUodmFsdWUsIGNhdGVnb3J5SWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNoYXJhY3RlclJvb3QuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRDaGFyYWN0ZXIoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290ID0gdGhpcy5jaGFyYWN0ZXJSb290LnJlbW92ZU5vZGUodGhpcy5jaGFyYWN0ZXJSb290LCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5CaW5hcnlDaGFyYWN0ZXJUcmVlLmNoYXJhY3RlclJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4vQmluYXJ5Q2hhcmFjdGVyVHJlZVwiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL05vZGVcIjtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuL0lkZW50aWZpZXJGbGFnc1wiO1xuZXhwb3J0IGNsYXNzIEJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNEYXRhTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KEJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuaWQsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICB2YXIgY2hhcmFjdGVyTm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICBCaW5hcnlDaGFyYWN0ZXJUcmVlLmFkZE5vZGVUb1RyZWUoY2hhcmFjdGVyTm9kZSk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5yb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZU5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5yZW1vdmVOb2RlKHRoaXMucm9vdCwgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNvdW50TnVtYmVyT2ZOb2RlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLnJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbkJpbmFyeVRyZWUucm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tIFwiLi9Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQmluYXJ5VHlwZVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGVSb290ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZVJvb3QgPSB0aGlzLnR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMudHlwZVJvb3QsIHRoaXMudHlwZVJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgTm9kZShjb25jZXB0LnR5cGVJZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZVR5cGVDb25jZXB0KHR5cGVJZCwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZVJvb3QgPSB0aGlzLnR5cGVSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy50eXBlUm9vdCwgdHlwZUlkLCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICBpZiAodGhpcy50eXBlUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnR5cGVSb290LmdldEZyb21Ob2RlKGlkLCB0aGlzLnR5cGVSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWUodHlwZUlkKSB7XG4gICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgdmFyIGNvbmNlcHRzID0gW107XG4gICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChCaW5hcnlUeXBlVHJlZS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTm9kZS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1ByZXNlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29uY2VwdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VwdHNbal0uaWQgPT0gTm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNQcmVzZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0cztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNXaXRoQ2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gY2hhcmFjdGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoTm9kZS52YXJpYW50c1tpXS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFyaWFudHNbaV0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGVSb290KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlUm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLnR5cGVSb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5CaW5hcnlUeXBlVHJlZS50eXBlUm9vdCA9IG51bGw7XG4iLCJpbXBvcnQgeyBUaGVDaGFyYWN0ZXIgfSBmcm9tIFwiLi9UaGVDaGFyYWN0ZXJcIjtcbmV4cG9ydCBjbGFzcyBDaGFyYWN0ZXJSZXBvc2l0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjaGFyYWN0ZXIgUmVwb3NpdG9yeVwiO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICAgICAgICB0aGlzLmNoYXJhY3RlckRhdGFbY2hhcmFjdGVyLmlkXSA9IGNoYXJhY3RlcjtcbiAgICB9XG4gICAgc3RhdGljIEdldENoYXJhY3Rlcih2YWx1ZSkge1xuICAgICAgICB2YXIgdGhlQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3RlcigwLCBcIjBcIiwgMCwgMCwgMCwgMCwgMCwgMCwgXCIwXCIsIGZhbHNlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoYXJhY3RlckRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlckRhdGFbaV0uZGF0YSA9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoZUNoYXJhY3RlciA9IHRoaXMuY2hhcmFjdGVyRGF0YVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhlQ2hhcmFjdGVyO1xuICAgIH1cbn1cbkNoYXJhY3RlclJlcG9zaXRvcnkuY2hhcmFjdGVyRGF0YSA9IFtdO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyByZWN1cnNpdmVGZXRjaE5ldyB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0J1aWxkQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5pbXBvcnQgeyBwdWJsaXNoTWVzc2FnZSB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL01xdHQvcHVibGlzaE1lc3NhZ2UnO1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gd2UgY2FuIGJ1aWxkIGEgY29tcG9zaXRpb24gdXNpbmcgdGhpcyBjbGFzc1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICAgICAgdGhpcy5tYWluQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb25jZXB0cyA9IFtdO1xuICAgICAgICB0aGlzLnN1YmNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNhY2hlZCA9IHt9O1xuICAgIH1cbiAgICB1cGRhdGVDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW5Db25jZXB0LmlkID09IDApXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzW2ldLmlkID09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbkNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZpc2l0ZWRDb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jYWNoZWQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaE5ldyh0aGlzLmlkLCB0aGlzLmNvbm5lY3Rpb25zLCB0aGlzLmNvbmNlcHRzLCB0aGlzLnN1YmNvbXBvc2l0aW9ucywgdmlzaXRlZENvbmNlcHRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFVwZGF0ZUFjcm9zc0Rpc3RyaWJ1dGVkU3lzdGVtKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcHVibGlzaE1lc3NhZ2UoJ2NvbXBvc2l0aW9uVXBkYXRlJywgKF9hID0gdGhpcy5pZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIHB1Ymxpc2hpbmcgbWVzc2FnZScsIGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc1VwZGF0aW5nKCkge1xuICAgICAgICB0aGlzLlVwZGF0ZUFjcm9zc0Rpc3RyaWJ1dGVkU3lzdGVtKCk7XG4gICAgfVxuICAgIEdldERhdGFDYWNoZSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCBtYWluU3RyaW5nID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5tYWluQ29uY2VwdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IHRoaXMuY2FjaGVkO1xuICAgICAgICBjb25zdCBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IHRoaXMuaWQ7XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbXBvc2l0aW9uTm9kZSB9IGZyb20gJy4vQ29tcG9zaXRpb25Ob2RlJztcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbkJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbXBvc2l0aW9uVG9UcmVlKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQ29tcG9zaXRpb25Ob2RlKGNvbXBvc2l0aW9uLmlkLCBjb21wb3NpdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY291bnROb2RlQmVsb3codGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4vLyB0aGlzIGlzIGEgYmluYXJ5IHRyZWUgdG8gaG9sZCBjb21wb3NpdGlvbnMgaW4gaXRcbkNvbXBvc2l0aW9uQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsImltcG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4vQ29tcG9zaXRpb25CaW5hcnlUcmVlJztcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbk5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIGxlZnROb2RlLCByaWdodE5vZGUpIHtcbiAgICAgICAgdGhpcy5leHBpcnlUaW1lID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDEwICogNjAgKiAxMDAwKTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgIH1cbiAgICBpc1ZhbGlkKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKERhdGUubm93KCkpO1xuICAgICAgICBpZiAodGhpcy5leHBpcnlUaW1lIDwgY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5yZW1vdmVOb2RlRnJvbVRyZWUodGhpcy5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzYXZlVG9DYWNoZShkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsdWUuY2FjaGVkID0gZGF0YTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgIGNvbnN0IFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpO1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9XG4gICAgICAgICAgICAxICtcbiAgICAgICAgICAgICAgICBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgY29uc3QgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBjb25zdCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgY29uc3QgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkgJiYgbm9kZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3VudE5vZGVCZWxvdyhyb290KSB7XG4gICAgICAgIGlmIChyb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVjdXJzaXZlIGNhbGwgdG8gbGVmdCBjaGlsZCBhbmQgcmlnaHQgY2hpbGQgYW5kXG4gICAgICAgIC8vIGFkZCB0aGUgcmVzdWx0IG9mIHRoZXNlIHdpdGggMSAoIDEgZm9yIGNvdW50aW5nIHRoZSByb290KVxuICAgICAgICByZXR1cm4gKDEgK1xuICAgICAgICAgICAgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LmxlZnROb2RlKSArXG4gICAgICAgICAgICB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QucmlnaHROb2RlKSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ29uY2VwdCB7XG4gICAgY29uc3RydWN0b3IoaWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIGNoYXJhY3RlclZhbHVlLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCBpc05ldyA9IGZhbHNlLCBlbnRyeVRpbWVTdGFtcCwgdXBkYXRlZFRpbWVTdGFtcCkge1xuICAgICAgICB0aGlzLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy50eXBlVXNlcklkID0gdHlwZVVzZXJJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlJZCA9IGNhdGVnb3J5SWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlVc2VySWQgPSBjYXRlZ29yeVVzZXJJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudElkID0gcmVmZXJlbnRJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudCA9IHJlZmVyZW50SWQ7XG4gICAgICAgIHRoaXMucmVmZXJlbnRVc2VySWQgPSByZWZlcmVudFVzZXJJZDtcbiAgICAgICAgdGhpcy5jaGFyYWN0ZXJWYWx1ZSA9IGAke2NoYXJhY3RlclZhbHVlfWA7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSBzZXNzaW9uVXNlcklkO1xuICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICB0aGlzLnR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgICAgIHRoaXMuZW50cnlUaW1lU3RhbXAgPSBlbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy51cGRhdGVkVGltZVN0YW1wID0gdXBkYXRlZFRpbWVTdGFtcDtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcyk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZUlkKTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IHJlbW92ZUZyb21EYXRhYmFzZSwgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uL0RhdGFiYXNlL2luZGV4ZWRkYlwiO1xuaW1wb3J0IHsgQmluYXJ5VHJlZSB9IGZyb20gXCIuL0JpbmFyeVRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeUNoYXJhY3RlclRyZWUgfSBmcm9tIFwiLi9CaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBCaW5hcnlUeXBlVHJlZSB9IGZyb20gXCIuL0JpbmFyeVR5cGVUcmVlXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuZXhwb3J0IGNsYXNzIENvbmNlcHRzRGF0YSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiY29uY2VwdHNBcnJheVwiO1xuICAgIH1cbiAgICBzdGF0aWMgQ2hlY2tDb250YWlucyhjb25jZXB0KSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIEFkZE5wYyhpZCkge1xuICAgICAgICBpZiAoIXRoaXMuTlBDLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuTlBDLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5OUEMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuTlBDLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBHZXROcGMoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTlBDLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdFRvU3RvcmFnZShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29uY2VwdFwiLCBjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgLy92YXIgY29udGFpbnMgPSB0aGlzLkNoZWNrQ29udGFpbnMoY29uY2VwdCk7XG4gICAgICAgICAgICAvLyB0aGlzLmNvbmNlcHREaWN0aW9uYXJ5W2NvbmNlcHQuaWRdID0gY29uY2VwdDtcbiAgICAgICAgICAgIC8vICAgIGlmKGNvbnRhaW5zKXtcbiAgICAgICAgICAgIC8vICAgdGhpcy5SZW1vdmVDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0VG9NZW1vcnkoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIC8vdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbmNlcHQpO1xuICAgICAgICAgICAgLy8gdGhpcy5jb25jZXB0RGljdGlvbmFyeVtjb25jZXB0LmlkXSA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAvLyAgICBpZihjb250YWlucyl7XG4gICAgICAgICAgICAvLyAgIHRoaXMuUmVtb3ZlQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICBCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0VGVtcG9yYXJ5KGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbmNlcHQpO1xuICAgICAgICB0aGlzLmNvbmNlcHREaWN0aW9uYXJ5W2NvbmNlcHQuaWRdID0gY29uY2VwdDtcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZUNvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25jZXB0c0FycmF5LnB1c2goY29uY2VwdCk7XG4gICAgfVxuICAgIHN0YXRpYyBSZW1vdmVDb25jZXB0KGNvbmNlcHQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29uY2VwdFwiLCBjb25jZXB0LmlkKTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHQoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBteUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB5aWVsZCBCaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICBteUNvbmNlcHQgPSByZXR1cm5lZENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYobXlDb25jZXB0LmlkID09IDAgfHwgbXlDb25jZXB0ID09IG51bGwpe1xuICAgICAgICAgICAgLy8gICAgIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBpZCl7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBteUNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gbXlDb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldE5vZGVGcm9tVHJlZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBOb2RlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVXBkYXRlZChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldE5vZGVGcm9tVHJlZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBOb2RlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKGNoYXJhY3Rlcl92YWx1ZSwgdHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICAvL3ZhciBOb2RlID0gYXdhaXQgQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLHR5cGVJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgQmluYXJ5VHlwZVRyZWUuZ2V0VHlwZVZhcmlhbnRzV2l0aENoYXJhY3RlclZhbHVlKGNoYXJhY3Rlcl92YWx1ZSwgdHlwZUlkKTtcbiAgICAgICAgICAgIC8vIGlmKE5vZGUpe1xuICAgICAgICAgICAgLy8gICAgIGNvbmNlcHQgPSAgTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvdW5kIHRoZSBvdXRwdXRcIik7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coY29uY2VwdCk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKGNoYXJhY3Rlcl92YWx1ZSwgY2F0ZWdvcnlJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB5aWVsZCBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldENoYXJhY3RlckFuZENhdGVnb3J5RnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLCBjYXRlZ29yeUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0c0J5VHlwZUlkKHR5cGVJZCkge1xuICAgICAgICB2YXIgbXlDb25jZXB0O1xuICAgICAgICBsZXQgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgbXlDb25jZXB0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzQXJyYXlbaV0udHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5jb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUoXCJjb25jZXB0XCIsXCJ0eXBlSWRcIix0eXBlSWQpLnRoZW4oY29uY2VwdExpc3Q9PntcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwidGhpIHNpcyBteSBsaXN0XCIpO1xuICAgICAgICAvLyAgfSk7XG4gICAgICAgIC8vICAgdmFyIGRiQ29uY2VwdExpc3QgPSBhd2FpdCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZChcImNvbmNlcHRcIixcInR5cGVJZFwiLCB0eXBlSWQpO1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QpO1xuICAgICAgICAvLyAgIGlmKEFycmF5LmlzQXJyYXkoZGJDb25jZXB0TGlzdCkpe1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QpO1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QubGVuZ3RoKTtcbiAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPCBkYkNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiaGVyZSB0byBwdXNoIGZpcnN0c1wiKTtcbiAgICAgICAgLy8gICAgIHZhciBjb250YWluczogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgZm9yKHZhciBqPTA7IGo8IENvbmNlcHRMaXN0Lmxlbmd0aDsgaisrKXtcbiAgICAgICAgLy8gICAgICAgICBpZihkYkNvbmNlcHRMaXN0W2ldLmlkID09IENvbmNlcHRMaXN0W2pdLmlkKXtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiaGVyZSB0byBwdXNoXCIpO1xuICAgICAgICAvLyAgICAgaWYoIWNvbnRhaW5zKXtcbiAgICAgICAgLy8gICAgICAgICBDb25jZXB0TGlzdC5wdXNoKGRiQ29uY2VwdExpc3RbaV0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgY29uY2VwdCBsaXN0XCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhDb25jZXB0TGlzdCk7XG4gICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgIENvbmNlcHRMaXN0ID0geWllbGQgQmluYXJ5VHlwZVRyZWUuZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRCaW5hcnlDaGFyYWN0ZXJUcmVlKCkge1xuICAgICAgICByZXR1cm4gQmluYXJ5Q2hhcmFjdGVyVHJlZS5jaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cbn1cbkNvbmNlcHRzRGF0YS5jb25jZXB0c0FycmF5ID0gW107XG5Db25jZXB0c0RhdGEuTlBDID0gW107XG5Db25jZXB0c0RhdGEuY29uY2VwdERpY3Rpb25hcnkgPSBbXTtcbiIsImltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoaWQgPSAwLCBvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgb3JkZXJJZCwgb3JkZXJVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9VcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50eXBlID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm9mVGhlQ29uY2VwdElkID0gb2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgIHRoaXMudG9UaGVDb25jZXB0SWQgPSB0b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy5PZlRoZUNvbmNlcHRVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHRoaXMuVG9UaGVDb25jZXB0VXNlcklkID0gdG9UaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy50eXBlSWQgPSB0eXBlSWQ7XG4gICAgICAgIHRoaXMuZ2hvc3RJZCA9IGlkO1xuICAgICAgICB0aGlzLnR5cGVVc2VySWQgPSB0eXBlVXNlcklkO1xuICAgICAgICB0aGlzLm9yZGVySWQgPSBvcmRlcklkO1xuICAgICAgICB0aGlzLm9yZGVyVXNlcklkID0gb3JkZXJVc2VySWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudGVybWluYXRpb25EYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTeW5jVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm9kZSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9ucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbnJvb3QgPSB0aGlzLmNvbm5lY3Rpb25yb290LmFkZE5vZGUobm9kZSwgdGhpcy5jb25uZWN0aW9ucm9vdCwgdGhpcy5jb25uZWN0aW9ucm9vdC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgQ29ubmVjdGlvbk5vZGUoY29ubmVjdGlvbi5pZCwgY29ubmVjdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KENvbm5lY3Rpb25CaW5hcnlUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25yb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9ucm9vdCA9IHRoaXMuY29ubmVjdGlvbnJvb3QucmVtb3ZlTm9kZSh0aGlzLmNvbm5lY3Rpb25yb290LCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY29ubmVjdGlvbnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMuY29ubmVjdGlvbnJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkNvbm5lY3Rpb25CaW5hcnlUcmVlLmNvbm5lY3Rpb25yb290ID0gbnVsbDtcbiIsImV4cG9ydCBjbGFzcyBDb25uZWN0aW9uTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLnZhcmlhbnRzID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5sZWZ0Tm9kZSA9IGxlZnROb2RlO1xuICAgICAgICB0aGlzLnJpZ2h0Tm9kZSA9IHJpZ2h0Tm9kZTtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS50eXBlSWQgIT0gbm9kZS52YWx1ZS50eXBlSWQpIHtcbiAgICAgICAgICAgIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBub2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCA9PSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIG5vZGUudmFyaWFudHMucHVzaChwYXNzZWROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvL25vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5IDwgcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiKXtcbiAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmlnaHRSb3RhdGUoeSkge1xuICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgbGV0IHggPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgbGV0IHkgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0geDtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXR1cm4geTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0QmFsYW5jZUZhY3RvcihOKSB7XG4gICAgICAgIGlmIChOID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhlaWdodChOLmxlZnROb2RlKSAtIHRoaXMuZ2V0SGVpZ2h0KE4ucmlnaHROb2RlKTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGUoaWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZihwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApe1xuICAgICAgICAvLyAgICAgaWYocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBpZCApe1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAvLyAgICAgaWYobmV3Tm9kZSl7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLmxlZnROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vY29uZGl0aW9uIGlmIHRoZSBtYWluIG5vZGUgaXMgZXF1YWwgdG8gdGhlIHZhbHVlXG4gICAgICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBjb25jZXB0SWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBtYWluIG5vZGUgaXMgbm90IGVxdWFsIHRvIHRoZSBjaGVja2luZyB2YWx1ZSBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRJZCA9PSBwYXNzZWROb2RlLnZhcmlhbnRzW2ldLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXksIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbk9yZGVyU3VjY2Vzc29yKHJvb3QpIHtcbiAgICAgICAgd2hpbGUgKHJvb3QubGVmdE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdCA9IHJvb3QubGVmdE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm9kZSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblR5cGVUcmVlIHtcbiAgICBzdGF0aWMgYWRkTm9kZVRvVHJlZShub2RlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uVHlwZVJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVHlwZVJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCA9IHRoaXMuY29ubmVjdGlvblR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMuY29ubmVjdGlvblR5cGVSb290LCB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChDb25uZWN0aW9uVHlwZVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbikge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgQ29ubmVjdGlvbk5vZGUoY29ubmVjdGlvbi50eXBlSWQsIGNvbm5lY3Rpb24sIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVUeXBlQ29uY2VwdCh0eXBlSWQsIGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QgPSB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHRoaXMuY29ubmVjdGlvblR5cGVSb290LCB0eXBlSWQsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWUodHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE5vZGUudmFsdWUudXNlcklkID09IHVzZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoTm9kZS52YXJpYW50c1tpXS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Db25uZWN0aW9uVHlwZVRyZWUuY29ubmVjdGlvblR5cGVSb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgcmVtb3ZlRnJvbURhdGFiYXNlLCBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4vQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkJpbmFyeVRyZWUgfSBmcm9tIFwiLi9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvblR5cGVUcmVlIH0gZnJvbSBcIi4vQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvblR5cGVUcmVlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkRhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNvbm5lY3Rpb24gQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvblRvU3RvcmFnZShjb25uZWN0aW9uKSB7XG4gICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImNvbm5lY3Rpb25cIiwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgLy8gICAgdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbm5lY3Rpb24pO1xuICAgICAgICAvLyAgICAgaWYoY29udGFpbnMpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuUmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGlmKGNvbm5lY3Rpb24uaWQgIT0gMCB8fCBjb25uZWN0aW9uLmlzVGVtcCl7XG4gICAgICAgIC8vICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29ubmVjdGlvblwiLGNvbm5lY3Rpb24pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdGhpcy5jb25uZWN0aW9uQXJyYXkucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLmFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBDb25uZWN0aW9uVHlwZVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvblRvTWVtb3J5KGNvbm5lY3Rpb24pIHtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgQ29ubmVjdGlvbkJpbmFyeVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5hZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRUb0RpY3Rpb25hcnkoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25EaWN0aW9uYXJ5W2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICAvLyAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIC8vICAgICBpZih0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBjb25uZWN0aW9uLmlkKXtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbm5lY3Rpb25BcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgIT0gMCkge1xuICAgICAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZShjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5yZW1vdmVUeXBlQ29uY2VwdChjb25uZWN0aW9uLnR5cGVJZCwgY29ubmVjdGlvbi5pZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25UcmVlKCkge1xuICAgICAgICByZXR1cm4gQ29ubmVjdGlvbkJpbmFyeVRyZWUuY29ubmVjdGlvbnJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uVHlwZVRyZWUoKSB7XG4gICAgICAgIHJldHVybiBDb25uZWN0aW9uVHlwZVRyZWUuY29ubmVjdGlvblR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgLy8gICAgdmFyICBteUNvbmNlcHQ6IENvbm5lY3Rpb258bnVsbDtcbiAgICAgICAgICAgIC8vICAgIG15Q29uY2VwdCA9IG51bGw7XG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBpPTA7IGk8dGhpcy5jb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBpZCl7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBteUNvbmNlcHQgPSB0aGlzLmNvbm5lY3Rpb25BcnJheVtpXTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbXlDb25jZXB0O1xuICAgICAgICAgICAgdmFyIG15Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB5aWVsZCBDb25uZWN0aW9uQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbmNlcHQgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlDb25uZWN0aW9uID0gcmV0dXJuZWRDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmKG15Q29uY2VwdC5pZCA9PSAwIHx8IG15Q29uY2VwdCA9PSBudWxsKXtcbiAgICAgICAgICAgIC8vICAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNvbmNlcHRzQXJyYXlbaV0uaWQgPT0gaWQpe1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgbXlDb25jZXB0ID0gdGhpcy5jb25jZXB0c0FycmF5W2ldO1xuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIG15Q29ubmVjdGlvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gW107XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHlpZWxkIENvbm5lY3Rpb25UeXBlVHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbm5lY3Rpb24gPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15Q29ubmVjdGlvbiA9IHJldHVybmVkQ29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChteUNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2gobm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZihteUNvbmNlcHQuaWQgPT0gMCB8fCBteUNvbmNlcHQgPT0gbnVsbCl7XG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBpPTA7IGk8dGhpcy5jb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYodGhpcy5jb25jZXB0c0FycmF5W2ldLmlkID09IGlkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG15Q29uY2VwdCA9IHRoaXMuY29uY2VwdHNBcnJheVtpXTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxufVxuQ29ubmVjdGlvbkRhdGEuY29ubmVjdGlvbkFycmF5ID0gW107XG5Db25uZWN0aW9uRGF0YS5jb25uZWN0aW9uRGljdGlvbmFyeSA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIEZpbHRlclNlYXJjaCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dpY29wZXJhdG9yID0gXCI9XCI7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uID0gdHJ1ZTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgSWRlbnRpZmllckZsYWdzIHtcbn1cbklkZW50aWZpZXJGbGFncy5pc1R5cGVMb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0NoYXJhY3RlckxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzRGF0YUxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzTG9jYWxEYXRhTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENoYXJhY3RlckxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzTG9jYWxUeXBlTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uVHlwZUxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDb25uZWN0aW9uTG9hZGVkID0gZmFsc2U7XG4iLCJleHBvcnQgY2xhc3MgTENvbmNlcHQge1xuICAgIGNvbnN0cnVjdG9yKGlkLCB1c2VySWQsIHR5cGVJZCwgY2F0ZWdvcnlJZCwgYWNjZXNzSWQsIGNoYXJhY3RlclZhbHVlLCB0eXBlQ2hhcmFjdGVyLCBpc05ldyA9IGZhbHNlLCBlbnRyeVRpbWVTdGFtcCwgdXBkYXRlZFRpbWVTdGFtcCwgcmVmZXJlbnRJZCkge1xuICAgICAgICB0aGlzLnN0cnVjdHVyZVR5cGUgPSBcImxjb25jZXB0XCI7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU3luY2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHRoaXMudHlwZUlkID0gdHlwZUlkO1xuICAgICAgICB0aGlzLmdob3N0SWQgPSBpZDtcbiAgICAgICAgdGhpcy5jYXRlZ29yeUlkID0gY2F0ZWdvcnlJZDtcbiAgICAgICAgdGhpcy5jaGFyYWN0ZXJWYWx1ZSA9IGNoYXJhY3RlclZhbHVlO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMudHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldztcbiAgICAgICAgdGhpcy50eXBlQ2hhcmFjdGVyID0gdHlwZUNoYXJhY3RlcjtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IGVudHJ5VGltZVN0YW1wO1xuICAgICAgICB0aGlzLnVwZGF0ZWRUaW1lU3RhbXAgPSB1cGRhdGVkVGltZVN0YW1wO1xuICAgICAgICB0aGlzLmlzU3luY2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVmZXJlbnRJZCA9IHJlZmVyZW50SWQ7XG4gICAgICAgIC8vIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHRoaXMpO1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnR5cGVJZCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdFwiO1xuZXhwb3J0IGNsYXNzIExDb25uZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQsIGFjY2Vzc0lkKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHlwZSA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMub2ZUaGVDb25jZXB0SWQgPSBvZlRoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy50b1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMub3JkZXJJZCA9IG9yZGVySWQ7XG4gICAgICAgIHRoaXMudHlwZUNoYXJhY3RlciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWNjZXNzSWQgPSBhY2Nlc3NJZDtcbiAgICAgICAgdGhpcy50eXBlQ2hhcmFjdGVyID0gXCJcIjtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudGVybWluYXRpb25EYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTeW5jVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIExOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKSB7XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLnR5cGVJZCAhPSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQgPT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICBub2RlLnZhcmlhbnRzLnB1c2gocGFzc2VkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiApe1xuICAgICAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsXCIpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJsZWZ0ICBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIpe1xuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVsc2UgaGVyZVwiLCBub2RlLCBwYXNzZWROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIgJiYgbm9kZS52YWx1ZS5pZCAhPSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZWlnaHQgaGVyZVwiLCBub2RlLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFsYW5jaW5nRmFjdG9yIGhlcmVcIiwgYmFsYW5jaW5nRmFjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAxIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAyIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAzIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZTQgXCIsIHJldHVybmVyLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIndoYXQgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDZcIiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJpZ2h0Um90YXRlKHkpIHtcbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIGxldCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0geTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh5LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgICBsZWZ0Um90YXRlKHgpIHtcbiAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgIGxldCB5ID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB1cGRhdGVOb2RlU3luY1N0YXR1cyhpZCwgdmFsdWUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGxldCBsY29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgbGNvbmNlcHQuaXNTeW5jZWQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlTm9kZVN5bmNTdGF0dXMoaWQsIHZhbHVlLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVOb2RlU3luY1N0YXR1cyhpZCwgdmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlKSB7XG4gICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlICYmIHR5cGVJZCA9PSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUudHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnZhcmlhbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIG5vZGUpIHtcbiAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgJiYgY2F0ZWdvcnlJZCA9PSBub2RlLnZhbHVlLmNhdGVnb3J5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnZhcmlhbnRzW2ldLnZhbHVlLmNhdGVnb3J5SWQgPT0gY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnZhcmlhbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZENhdGVnb3J5KHZhbHVlLCBjYXRlZ29yeUlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJlbW92ZU5vZGUocGFzc2VkTm9kZSwgaWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoID4gMCl7XG4gICAgICAgIC8vICAgICBpZihwYXNzZWROb2RlLnZhbHVlLmlkID09IGlkICl7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgIC8vICAgICBpZihuZXdOb2RlKXtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gbmV3Tm9kZS52YWx1ZTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmtleSA9IG5ld05vZGUua2V5O1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IHR5cGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUubGVmdE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy9jb25kaXRpb24gaWYgdGhlIG1haW4gbm9kZSBpcyBlcXVhbCB0byB0aGUgdmFsdWVcbiAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLmlkID09IGNvbmNlcHRJZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdOb2RlID0gcGFzc2VkTm9kZS52YXJpYW50c1swXTtcbiAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gbmV3Tm9kZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IG5ld05vZGUuY3VycmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMuc3BsaWNlKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIG1haW4gbm9kZSBpcyBub3QgZXF1YWwgdG8gdGhlIGNoZWNraW5nIHZhbHVlIFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VwdElkID09IHBhc3NlZE5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cyA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YXJpYW50cztcbiAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBpbW1lZGlhdGVTdWNjZXNzb3IuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvdW50Tm9kZUJlbG93KHJvb3QpIHtcbiAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWN1cnNpdmUgY2FsbCB0byBsZWZ0IGNoaWxkIGFuZCByaWdodCBjaGlsZCBhbmRcbiAgICAgICAgLy8gYWRkIHRoZSByZXN1bHQgb2YgdGhlc2Ugd2l0aCAxICggMSBmb3IgY291bnRpbmcgdGhlIHJvb3QpXG4gICAgICAgIHJldHVybiAxICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LmxlZnROb2RlKSArIHRoaXMuY291bnROb2RlQmVsb3cocm9vdC5yaWdodE5vZGUpO1xuICAgIH1cbiAgICBpbk9yZGVyU3VjY2Vzc29yKHJvb3QpIHtcbiAgICAgICAgd2hpbGUgKHJvb3QubGVmdE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdCA9IHJvb3QubGVmdE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi8uLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeUNoYXJhY3RlclRyZWUge1xuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDaGFyYWN0ZXJMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QgPSBub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290ID0gdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QuYWRkQ2hhcmFjdGVyTm9kZShub2RlLCB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICB9XG4gICAgc3RhdGljIGdldENoYXJhY3RlckFuZFR5cGVGcm9tVHJlZSh2YWx1ZSwgdHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRDYXRlZ29yeUZyb21UcmVlKHZhbHVlLCBjYXRlZ29yeUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRUeXBlKGNoYXJhY3RlciwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5Mb2NhbENoYXJhY3RlclJvb3QsIGNoYXJhY3RlciwgaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdmFyIGNoYXJhY3Rlck5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUodmFsdWUsIHR5cGVJZCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgIH1cbiAgICBzdGF0aWMgdXBkYXRlU3luY1N0YXR1cyhpZCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC51cGRhdGVOb2RlU3luY1N0YXR1cyhpZCwgdHJ1ZSwgdGhpcy5yb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuTG9jYWxCaW5hcnlUcmVlLnJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi8uLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeVR5cGVUcmVlIHtcbiAgICBzdGF0aWMgYWRkTm9kZVRvVHJlZShub2RlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5Mb2NhbFR5cGVSb290ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkxvY2FsVHlwZVJvb3QgPSBub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsVHlwZVJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLkxvY2FsVHlwZVJvb3QgPSB0aGlzLkxvY2FsVHlwZVJvb3QuYWRkVHlwZU5vZGUobm9kZSwgdGhpcy5Mb2NhbFR5cGVSb290LCB0aGlzLkxvY2FsVHlwZVJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxvY2FsVHlwZVJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LnR5cGVJZCAhPSAwKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LnR5cGVJZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRUeXBlKHR5cGVJZCwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTG9jYWxUeXBlUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5Mb2NhbFR5cGVSb290ID0gdGhpcy5Mb2NhbFR5cGVSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5Mb2NhbFR5cGVSb290LCB0eXBlSWQsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLkxvY2FsVHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5Mb2NhbFR5cGVSb290LmdldEZyb21Ob2RlKGlkLCB0aGlzLkxvY2FsVHlwZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxUeXBlUm9vdDtcbiAgICB9XG4gICAgc3RhdGljIGdldFR5cGVWYXJpYW50c0Zyb21UcmVlKHR5cGVJZCkge1xuICAgICAgICB2YXIgTm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21UcmVlKHR5cGVJZCk7XG4gICAgICAgIHZhciBjb25jZXB0cyA9IFtdO1xuICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlID09PSBudWxsIHx8IE5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IE5vZGUudmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0xvY2FsVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChMb2NhbEJpbmFyeVR5cGVUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21UcmVlKHR5cGVJZCk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgbm9kZSB0byB0eXBlXCIsIE5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQgfHwgTm9kZS52YWx1ZS51c2VySWQgPT0gOTk5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQgfHwgTm9kZS52YWx1ZS51c2VySWQgPT0gOTk5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Mb2NhbEJpbmFyeVR5cGVUcmVlLkxvY2FsVHlwZVJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyByZW1vdmVGcm9tRGF0YWJhc2UsIHN0b3JlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9pbmRleGRibG9jYWxcIjtcbmltcG9ydCB7IExvY2FsQmluYXJ5VHJlZSB9IGZyb20gXCIuL0xvY2FsQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBMb2NhbEJpbmFyeVR5cGVUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlUeXBlVHJlZVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdFwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBDb252ZXJ0RnJvbUxDb25jZXB0VG9Db25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHRcIjtcbmltcG9ydCB7IExvY2FsR2hvc3RJZFRyZWUgfSBmcm9tIFwiLi9Mb2NhbEdob3N0SWRUcmVlXCI7XG5leHBvcnQgY2xhc3MgTG9jYWxDb25jZXB0c0RhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcImNvbmNlcHRzQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgdGhpcy5sb2NhbGNvbmNlcHRzQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkUGVybWFuZW50Q29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5VHJlZS5yZW1vdmVOb2RlRnJvbVRyZWUoY29uY2VwdC5naG9zdElkKTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5yZW1vdmVDb25jZXB0VHlwZShjb25jZXB0LmNoYXJhY3RlclZhbHVlLCBjb25jZXB0Lmdob3N0SWQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5yZW1vdmVDb25jZXB0VHlwZShjb25jZXB0LnR5cGVJZCwgY29uY2VwdC5naG9zdElkKTtcbiAgICAgICAgICAgIExvY2FsR2hvc3RJZFRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIHJlbW92ZUZyb21EYXRhYmFzZShcImxvY2FsY29uY2VwdFwiLCBjb25jZXB0Lmdob3N0SWQpO1xuICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoQ29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdChjb25jZXB0KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHRUb01lbW9yeShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5VHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVR5cGVUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHQoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBteUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIHZhciBub2RlID0geWllbGQgTG9jYWxCaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICBteUNvbmNlcHQgPSByZXR1cm5lZENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG15Q29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBVcGRhdGVDb25jZXB0U3luY1N0YXR1cyhpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUcmVlLnVwZGF0ZVN5bmNTdGF0dXMoaWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUdob3N0SWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBteUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIHZhciBub2RlID0geWllbGQgTG9jYWxHaG9zdElkVHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbmNlcHQgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlDb25jZXB0ID0gcmV0dXJuZWRDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgIH1cbiAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXROb2RlRnJvbVRyZWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJfdmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIC8vIGxldCBjb25jZXB0TGlzdDpDb25jZXB0W10gPSBhd2FpdCB0aGlzLkdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKTtcbiAgICAgICAgICAgIC8vIGZvcih2YXIgaT0wO2k8Y29uY2VwdExpc3QubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgIGlmKGNoYXJhY3Rlcl92YWx1ZSA9PSBjb25jZXB0TGlzdFtpXS5jaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHlpZWxkIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLCB0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5TG9jYWwoY2hhcmFjdGVyX3ZhbHVlLCBjYXRlZ29yeUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB5aWVsZCBMb2NhbEJpbmFyeUNoYXJhY3RlclRyZWUuZ2V0Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tVHJlZShjaGFyYWN0ZXJfdmFsdWUsIGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKSB7XG4gICAgICAgIHZhciBteUNvbmNlcHQ7XG4gICAgICAgIGxldCBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubG9jYWxjb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0udHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgbXlDb25jZXB0O1xuICAgICAgICAgICAgbGV0IENvbmNlcHRMaXN0ID0gW107XG4gICAgICAgICAgICAvLyBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS50eXBlSWQgPT0gdHlwZUlkICYmIHRoaXMuY29uY2VwdHNBcnJheVtpXS51c2VySWQgPT0gdXNlcklkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5jb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgIC8vICAgICAgfVxuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIENvbmNlcHRMaXN0ID0geWllbGQgTG9jYWxCaW5hcnlUeXBlVHJlZS5nZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpO1xuICAgICAgICAgICAgcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG5Mb2NhbENvbmNlcHRzRGF0YS5sb2NhbGNvbmNlcHRzQXJyYXkgPSBbXTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL2luZGV4ZGJsb2NhbFwiO1xuaW1wb3J0IHsgcmVtb3ZlRnJvbURhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL2luZGV4ZGJsb2NhbFwiO1xuaW1wb3J0IHsgQ29udmVydEZyb21MQ29ubmVjdGlvblRvQ29ubmVjdGlvbiB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9Mb2NhbC9Db252ZXJ0RnJvbUxDb25uZWN0aW9uVG9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9Db25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4uL0lkZW50aWZpZXJGbGFnc1wiO1xuZXhwb3J0IGNsYXNzIExvY2FsQ29ubmVjdGlvbkRhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNvbm5lY3Rpb24gQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IHRoaXMuQ2hlY2tDb250YWlucyhjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgIT0gMCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRUb0RpY3Rpb25hcnkoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25EaWN0aW9uYXJ5W2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCAhPSAwKSB7XG4gICAgICAgICAgICAvLyAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRQZXJtYW5lbnRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgPiAwKSB7XG4gICAgICAgICAgICByZW1vdmVGcm9tRGF0YWJhc2UoXCJsb2NhbGNvbm5lY3Rpb25cIiwgY29ubmVjdGlvbi5naG9zdElkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24oQ29udmVydEZyb21MQ29ubmVjdGlvblRvQ29ubmVjdGlvbihjb25uZWN0aW9uKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb24oaWQpIHtcbiAgICAgICAgdmFyIG15Q29uY2VwdDtcbiAgICAgICAgbXlDb25jZXB0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgbXlDb25jZXB0ID0gdGhpcy5jb25uZWN0aW9uQXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15Q29uY2VwdDtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENvbm5lY3Rpb25Mb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxDb25uZWN0aW9uRGF0YS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS50eXBlSWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2godGhpcy5jb25uZWN0aW9uQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbk9mQ29tcG9zaXRpb25BbmRUeXBlTG9jYWwodHlwZUlkLCBvZlRoZUNvbmNlcHRJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgY29ubmVjdGlvbnNcIiwgdGhpcy5jb25uZWN0aW9uQXJyYXksIHR5cGVJZCwgb2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLnR5cGVJZCA9PSB0eXBlSWQgJiYgdGhpcy5jb25uZWN0aW9uQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQgPT0gb2ZUaGVDb25jZXB0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2godGhpcy5jb25uZWN0aW9uQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cbn1cbkxvY2FsQ29ubmVjdGlvbkRhdGEuY29ubmVjdGlvbkFycmF5ID0gW107XG5Mb2NhbENvbm5lY3Rpb25EYXRhLmNvbm5lY3Rpb25EaWN0aW9uYXJ5ID0gW107XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEdob3N0SWRUcmVlIHtcbiAgICBzdGF0aWMgYWRkTm9kZVRvVHJlZShub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gbm9kZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QuYWRkTm9kZShub2RlLCB0aGlzLnJvb3QsIHRoaXMucm9vdC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5naG9zdElkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0xvY2FsRGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChMb2NhbEdob3N0SWRUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuTG9jYWxHaG9zdElkVHJlZS5yb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlVGhlR2hvc3RDb25jZXB0QXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlR2hvc3RDb25jZXB0QXBpXCI7XG5pbXBvcnQgeyBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vLi4vRGF0YWJhc2UvaW5kZXhkYmxvY2FsXCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi9Mb2NhbENvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgY2xhc3MgTG9jYWxTeW5jRGF0YSB7XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29uY2VwdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIFN5bmNEYXRhRGVsZXRlKGlkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlkID09IHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS5vZlRoZUNvbmNlcHRJZCA9PSBpZCB8fCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQgPT0gaWQgfHwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLnR5cGVJZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnNDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGxldCBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBsZXQgZXhpc3RpbmdDb25jZXB0ID0gTG9jYWxTeW5jRGF0YS5DaGVja0lmVGhlQ29uY2VwdElkRXhpc3RzKGNvbmNlcHQuaWQsIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5LnB1c2goY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldLmlkID09IGNvbmNlcHQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgU3luY0RhdGFPbmxpbmUoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgY29uY2VwdHNBcnJheSA9IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgIGxldCB0b1N5bmNDb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy9pZighY29uY2VwdHNBcnJheVtpXS5pc1N5bmNlZCl7XG4gICAgICAgICAgICAgICAgdG9TeW5jQ29uY2VwdHMucHVzaChjb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWQgdG8gZGVub3RlIHRoYXQgdGhlIGxvY2FsIGNvbmNlcHQgaGFzIGFscmVhZHkgYmVlbiBzeW5jZWQgd2l0aCB0aGUgb25saW5lIGRiXG4gICAgICAgICAgICAgICAgeWllbGQgTG9jYWxDb25jZXB0c0RhdGEuVXBkYXRlQ29uY2VwdFN5bmNTdGF0dXMoY29uY2VwdHNBcnJheVtpXS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbnNBcnJheSA9IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zbGljZSgpO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICAvL2lmKGNvbm5lY3Rpb25zQXJyYXkubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLlVwZGF0ZUNvbmNlcHRMaXN0VG9JbmNsdWRlUmVsYXRlZENvbmNlcHRzKGNvbm5lY3Rpb25zQXJyYXksIHRvU3luY0NvbmNlcHRzKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCBDcmVhdGVUaGVHaG9zdENvbmNlcHRBcGkodG9TeW5jQ29uY2VwdHMsIGNvbm5lY3Rpb25zQXJyYXkpO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHRzID0gcmVzdWx0LmNvbmNlcHRzO1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0gcmVzdWx0LmNvbm5lY3Rpb25zO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZFBlcm1hbmVudENvbmNlcHQoY29uY2VwdHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIExvY2FsQ29ubmVjdGlvbkRhdGEuQWRkUGVybWFuZW50Q29ubmVjdGlvbihjb25uZWN0aW9uc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL31cbiAgICAgICAgICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vICBzdGF0aWMgYXN5bmMgIFN5bmNEYXRhT25saW5lKCl7XG4gICAgLy8gICAgIGlmKHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoID4gMCl7XG4gICAgLy8gICAgICAgICBsZXQgY29uY2VwdHNBcnJheSA9IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAvLyAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcbiAgICAvLyAgICAgICAgIGxldCBjb25jZXB0cyA9IGF3YWl0IENyZWF0ZVRoZUdob3N0Q29uY2VwdEFwaShjb25jZXB0c0FycmF5KTtcbiAgICAvLyAgICAgICAgIGZvcihsZXQgaSA9MCA7IGk8IGNvbmNlcHRzLmxlbmd0aDsgaSsrKXtcbiAgICAvLyAgICAgICAgICAgICBMb2NhbFN5bmNEYXRhLmdob3N0SWRNYXAuc2V0KGNvbmNlcHRzW2ldLmdob3N0SWQsY29uY2VwdHNbaV0uaWQpO1xuICAgIC8vICAgICAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZFBlcm1hbmVudENvbmNlcHQoY29uY2VwdHNbaV0pO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgICBpZih0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCl7XG4gICAgLy8gICAgICAgICAvLyBmb3IobGV0IGkgPTAgOyBpPHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGggOyBpKyspe1xuICAgIC8vICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHRoZSBjb25uZWN0aW9uIGluIGJhY2tlbmRcIiwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLm9mVGhlQ29uY2VwdElkICsgXCI9PT09XCIgKyB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgIC8vICAgICAgICAgLy8gfVxuICAgIC8vICAgICAgICAgbGV0IGNvbm5lY3Rpb25zQXJyYXkgPSB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAvLyAgICAgICAgIHRoaXMuQ29udmVydEdob3N0SWRzSW5Db25uZWN0aW9ucyhjb25uZWN0aW9uc0FycmF5KTtcbiAgICAvLyAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgIC8vICAgICAgICAgYXdhaXQgQ3JlYXRlVGhlR2hvc3RDb25uZWN0aW9uQXBpKGNvbm5lY3Rpb25zQXJyYXkpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAvLyAgfVxuICAgIHN0YXRpYyBDb252ZXJ0R2hvc3RJZHNJbkNvbm5lY3Rpb25zKGNvbm5lY3Rpb25BcnJheSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvZlRoZUNvbmNlcHRJZCA9IGNvbm5lY3Rpb25BcnJheVtpXS5vZlRoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgIGxldCB0b1RoZUNvbmNlcHRJZCA9IGNvbm5lY3Rpb25BcnJheVtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgIGxldCB0eXBlSWQgPSBjb25uZWN0aW9uQXJyYXlbaV0udHlwZUlkO1xuICAgICAgICAgICAgbGV0IG5ld09mVGhlQ29uY2VwdElkID0gKF9hID0gTG9jYWxTeW5jRGF0YS5naG9zdElkTWFwLmdldChvZlRoZUNvbmNlcHRJZCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG9mVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgbGV0IG5ld1RvVGhlQ29uY2VwdElkID0gKF9iID0gTG9jYWxTeW5jRGF0YS5naG9zdElkTWFwLmdldCh0b1RoZUNvbmNlcHRJZCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgbGV0IG5ld1R5cGVJZCA9IChfYyA9IExvY2FsU3luY0RhdGEuZ2hvc3RJZE1hcC5nZXQodHlwZUlkKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdHlwZUlkO1xuICAgICAgICAgICAgY29ubmVjdGlvbkFycmF5W2ldLm9mVGhlQ29uY2VwdElkID0gbmV3T2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICBjb25uZWN0aW9uQXJyYXlbaV0udG9UaGVDb25jZXB0SWQgPSBuZXdUb1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS50eXBlSWQgPSBuZXdUeXBlSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFVwZGF0ZUNvbmNlcHRMaXN0VG9JbmNsdWRlUmVsYXRlZENvbmNlcHRzKGNvbm5lY3Rpb25BcnJheSwgY29uY2VwdHNBcnJheSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb2ZUaGVDb25jZXB0SWQgPSBjb25uZWN0aW9uQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvVGhlQ29uY2VwdElkID0gY29ubmVjdGlvbkFycmF5W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlSWQgPSBjb25uZWN0aW9uQXJyYXlbaV0udHlwZUlkO1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mVGhlQ29uY2VwdCA9IHRoaXMuQ2hlY2tJZlRoZUNvbmNlcHRJZEV4aXN0cyhvZlRoZUNvbmNlcHRJZCwgY29uY2VwdHNBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZUaGVDb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5R2hvc3RJZChvZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0LmlkICE9IG9mVGhlQ29uY2VwdC5naG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS5vZlRoZUNvbmNlcHRJZCA9IG9mVGhlQ29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZlRoZUNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KG9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gc3luY2VkIGJlZm9yZSBhbmQgaXMgYSBjb21wb3NpdGlvbiB0eXBlIHRoZW4gZG8gbm90IHNlbmQgaXQgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9mVGhlQ29uY2VwdC5pc1N5bmNlZCAmJiAhb2ZUaGVDb25jZXB0LmlzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHNBcnJheS5wdXNoKG9mVGhlQ29uY2VwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b1RoZUNvbmNlcHRJZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvVGhlQ29uY2VwdCA9IHRoaXMuQ2hlY2tJZlRoZUNvbmNlcHRJZEV4aXN0cyh0b1RoZUNvbmNlcHRJZCwgY29uY2VwdHNBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b1RoZUNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9UaGVDb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5R2hvc3RJZCh0b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9UaGVDb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9UaGVDb25jZXB0LmlkICE9IHRvVGhlQ29uY2VwdC5naG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS50b1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1RoZUNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gc3luY2VkIGJlZm9yZSBhbmQgaXMgYSBjb21wb3NpdGlvbiB0eXBlIHRoZW4gZG8gbm90IHNlbmQgaXQgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvVGhlQ29uY2VwdC5pc1N5bmNlZCAmJiAhdG9UaGVDb25jZXB0LmlzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHNBcnJheS5wdXNoKHRvVGhlQ29uY2VwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlSWQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5DaGVja0lmVGhlQ29uY2VwdElkRXhpc3RzKHR5cGVJZCwgY29uY2VwdHNBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlkID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlHaG9zdElkKHR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuaWQgIT0gdHlwZS5naG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BcnJheVtpXS50eXBlSWQgPSB0eXBlLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIHN5bmNlZCBiZWZvcmUgYW5kIGlzIGEgY29tcG9zaXRpb24gdHlwZSB0aGVuIGRvIG5vdCBzZW5kIGl0IGFnYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzU3luY2VkICYmICF0eXBlLmlzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHNBcnJheS5wdXNoKHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBDaGVja0lmVGhlQ29uY2VwdElkRXhpc3RzKGlkLCBjb25jZXB0TGlzdCA9IFtdKSB7XG4gICAgICAgIGxldCByZXR1cm5Db25jZXB0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBjb25jZXB0TGlzdFtpXS5naG9zdElkIHx8IGlkID09IGNvbmNlcHRMaXN0W2ldLmlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuQ29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXR1cm5Db25jZXB0O1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5wdXNoKGNvbm5lY3Rpb24pO1xuICAgIH1cbiAgICBzdGF0aWMgUmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBzeW5jRGF0YUxvY2FsRGIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImxvY2FsY29uY2VwdFwiLCB0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiZG9uZVwiO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Mb2NhbFN5bmNEYXRhLmNvbmNlcHRzU3luY0FycmF5ID0gW107XG5Mb2NhbFN5bmNEYXRhLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbkxvY2FsU3luY0RhdGEuZ2hvc3RJZE1hcCA9IG5ldyBNYXAoKTtcbiIsImV4cG9ydCBjbGFzcyBOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKSB7XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLnR5cGVJZCAhPSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQgPT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICBub2RlLnZhcmlhbnRzLnB1c2gocGFzc2VkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiApe1xuICAgICAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsXCIpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJsZWZ0ICBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIpe1xuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVsc2UgaGVyZVwiLCBub2RlLCBwYXNzZWROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIgJiYgbm9kZS52YWx1ZS5pZCAhPSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZWlnaHQgaGVyZVwiLCBub2RlLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFsYW5jaW5nRmFjdG9yIGhlcmVcIiwgYmFsYW5jaW5nRmFjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAxIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAyIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAzIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZTQgXCIsIHJldHVybmVyLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIndoYXQgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDZcIiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJpZ2h0Um90YXRlKHkpIHtcbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIGxldCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0geTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh5LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgICBsZWZ0Um90YXRlKHgpIHtcbiAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgIGxldCB5ID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0Q2hhcmFjdGVyRnJvbU5vZGVVcGRhdGVkKHZhbHVlLCBub2RlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSB8fCAoKF9hID0gbm9kZS52YWx1ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnR5cGVJZCkgPT0gNTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUpIHtcbiAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgJiYgdHlwZUlkID09IG5vZGUudmFsdWUudHlwZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS50eXBlSWQgPT0gdHlwZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFyaWFudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgbm9kZSkge1xuICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSAmJiBjYXRlZ29yeUlkID09IG5vZGUudmFsdWUuY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuY2F0ZWdvcnlJZCA9PSBjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFyaWFudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZENhdGVnb3J5KHZhbHVlLCBjYXRlZ29yeUlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKXtcbiAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gaWQgKXtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHZhciBuZXdOb2RlID0gcGFzc2VkTm9kZS52YXJpYW50c1swXTtcbiAgICAgICAgLy8gICAgIGlmKG5ld05vZGUpe1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IG5ld05vZGUuY3VycmVudE5vZGU7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cyA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YXJpYW50cztcbiAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBpbW1lZGlhdGVTdWNjZXNzb3IuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IHR5cGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL2NvbmRpdGlvbiBpZiB0aGUgbWFpbiBub2RlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gY29uY2VwdElkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IG5ld05vZGUua2V5O1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb25kaXRpb24gdGhhdCB0aGUgbWFpbiBub2RlIGlzIG5vdCBlcXVhbCB0byB0aGUgY2hlY2tpbmcgdmFsdWUgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXB0SWQgPT0gcGFzc2VkTm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5LCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUGF0Y2hlclN0cnVjdHVyZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25JZCA9IDA7XG4gICAgICAgIHRoaXMudXNlcklkID0gOTk5O1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IDk5OTtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHRoaXMub2ZUaGVDb21wb3NpdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy5wYXRjaE9iamVjdCA9IHt9O1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRzIH0gZnJvbSBcIi4uL0FwaS9HZXRSZXNlcnZlZENvbm5lY3Rpb25JZHNcIjtcbmltcG9ydCB7IEdldFJlc2VydmVkSWRzIH0gZnJvbSBcIi4uL0FwaS9HZXRSZXNlcnZlZElkc1wiO1xuZXhwb3J0IGNsYXNzIFJlc2VydmVkSWRzIHtcbiAgICBzdGF0aWMgZ2V0SWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZHMubGVuZ3RoIDwgNSkge1xuICAgICAgICAgICAgICAgIHZhciBpZHMgPSB5aWVsZCBHZXRSZXNlcnZlZElkcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5pZHNbMF07XG4gICAgICAgICAgICB0aGlzLmlkcy5zaGlmdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEFkZElkKGlkKSB7XG4gICAgICAgIGlmICghdGhpcy5pZHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmlkcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblJlc2VydmVkSWRzLmlkcyA9IFtdO1xuZXhwb3J0IGNsYXNzIFJlc2VydmVkQ29ubmVjdGlvbklkcyB7XG4gICAgc3RhdGljIGdldElkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbklkcy5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25JZHMgPSB5aWVsZCBHZXRSZXNlcnZlZENvbm5lY3Rpb25JZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuY29ubmVjdGlvbklkc1swXTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkcy5zaGlmdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEFkZElkKGlkKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uSWRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uSWRzLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuUmVzZXJ2ZWRDb25uZWN0aW9uSWRzLmNvbm5lY3Rpb25JZHMgPSBbXTtcbiIsImV4cG9ydCBjbGFzcyBSZXR1cm5lciB7XG4gICAgY29uc3RydWN0b3IoaWQsIHVzZXJJZCwgcmVmZXJlbnRJZCwgaXNOZXcpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudElkID0gcmVmZXJlbnRJZDtcbiAgICAgICAgdGhpcy5pc05ldyA9IGlzTmV3O1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTZWFyY2hRdWVyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLnR5cGUgPSBcIlwiO1xuICAgICAgICB0aGlzLmxpbmtlciA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW5wYWdlID0gMTA7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIHRoaXMubGlzdExpbmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5mdWxsTGlua2VycyA9IFtdO1xuICAgICAgICB0aGlzLnRleHRTZWFyY2ggPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2ljID0gXCJvclwiO1xuICAgICAgICB0aGlzLnJldmVyc2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb0ZpbHRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpbHRlclNlYXJjaGVzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0b3JzID0gW107XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNlYXJjaFN0cnVjdHVyZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gXCJcIjtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbiA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb21wb3NpdGlvbiA9IFwiXCI7XG4gICAgICAgIHRoaXMudXNlcklkID0gOTk5O1xuICAgICAgICB0aGlzLmlucGFnZSA9IDEwO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBUb2tlblN0b3JhZ2Uge1xufVxuVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gXCJcIjtcbiIsImV4cG9ydCBjbGFzcyBTZXNzaW9uRGF0YSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaWQgPSBcIjBcIjtcbiAgICAgICAgdGhpcy5yZW1vdGVfYWRkcmVzcyA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VydmVyX3BvcnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlcnZlcl9hZGRyZXNzID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZXJ2ZXJfbmFtZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VydmVyX3NvZnR3YXJlID0gXCJcIjtcbiAgICAgICAgdGhpcy5odHRwX3VzZXJfYWdlbnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlbGYgPSBcIlwiO1xuICAgICAgICB0aGlzLnBvcnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IFwiXCI7XG4gICAgICAgIHRoaXMuZW1haWwgPSBcIlwiO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTZXR0aW5nRGF0YSB7XG4gICAgY29uc3RydWN0b3IoaXNPbmxpbmVTeW5jKSB7XG4gICAgICAgIHRoaXMuaWQgPSAxO1xuICAgICAgICB0aGlzLmlzT25saW5lU3luYyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzT25saW5lU3luYyA9IGlzT25saW5lU3luYztcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgU2V0dGluZ3Mge1xufVxuU2V0dGluZ3MuaXNVcGRhdGVkID0gZmFsc2U7XG5TZXR0aW5ncy5pc09ubGluZVN5bmMgPSBmYWxzZTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4vLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25jZXB0QXBpIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29uY2VwdEFwaVwiO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaSB9IGZyb20gXCIuLi9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNvbm5lY3Rpb25BcGlcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgY2xhc3MgU3luY0RhdGEge1xuICAgIHN0YXRpYyBDaGVja0NvbnRhaW5zKGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbnM7XG4gICAgfVxuICAgIHN0YXRpYyBTeW5jRGF0YURlbGV0ZShpZCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSB0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQgPT0gaWQgfHwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLnRvVGhlQ29uY2VwdElkID09IGlkIHx8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS50eXBlSWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBDaGVja0NvbnRhaW5zQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS5pZCA9PSBjb25uZWN0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHRUZW1wb3JhcnkoY29uY2VwdCk7XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgUmVtb3ZlQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5LnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBSZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFN5bmNEYXRhT25saW5lKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24odGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdHNBcnJheSA9IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICAgICAgQ3JlYXRlVGhlQ29uY2VwdEFwaShjb25jZXB0c0FycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZvcihsZXQgaSA9MCA7IGk8dGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aCA7IGkrKyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHRoZSBjb25uZWN0aW9uIGluIGJhY2tlbmRcIiwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLm9mVGhlQ29uY2VwdElkICsgXCI9PT09XCIgKyB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGlvbnNBcnJheSA9IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25BcGkoY29ubmVjdGlvbnNBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJkb25lXCI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgc3luY0RhdGFMb2NhbERiKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgdGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImxvY2FsY29ubmVjdGlvblwiLCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuU3luY0RhdGEuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcblN5bmNEYXRhLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbiIsImV4cG9ydCBjbGFzcyBUaGVDaGFyYWN0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJJZCwgZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgZW50cnlUaW1lc3RhbXAsIGlzTmV3KSB7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgICAgICB0aGlzLmlzTmV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLmRhdGEgPSBgJHtkYXRhfWA7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMuc2Vzc2lvblVzZXJJZCA9IHNlc3Npb25Vc2VySWQ7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldztcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgVGhlVGV4dHMge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJJZCwgZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgZW50cnlUaW1lc3RhbXAsIGlzTmV3KSB7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZWN1cml0eUlkID0gc2VjdXJpdHlJZDtcbiAgICAgICAgdGhpcy5zZWN1cml0eVVzZXJJZCA9IHNlY3VyaXR5VXNlcklkO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVXNlcklkID0gYWNjZXNzVXNlcklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uVXNlcklkID0gc2Vzc2lvblVzZXJJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVzdGFtcCA9IGVudHJ5VGltZXN0YW1wO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBVc2VyTm9kZSB9IGZyb20gXCIuL1VzZXJOb2RlXCI7XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi8uLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmV4cG9ydCBjbGFzcyBVc2VyQmluYXJ5VHJlZSB7XG4gICAgc3RhdGljIGNvbXBvc2l0ZUtleSh1c2VySWQsIHNlc3Npb25JZCkge1xuICAgICAgICBsZXQgdXNlckhleCA9ICgnMDAwMCcgKyB1c2VySWQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC00KTtcbiAgICAgICAgbGV0IHNlc3Npb25IZXggPSAoJzAwMDAnICsgc2Vzc2lvbklkLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtNCk7XG4gICAgICAgIHJldHVybiB1c2VySGV4ICsgc2Vzc2lvbkhleDtcbiAgICB9XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LmFkZE5vZGUobm9kZSwgdGhpcy5yb290LCB0aGlzLnJvb3QuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoVXNlckJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCwgdXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgVXNlck5vZGUoa2V5LCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKHVzZXJJZCwgc2Vzc2lvbklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZShrZXksIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUodXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5jb21wb3NpdGVLZXkodXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5yZW1vdmVOb2RlKHRoaXMucm9vdCwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY291bnROb2RlQmVsb3codGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5Vc2VyQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsImV4cG9ydCBjbGFzcyBVc2VyTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgIHRoaXMubGVmdE5vZGUgPSBsZWZ0Tm9kZTtcbiAgICAgICAgdGhpcy5yaWdodE5vZGUgPSByaWdodE5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlLnZhbHVlLnB1c2goLi4ucGFzc2VkTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBsZXQgeCA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IHk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeS5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgbGVmdFJvdGF0ZSh4KSB7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICBsZXQgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSB4O1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3JldHVybiB5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBnZXRIZWlnaHQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBnZXRCYWxhbmNlRmFjdG9yKE4pIHtcbiAgICAgICAgaWYgKE4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVpZ2h0KE4ubGVmdE5vZGUpIC0gdGhpcy5nZXRIZWlnaHQoTi5yaWdodE5vZGUpO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZShpZCwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKGlkID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFNldHRpbmdEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdEYXRhXCI7XG5pbXBvcnQgeyBJbmRleERiIH0gZnJvbSBcIi4vaW5kZXhlZGRiXCI7XG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBJbmRleERiLmRiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9EYXRhYmFzZShkYXRhYmFzZU5hbWUsIG9iamVjdCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldFN0YXRzRnJvbURhdGFiYXNlKCkge1xuICAgIHZhciBzZXR0aW5nc0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEodHJ1ZSk7XG4gICAgcmV0dXJuIHNldHRpbmdzRGF0YTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBBaVVwZGF0ZUZsYWcob2JqZWN0KSB7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUoZGF0YWJhc2VOYW1lLCB0eXBlLCBpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoZGF0YWJhc2VOYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tRGF0YWJhc2UoZGF0YWJhc2VOYW1lLCBpZCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZyb21Mb2NhbERiKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vYXBwXCI7XG52YXIgdmVyc2lvbiA9IDQ7XG5leHBvcnQgY2xhc3MgTG9jYWxJbmRleERiIHtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvcGVuRGF0YWJhc2UoZGF0YWJhc2VOYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKExvY2FsSW5kZXhEYi5kYikge1xuICAgICAgICAgICAgcmVzb2x2ZShMb2NhbEluZGV4RGIuZGIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYUxvY2FsXCIsIHZlcnNpb24pO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJXaHkgZGlkbid0IHlvdSBhbGxvdyBteSB3ZWIgYXBwIHRvIHVzZSBJbmRleGVkREI/IVwiKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBMb2NhbEluZGV4RGIuZGIgPSB0YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgcmVzb2x2ZShMb2NhbEluZGV4RGIuZGIpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICB2YXIgY29uY2VwdERiID0gXCJsb2NhbGNvbmNlcHRcIjtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uRGIgPSBcImxvY2FsY29ubmVjdGlvblwiO1xuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbmNlcHREYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29uY2VwdERiLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbm5lY3Rpb25EYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29ubmVjdGlvbkRiLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBvcGVuRGF0YWJhc2UoZGF0YWJhc2VOYW1lKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGIgPSBMb2NhbEluZGV4RGIuZGI7XG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgIHZhciBhbGxvYmplY3RzID0gb2JqZWN0U3RvcmUuZ2V0QWxsKCk7XG4gICAgICAgICAgICAgICAgYWxsb2JqZWN0cy5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0dWRlbnRzID0gYWxsb2JqZWN0cy5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R1ZGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2goc3R1ZGVudHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoQ29uY2VwdExpc3QpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RvcmVUb0RhdGFiYXNlKGRhdGFiYXNlTmFtZSwgb2JqZWN0KSB7XG4gICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSk7XG4gICAgbGV0IGRiO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYUxvY2FsXCIsIHZlcnNpb24pO1xuICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiV2h5IGRpZG4ndCB5b3UgYWxsb3cgbXkgd2ViIGFwcCB0byB1c2UgSW5kZXhlZERCPyFcIik7XG4gICAgfTtcbiAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB2YXIgZGIgPSB0YXJnZXQucmVzdWx0O1xuICAgICAgICBsZXQgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBsZXQgb2JqU3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICBvYmpTdG9yZS5hZGQob2JqZWN0KTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZyb21Mb2NhbERiKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oZGIgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IExvY2FsSW5kZXhEYi5kYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICAgICAgICAgIGxldCBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKGRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGFsbG9iamVjdHMgPSBvYmplY3RTdG9yZS5nZXRBbGwoKTtcbiAgICAgICAgICAgICAgICBhbGxvYmplY3RzLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R1ZGVudHMgPSBhbGxvYmplY3RzLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHVkZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2VwdExpc3QucHVzaChzdHVkZW50c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShDb25jZXB0TGlzdCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gICAvLyBEYXRhYmFzZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgICAvLyB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21EYXRhYmFzZShkYXRhYmFzZU5hbWUsIGlkKSB7XG4gICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKEJhc2VVcmwuQkFTRV9VUkwgKyBcIl9GcmVlU2NoZW1hTG9jYWxcIiwgdmVyc2lvbik7XG4gICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgdmFyIGRiID0gdGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgbGV0IGdldFJlcXVlc3QgPSBvYmplY3RTdG9yZS5kZWxldGUoaWQpO1xuICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIC8vIGNvbmNlcHQgPSAgZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIC8vIEFjY2VzcyB0aGUgcmV0cmlldmVkIGRhdGFcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBTZXR0aW5nRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TZXR0aW5nRGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG52YXIgdmVyc2lvbiA9IDQ7XG5leHBvcnQgY2xhc3MgSW5kZXhEYiB7XG59XG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChJbmRleERiLmRiKSB7XG4gICAgICAgICAgICByZXNvbHZlKEluZGV4RGIuZGIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYVwiLCB2ZXJzaW9uKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiV2h5IGRpZG4ndCB5b3UgYWxsb3cgbXkgd2ViIGFwcCB0byB1c2UgSW5kZXhlZERCPyFcIik7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgSW5kZXhEYi5kYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICByZXNvbHZlKEluZGV4RGIuZGIpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICB2YXIgY29uY2VwdERiID0gXCJjb25jZXB0XCI7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkRiID0gXCJjb25uZWN0aW9uXCI7XG4gICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBcInNldHRpbmdzXCI7XG4gICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoY29uY2VwdERiKSkgeyAvLyBpZiB0aGVyZSdzIG5vIGRhdGFiYXNlIG5hbWVcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShjb25jZXB0RGIsIHsga2V5UGF0aDogJ2lkJyB9KTsgLy8gY3JlYXRlIGl0XG4gICAgICAgICAgICAgICAgb2JqZWN0U3RvcmUudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB2YWx1ZXMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0U3RvcmUuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IG15T2JqZWN0U3RvcmUgPSBkYlxuICAgICAgICAgICAgICAgICAgICAvLyAudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKVxuICAgICAgICAgICAgICAgICAgICAvLyAub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbXlPYmplY3RTdG9yZS5hZGQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbm5lY3Rpb25EYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29ubmVjdGlvbkRiLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHNldHRpbmdzKSkge1xuICAgICAgICAgICAgICAgIGxldCBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKHNldHRpbmdzLCB7IGtleVBhdGg6ICdpZCcgfSk7IC8vIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIG9iamVjdFN0b3JlLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9EYXRhYmFzZShkYXRhYmFzZU5hbWUsIG9iamVjdCkge1xuICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAob2JqZWN0LmlkICE9IDApIHtcbiAgICAgICAgICAgIC8vdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0O1xuICAgICAgICAgICAgdmFyIGRiID0gSW5kZXhEYi5kYjtcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgICAgICBsZXQgb2JqU3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgb2JqU3RvcmUuYWRkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgIC8vICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3Q7XG4gICAgLy8gICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQgYXMgSURCRGF0YWJhc2U7XG4gICAgLy8gICAgIHZhciBjb25jZXB0RGIgPSBcImNvbmNlcHRcIjtcbiAgICAvLyAgICAgdmFyIGNvbm5lY3Rpb25EYiA9IFwiY29ubmVjdGlvblwiO1xuICAgIC8vICAgICB2YXIgc2V0dGluZ3MgPSBcInNldHRpbmdzXCJcbiAgICAvLyAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGNvbmNlcHREYikpIHsgLy8gaWYgdGhlcmUncyBubyBkYXRhYmFzZSBuYW1lXG4gICAgLy8gICAgICAgbGV0ICBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKGNvbmNlcHREYiwge2tleVBhdGg6ICdpZCd9KTsgLy8gY3JlYXRlIGl0XG4gICAgLy8gICAgICAgb2JqZWN0U3RvcmUudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAvLyAgICAgICAgICAgICAvLyBTdG9yZSB2YWx1ZXMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0U3RvcmUuXG4gICAgLy8gICAgICAgICAgICAgLy8gY29uc3QgbXlPYmplY3RTdG9yZSA9IGRiXG4gICAgLy8gICAgICAgICAgICAgLy8gLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIilcbiAgICAvLyAgICAgICAgICAgICAvLyAub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAvLyAgICAgICAgICAgICAvLyBteU9iamVjdFN0b3JlLmFkZChvYmplY3QpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoY29ubmVjdGlvbkRiKSkgeyAvLyBpZiB0aGVyZSdzIG5vIGRhdGFiYXNlIG5hbWVcbiAgICAvLyAgICAgICBsZXQgIG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoY29ubmVjdGlvbkRiLCB7a2V5UGF0aDogJ2lkJ30pOyAvLyBjcmVhdGUgaXRcbiAgICAvLyAgICAgICBvYmplY3RTdG9yZS50cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZighZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhzZXR0aW5ncykpe1xuICAgIC8vICAgICAgIGxldCAgb2JqZWN0U3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShzZXR0aW5ncywge2tleVBhdGg6ICdpZCd9KTsgLy8gY3JlYXRlIGl0XG4gICAgLy8gICAgICAgb2JqZWN0U3RvcmUudHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG59XG4vLyBleHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlKGRhdGFiYXNlTmFtZTpzdHJpbmcsIGlkOm51bWJlcil7XG4vLyAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oKCk9Pntcbi8vICAgICBsZXQgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpIGFzIElEQlRyYW5zYWN0aW9uO1xuLy8gICAgIGxldCBvYmplY3RTdG9yZSA9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKSBhcyBJREJPYmplY3RTdG9yZTtcbi8vICAgICBsZXQgZ2V0UmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldChpZCk7XG4vLyAgICAgZ2V0UmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihldmVudDpFdmVudCkge1xuLy8gICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0O1xuLy8gICAgICAgY29uY2VwdCA9IHRhcmdldC5yZXN1bHQgYXMgQ29uY2VwdDtcbi8vICAgICAgIHJldHVybiBjb25jZXB0O1xuLy8gICAgICAgLy8gY29uY2VwdCA9ICBldmVudC50YXJnZXQucmVzdWx0O1xuLy8gICAgICAgLy8gQWNjZXNzIHRoZSByZXRyaWV2ZWQgZGF0YVxuLy8gICAgIH07ICBcbi8vICAgICAgcmV0dXJuIGNvbmNlcHQgYXMgQ29uY2VwdDtcbi8vICAgfSk7XG4vLyAgICAgLy8gICAvLyBEYXRhYmFzZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5XG4vLyAgICAgLy8gfTtcbi8vICAgfVxuZXhwb3J0IGZ1bmN0aW9uIEdldFN0YXRzRnJvbURhdGFiYXNlKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBkYXRhYmFzZU5hbWUgPSBcInNldHRpbmdzXCI7XG4gICAgICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGRiID0gSW5kZXhEYi5kYjtcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgdmFyIGFsbG9iamVjdHMgPSBvYmplY3RTdG9yZS5nZXRBbGwoKTtcbiAgICAgICAgICAgIGFsbG9iamVjdHMub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBzZXR0aW5nc0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBzZXR0aW5nc0FycmF5ID0gYWxsb2JqZWN0cy5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXR0aW5nc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzRGF0YSA9IHNldHRpbmdzQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzRGF0YSA9IHNldHRpbmdzRGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzZXR0aW5nc0RhdGEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQWlVcGRhdGVGbGFnKG9iamVjdCkge1xuICAgIHZhciBkYXRhYmFzZU5hbWUgPSBcInNldHRpbmdzXCI7XG4gICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkudGhlbigoKSA9PiB7XG4gICAgICAgIHZhciBkYiA9IEluZGV4RGIuZGI7XG4gICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgIGxldCBvYmpTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKGRhdGFiYXNlTmFtZSk7XG4gICAgICAgIG9ialN0b3JlLnB1dChvYmplY3QpO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlKGRhdGFiYXNlTmFtZSwgdHlwZSwgaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oQmFzZVVybC5CQVNFX1VSTCArIFwiX0ZyZWVTY2hlbWFcIiwgdmVyc2lvbik7XG4gICAgICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgICAgIHZhciBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBkYiA9IHRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdldEN1cnNvclJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgZ2V0Q3Vyc29yUmVxdWVzdC5vbnN1Y2Nlc3MgPSBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3Vyc29yIGxvZ2ljIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vyc29yID0gdGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci52YWx1ZVt0eXBlXSA9PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2VwdExpc3QucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKENvbmNlcHRMaXN0KTtcbiAgICAgICAgICAgICAgICAvLyAgIC8vIERhdGFiYXNlIG9wZW5lZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgICAgICAvLyB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChldmVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBvcGVuRGF0YWJhc2UoZGF0YWJhc2VOYW1lKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZGIgPSBJbmRleERiLmRiO1xuICAgICAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKGRhdGFiYXNlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICB2YXIgYWxsb2JqZWN0cyA9IG9iamVjdFN0b3JlLmdldEFsbCgpO1xuICAgICAgICAgICAgICAgIGFsbG9iamVjdHMub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHVkZW50cyA9IGFsbG9iamVjdHMucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0dWRlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0TGlzdC5wdXNoKHN0dWRlbnRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKENvbmNlcHRMaXN0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyByZXR1cm4gQ29uY2VwdExpc3Q7XG4gICAgfSk7XG59XG4vLyAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGcm9tRGF0YWJhc2VXaXRoQ2hhcmFjdGVyT2xkKGRhdGFiYXNlTmFtZTpzdHJpbmcsIHR5cGU6c3RyaW5nLCBjaGFyYWN0ZXJWYWx1ZTpzdHJpbmcpe1xuLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuLy8gICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpO1xuLy8gICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihcIkZyZWVTY2hlbWFcIix2ZXJzaW9uKTtcbi8vICAgICB2YXIgY29uY2VwdDogQ29uY2VwdHxudWxsO1xuLy8gICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24oZXZlbnQpIHtcbi8vICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0O1xuLy8gICAgICAgICB2YXIgZGIgPSB0YXJnZXQucmVzdWx0IGFzIElEQkRhdGFiYXNlO1xuLy8gICAgICAgbGV0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oZGF0YWJhc2VOYW1lLCBcInJlYWR3cml0ZVwiKSBhcyBJREJUcmFuc2FjdGlvbjtcbi8vICAgICAgIGxldCBvYmplY3RTdG9yZSA9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoZGF0YWJhc2VOYW1lKSBhcyBJREJPYmplY3RTdG9yZTtcbi8vICAgICAgIHZhciBhbGxvYmplY3RzID0gb2JqZWN0U3RvcmUuZ2V0QWxsKCk7XG4vLyAgICAgICBhbGxvYmplY3RzLm9uc3VjY2VzcyA9ICgpPT4ge1xuLy8gICAgICAgICBjb25zdCBzdHVkZW50cyA9IGFsbG9iamVjdHMucmVzdWx0O1xuLy8gICAgICAgICBmb3IodmFyIGk9MDsgaTxzdHVkZW50cy5sZW5ndGg7IGkrKyl7XG4vLyAgICAgICAgICAgaWYoc3R1ZGVudHNbaV0uY2hhcmFjdGVyX3ZhbHVlID09IGNoYXJhY3RlclZhbHVlKXtcbi8vICAgICAgICAgICAgIGNvbmNlcHQgPSBzdHVkZW50c1tpXTtcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgY29uc29sZS5sb2coXCJyZXNvbHZpbmdcIik7XG4vLyAgICAgICAgIHJlc29sdmUoY29uY2VwdCk7IFxuLy8gICAgIH1cbi8vICAgICAvLyAgIC8vIERhdGFiYXNlIG9wZW5lZCBzdWNjZXNzZnVsbHlcbi8vICAgICAvLyB9O1xuLy8gICAgIH1cbi8vICAgICByZXF1ZXN0Lm9uZXJyb3IgPWZ1bmN0aW9uKGV2ZW50KXtcbi8vICAgICAgIHJlamVjdChldmVudCk7XG4vLyAgICAgfVxuLy8gfSk7XG4vLyAgICAvLyByZXR1cm4gQ29uY2VwdExpc3Q7XG4vLyAgIH1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tRGF0YWJhc2UoZGF0YWJhc2VOYW1lLCBpZCkge1xuICAgIG9wZW5EYXRhYmFzZShkYXRhYmFzZU5hbWUpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihCYXNlVXJsLkJBU0VfVVJMICsgXCJfRnJlZVNjaGVtYVwiLCB2ZXJzaW9uKTtcbiAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB2YXIgZGIgPSB0YXJnZXQucmVzdWx0O1xuICAgICAgICBsZXQgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihkYXRhYmFzZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBsZXQgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShkYXRhYmFzZU5hbWUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcImRlbGV0aW5nIGZyb20gdGhlIGRhdGFiYXNlXCIsIGlkKTtcbiAgICAgICAgbGV0IGdldFJlcXVlc3QgPSBvYmplY3RTdG9yZS5kZWxldGUoTnVtYmVyKGlkKSk7XG4gICAgICAgIGdldFJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJkZWxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAgICAgICAgICAgIC8vIGNvbmNlcHQgPSAgZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIC8vIEFjY2VzcyB0aGUgcmV0cmlldmVkIGRhdGFcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QgPSBbXSwgY29uY2VwdCkge1xuICAgIGxldCBmb3VuZENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuICAgICAgICBjb25zdCBjaGVjayA9IGNvbmNlcHRMaXN0LmZpbmQoYyA9PiBjLmlkID09PSBjb25jZXB0LmlkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbmNlcHQgPSBjaGVjaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25jZXB0O1xufVxuLy8gZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUeXBlQ29uY2VwdEV4aXN0c0luQXJyYXkoXG4vLyAgIGNvbmNlcHRMaXN0OiBDb25jZXB0W10gPSBbXSxcbi8vICAgY29uY2VwdDogQ29uY2VwdCxcbi8vICkge1xuLy8gICBsZXQgbmV3Q29uY2VwdFR5cGUgPSBjb25jZXB0LnR5cGU/LmNoYXJhY3RlclZhbHVlO1xuLy8gICBpZighbmV3Q29uY2VwdFR5cGU/LnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKXtcbi8vICAgICBuZXdDb25jZXB0VHlwZSA9IFwidGhlX1wiICsgbmV3Q29uY2VwdFR5cGU7XG4vLyAgIH1cbi8vICAgbGV0IHN0YXJ0c1dpdGggPSBjb25jZXB0TGlzdFtpXS50eXBlPy5jaGFyYWN0ZXJWYWx1ZTtcbi8vICAgaWYoIXN0YXJ0c1dpdGg/LnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKXtcbi8vICAgICBzdGFydHNXaXRoID0gXCJ0aGVfXCIgKyBzdGFydHNXaXRoO1xuLy8gICB9XG4vLyAgIGxldCBmb3VuZENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpXG4vLyAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuLy8gICAgIGNvbnN0IGNoZWNrID0gY29uY2VwdExpc3QuZmluZChjID0+IGMudHlwZUlkID09IGNvbmNlcHQudHlwZUlkKVxuLy8gICAgIGlmIChjaGVjaykge1xuLy8gICAgICAgZm91bmRDb25jZXB0ID0gY2hlY2tcbi8vICAgICB9XG4vLyAgIH1cbi8vICAgcmV0dXJuIGZvdW5kQ29uY2VwdFxuLy8gfVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUeXBlQ29uY2VwdHNFeGlzdHNJbkFycmF5KGNvbmNlcHRMaXN0ID0gW10sIGNvbmNlcHQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBmb3VuZENvbmNlcHRzID0gW107XG4gICAgbGV0IG5ld0NvbmNlcHRUeXBlID0gKF9hID0gY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWU7XG4gICAgaWYgKCEobmV3Q29uY2VwdFR5cGUgPT09IG51bGwgfHwgbmV3Q29uY2VwdFR5cGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld0NvbmNlcHRUeXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICBuZXdDb25jZXB0VHlwZSA9IFwidGhlX1wiICsgbmV3Q29uY2VwdFR5cGU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRzV2l0aCA9IChfYiA9IGNvbmNlcHRMaXN0W2ldLnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgICAgIGlmICghKHN0YXJ0c1dpdGggPT09IG51bGwgfHwgc3RhcnRzV2l0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhcnRzV2l0aC5zdGFydHNXaXRoKFwidGhlX1wiKSkpIHtcbiAgICAgICAgICAgICAgICBzdGFydHNXaXRoID0gXCJ0aGVfXCIgKyBzdGFydHNXaXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZUlkID09IGNvbmNlcHRMaXN0W2ldLnR5cGVJZCB8fCBuZXdDb25jZXB0VHlwZSA9PSBzdGFydHNXaXRoKSB7XG4gICAgICAgICAgICAgICAgZm91bmRDb25jZXB0cy5wdXNoKGNvbmNlcHRMaXN0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25jZXB0cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBDaGVja0lmVHlwZUxDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QgPSBbXSwgY29uY2VwdCkge1xuICAgIGxldCBmb3VuZENvbmNlcHRzID0gW107XG4gICAgbGV0IG5ld0NvbmNlcHRUeXBlID0gY29uY2VwdC50eXBlQ2hhcmFjdGVyO1xuICAgIGlmICghKG5ld0NvbmNlcHRUeXBlID09PSBudWxsIHx8IG5ld0NvbmNlcHRUeXBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdDb25jZXB0VHlwZS5zdGFydHNXaXRoKFwidGhlX1wiKSkpIHtcbiAgICAgICAgbmV3Q29uY2VwdFR5cGUgPSBcInRoZV9cIiArIG5ld0NvbmNlcHRUeXBlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0c1dpdGggPSBjb25jZXB0TGlzdFtpXS50eXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgaWYgKCEoc3RhcnRzV2l0aCA9PT0gbnVsbCB8fCBzdGFydHNXaXRoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGFydHNXaXRoLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGggPSBcInRoZV9cIiArIHN0YXJ0c1dpdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgPT0gY29uY2VwdExpc3RbaV0udHlwZUlkIHx8IG5ld0NvbmNlcHRUeXBlID09IHN0YXJ0c1dpdGgpIHtcbiAgICAgICAgICAgICAgICBmb3VuZENvbmNlcHRzLnB1c2goY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbmNlcHRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZDb25uZWN0aW9uRXhpc3RzSW5BcnJheShjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25uZWN0aW9uKSB7XG4gICAgbGV0IGZvdW5kQ29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICBjb25zdCBjaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLmlkID09PSBjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb24gPSBjaGVjaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25uZWN0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUb1RoZUNvbmNlcHRFeGlzdHNJbkNvbm5lY3Rpb25BcnJheShjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25jZXB0SWQpIHtcbiAgICBsZXQgZm91bmRDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMudG9UaGVDb25jZXB0SWQgPT09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9uID0gY2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9DaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLm9mVGhlQ29uY2VwdElkID09PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAodG9DaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9uID0gdG9DaGVjaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25uZWN0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkNvbm5lY3Rpb25BcnJheShjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25jZXB0SWQpIHtcbiAgICBsZXQgZm91bmRDb25uZWN0aW9ucyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICBjb25zdCBjaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLnRvVGhlQ29uY2VwdElkID09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9ucy5wdXNoKGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b0NoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMub2ZUaGVDb25jZXB0SWQgPT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKHRvQ2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29ubmVjdGlvbnMucHVzaCh0b0NoZWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRDb25uZWN0aW9ucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5MQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbmNlcHRJZCkge1xuICAgIGxldCBmb3VuZENvbm5lY3Rpb25zID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMudG9UaGVDb25jZXB0SWQgPT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb25zLnB1c2goY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy5vZlRoZUNvbmNlcHRJZCA9PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAodG9DaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9ucy5wdXNoKHRvQ2hlY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb25zO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZUNvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCA9IFtdLCBjb25jZXB0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgIGNvbmNlcHRMaXN0LnNwbGljZShjb25jZXB0TGlzdC5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBjb25jZXB0LmlkO1xuICAgICAgICB9KSwgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZUNvbm5lY3Rpb25Gcm9tTGlzdChjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25uZWN0aW9uKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0LnNwbGljZShjb25uZWN0aW9uTGlzdC5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBjb25uZWN0aW9uLmlkO1xuICAgICAgICB9KSwgMSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZUxDb25uZWN0aW9uRnJvbUxpc3QoY29ubmVjdGlvbkxpc3QgPSBbXSwgY29ubmVjdGlvbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICBjb25uZWN0aW9uTGlzdC5zcGxpY2UoY29ubmVjdGlvbkxpc3QuZmluZEluZGV4KGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICByZXR1cm4gaS5pZCA9PT0gY29ubmVjdGlvbi5pZDtcbiAgICAgICAgfSksIDEpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEluc2VydFVuaXF1ZU51bWJlcihBcnJheSwgdG9JbnNlcnQpIHtcbiAgICBpZiAoQXJyYXkuaW5kZXhPZih0b0luc2VydCkgPT09IC0xKSB7XG4gICAgICAgIEFycmF5LnB1c2godG9JbnNlcnQpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXk7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuZXhwb3J0IGZ1bmN0aW9uIENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uKG5ld0Nvbm5lY3Rpb25zID0gW10sIG9sZENvbm5lY3Rpb25zID0gW10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZENvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0Nvbm5lY3Rpb25zKSkge1xuICAgICAgICAgICAgaWYgKCFuZXdDb25uZWN0aW9ucy5maW5kKG9iaiA9PiBvYmouaWQgPT09IG9sZENvbm5lY3Rpb25zW2ldLmlkKSkge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLlJlbW92ZUNvbm5lY3Rpb24ob2xkQ29ubmVjdGlvbnNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uV2l0aElkcyhuZXdDb25uZWN0aW9uSWRzID0gW10sIG9sZENvbm5lY3Rpb25zID0gW10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZENvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbmV3Q29ubmVjdGlvbklkcy5pbmNsdWRlcyhvbGRDb25uZWN0aW9uc1tpXS5pZCkpIHtcbiAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLlJlbW92ZUNvbm5lY3Rpb24ob2xkQ29ubmVjdGlvbnNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tICcuLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YSc7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmltcG9ydCB7IGRlZmF1bHQgYXMgR2V0VGhlQ29uY2VwdCB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0dldFRoZUNvbmNlcHQnO1xuLy8gdGhpcyBpcyBhIGRpZmZlcmVudCB0eXBlIG9mIHJlY3VyaXN2ZSBmZXRjaCBiZWNhdXNlIGhlcmUgYWxsIHRoZSBjb25jZXB0cyBhbmQgY29ubmVjdGlvbnMgYXJlIHBhc3NlZCBhcyBpdCBpc1xuLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBxdWVyeSB0aGUgY29ubmVjdGlvbnMgYW5kIGNvbmNlcHRzIGZyb20gb3V0c2lkZVxuLy8gaWYgdGhlIGNvbmNlcHQgY29ubmVjdGlvbiBpcyBub3QgZm91bmQgdGhlbiBpdCB3aWxsIGdvIHRvIHRoZSBiYWNrZW5kIHRvIGZldGNoIGl0XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2hOZXcoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0TGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IG91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgY29uY2VwdCBmcm9tIGEgbGlzdCBvZiBjb25jZXB0c1xuICAgICAgICBsZXQgY29uY2VwdCA9IGdldENvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCwgaWQpO1xuICAgICAgICAvLyBpZiB3ZSBjYW5ub3QgZmluZCB0aGUgY29uY2VwdCBmcm9tIHRoZSBjb25jZXB0IGxpc3QgdGhlbiBmaW5kIGl0IGZyb20gdGhlIGJhY2tlbmRcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgY29uY2VwdC5pZCA9PSAwKSAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25jZXB0cyB0cmllcyB0byBmaW5kIGl0IGZyb20gdGhlIGJpbmFyeSB0cmVlIGVsc2UgZnJvbSB0aGUgYmFja2VuZCBpZiBjYW5ub3QgZmluZCBpdCB0aGVuXG4gICAgICAgICAgICAvLyBpdCB3aWxsIGJlY29tZSBudWxsXG4gICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgY29uY2VwdCB0eXBlIGlzIG5vbiBleGlzdGVudCB0aGVuIHlvdSBoYXZlIHRvIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmNlcHQgdHlwZSBpZCBmcm9tIHRoZSBjb25jZXB0IHdoaWNoIGlzIHN0b3JlZCBpbiB0eXBlSWRcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NvbmNlcHRUeXBlSWQgPSBjb25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRUeXBlID0gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCB0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGUgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL2xldCBtYWluU3RyaW5nID0gY29uY2VwdD8udHlwZT8uY2hhcmFjdGVyVmFsdWUgPz8gJydcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIGNvbm5lY3Rpb25zXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gaGFzIHRoZSBpZCB0aGF0IGhhcyBiZWVuIHBhc3NlZCBpbiB0aGUgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgLy8gb2Z0aGVjb25jZXB0SWQgLS0tLS0+IHRvVGhlQ29uY2VwdElkXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBvbmx5IGdpdmVzIHRoZSB2YWxpZCBjb25jZXB0IGlkIHRoYXQgYXJlIGluc2lkZSBvZiB0aGlzIGlkXG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gdGFrZSBvdXQgdGhlIHRvVGhlQ29uY2VwdElkIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIHRvVGhlQ29uY2VwdElkIHRvIGEgcmVhbCBDb25jZXB0IE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IGdldENvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCwgdG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25jZXB0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdElkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0b0NvbmNlcHQgaXMgdmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIGluIGNhc2VlIHR5cGUgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9Db25jZXB0VHlwZUlkID0gdG9Db25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdFR5cGUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVnZXggdG8gZmlsdGVyIG91dCB0aGUgdGhlXyBmcm9tIHRoZSB0eXBlIGNvbmNlcHRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9ICd0aGVfJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gY3JlYXRlIHRoZSBrZXkgb2YgdGhlIGtleSB2YWx1ZSBwYWlyIHRoYXQgaXMgdGhlIHR5cGUgb2YgdGhlIGNvbmNlcHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsbWFpblN0cmluZyA9IChfYiA9IChfYSA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgdGhlXyB3aXRoIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxLZXkgPSBsb2NhbG1haW5TdHJpbmcucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlICB0eXBlICBpcyBhIG51bWJlciB0aGVuIHB1dCBpdCBpbnNpZGUgb2YgYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKGxvY2FsS2V5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hOZXcodG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0TGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0eXBlIGlzIGEgbnVtYmVyIHRoZW4gcHV0IGl0IGluc2lkZSBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTmV3KHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29uY2VwdExpc3QsIGNvbXBvc2l0aW9uTGlzdCwgdmlzaXRlZENvbmNlcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuLy8gZ2V0cyB0aGUgY29uY2VwdCBmcm9tIHRoZSBsaXN0IG9mIGNvbmNlcHRzIHVzaW5nIHRoZSBjb25jZXB0SWRcbmZ1bmN0aW9uIGdldENvbmNlcHRGcm9tTGlzdChjb25jZXB0TGlzdCwgY29uY2VwdElkKSB7XG4gICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNvbmNlcHRJZCA9PSBjb25jZXB0TGlzdFtpXS5pZCkge1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhJztcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbkJ1bGsgfSBmcm9tICcuLi8uLi9BcGkvR2V0Q29ubmVjdGlvbkJ1bGsnO1xuaW1wb3J0IHsgR2V0Q29uY2VwdCB9IGZyb20gJy4uLy4uL0FwaS9HZXRDb25jZXB0JztcbmltcG9ydCB7IHJlY3Vyc2l2ZUZldGNoTmV3IH0gZnJvbSAnLi9CdWlsZENvbXBvc2l0aW9uJztcbmltcG9ydCB7IHJlY3Vyc2l2ZUZldGNoIH0gZnJvbSAnLi4vR2V0Q29tcG9zaXRpb24nO1xuaW1wb3J0IHsgQ29tcG9zaXRpb24gfSBmcm9tICcuLi8uLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbic7XG5pbXBvcnQgeyBDb21wb3NpdGlvbkJpbmFyeVRyZWUgfSBmcm9tICcuLi8uLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkJpbmFyeVRyZWUnO1xuaW1wb3J0IHsgQnVsa0NvbmNlcHRHZXR0ZXJBcGkgfSBmcm9tICcuLi8uLi9BcGkvR2V0Q29uY2VwdEJ1bGsnO1xuLy8gZ2V0IHRoZSBjb21wb3NpdGlvbiB3aXRoIHRoZSBwYXNzZWQgaWRcbi8vIGhlcmUgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHBhc3NlZCB3aGljaCB3aWxsIHBhc3MgdGhlIGludGVybmFsIGNvbm5lY3Rpb25zIGlmIGdpdmVuXG4vLyBlbHNlIHRoZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBnZXQgdGhlIGludGVybmFsIGNvbm5lY3Rpb25zIGl0c2VsZlxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aENhY2hlKGlkLCBjb25uZWN0aW9uTGlzdFBhc3NlZCA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29uY2VwdElkTGlzdCA9IFtdO1xuICAgICAgICBsZXQgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIGxldCBvdXRwdXQgPSB7fTtcbiAgICAgICAgY29uc3QgeCA9IHlpZWxkIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDAgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uTGlzdFN0cmluZyA9IFtdO1xuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0UGFzc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdFN0cmluZyA9IGdldE15Q29ubmVjdGlvbnMoaWQsIGNvbm5lY3Rpb25MaXN0UGFzc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0SWRMaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbmNlcHRJZExpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRJZExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgU2F2ZVRvQ29tcG9zaXRpb25DYWNoZShjb25jZXB0LCBjb25uZWN0aW9uTGlzdCwgY29uY2VwdElkTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgICAgIGxldCB2aXNpdGVkQ29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgY29uc3QgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0geC52YWx1ZS5HZXREYXRhQ2FjaGUoKTtcbiAgICAgICAgICAgIHJldHVybk91dHB1dCA9IG91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybk91dHB1dDtcbiAgICB9KTtcbn1cbi8vIHRoaXMgZ2V0cyB0aGUgbGlzdCBvZiBjb25uZWN0aW9ucyBvZiBhIGNvbXBvc2l0aW9uIGZyb20gYSBsaXN0IG9mIGJ1bGsgY29ubmVjdGlvbiBwdWxsXG5mdW5jdGlvbiBnZXRNeUNvbm5lY3Rpb25zKGlkLCBjb25uZWN0aW9uTGlzdCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RbaV0udHlwZUlkID09IGlkKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29ubmVjdGlvbnM7XG59XG4vLyBnZXQgdGhlIGNvbXBvc2l0aW9uIHdpdGggdGhlIHBhc3NlZCBpZFxuLy8gaGVyZSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgcGFzc2VkIHdoaWNoIHdpbGwgcGFzcyB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaWYgZ2l2ZW5cbi8vIGVsc2UgdGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGdldCB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaXRzZWxmXG4vLyB0aGlzIGZ1bmN0aW9uIGhhcyBhICBmb3JtYXQgb2YgZGF0YSAtLSBpZFxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aERhdGFJZFdpdGhDYWNoZShpZCwgY29ubmVjdGlvbkxpc3RQYXNzZWQgPSBbXSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IEZpbmFsUmV0dXJuID0ge307XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0SWRMaXN0ID0gW107XG4gICAgICAgIGxldCBvdXRwdXQ7XG4gICAgICAgIGNvbnN0IHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCB4ID0geWllbGQgQ29tcG9zaXRpb25CaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHggPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gW107XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RQYXNzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gZ2V0TXlDb25uZWN0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3RQYXNzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRJZExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29uY2VwdElkTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdElkTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBTYXZlVG9Db21wb3NpdGlvbkNhY2hlKGNvbmNlcHQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0SWRMaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgY29uc3QgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICAgICAgRmluYWxSZXR1cm5bXCJjcmVhdGVkX2F0XCJdID0gY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgICAgIEZpbmFsUmV0dXJuWydkYXRhJ10gPSByZXR1cm5PdXRwdXQ7XG4gICAgICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0geC52YWx1ZS5HZXREYXRhQ2FjaGUoKTtcbiAgICAgICAgICAgIEZpbmFsUmV0dXJuID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHBhc3NlZCB3aXRoIGJ1bGsgY29tcG9zaXRpb25zIGFuZCBidWxrIGludGVybmFsIGNvbm5lY3Rpb25zIG9mIHRoZW1cbi8vIHNvIHRoYXQgaSBjYW4gY29udmVyIHRoZW0gdG8gYWN0dWFsIGxpc3Qgb2YgY29tcG9zaXRpb25zXG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkQnVsayhpZHMsIGNvbm5lY3Rpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBuZXdDb25uZWN0aW9ucyA9IHlpZWxkIEdldENvbm5lY3Rpb25CdWxrKGNvbm5lY3Rpb25zKTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBuZXdDb25uZWN0aW9ucztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aERhdGFJZFdpdGhDYWNoZShpZHNbaV0sIGNvbm5lY3Rpb25MaXN0KTtcbiAgICAgICAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnMucHVzaChvdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBTYXZlVG9Db21wb3NpdGlvbkNhY2hlKGNvbmNlcHQsIGNvbm5lY3Rpb25zLCBjb25jZXB0SWRMaXN0LCBudW1iZXJzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb24gPSBuZXcgQ29tcG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgY29uY2VwdHMgPSB5aWVsZCBCdWxrQ29uY2VwdEdldHRlcihjb25jZXB0SWRMaXN0KTtcbiAgICAgICAgY29tcG9zaXRpb24uY29ubmVjdGlvbnMgPSBjb25uZWN0aW9ucztcbiAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMgPSBjb25jZXB0cztcbiAgICAgICAgY29tcG9zaXRpb24uaWQgPSBjb25jZXB0LmlkO1xuICAgICAgICBjb21wb3NpdGlvbi5zdWJjb21wb3NpdGlvbnMgPSBudW1iZXJzO1xuICAgICAgICBjb21wb3NpdGlvbi5tYWluQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgIGxldCB2aXNpdGVkQ29uY2VwdHMgPSBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hOZXcoY29uY2VwdC5pZCwgY29ubmVjdGlvbnMsIGNvbmNlcHRzLCBudW1iZXJzLCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICBjb21wb3NpdGlvbi5jYWNoZWQgPSBvdXRwdXQ7XG4gICAgICAgIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5hZGRDb21wb3NpdGlvblRvVHJlZShjb21wb3NpdGlvbik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBCdWxrQ29uY2VwdEdldHRlcihjb25jZXB0SWRzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGJ1bGtDb25jZXB0RmV0Y2ggPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoY29uY2VwdElkcyA9PT0gbnVsbCB8fCBjb25jZXB0SWRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0SWRzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFVzZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGNvbmNlcHRJZHNbaV0pO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIGJ1bGtDb25jZXB0RmV0Y2gucHVzaChjb25jZXB0SWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmNlcHRMaXN0LnB1c2goY29uY2VwdFVzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChidWxrQ29uY2VwdEZldGNoID09PSBudWxsIHx8IGJ1bGtDb25jZXB0RmV0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1bGtDb25jZXB0RmV0Y2gubGVuZ3RoKSA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdExpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25jZXB0TGlzdCA9IHlpZWxkIEJ1bGtDb25jZXB0R2V0dGVyQXBpKGJ1bGtDb25jZXB0RmV0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0TGlzdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuLi9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uJztcbmltcG9ydCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IGZyb20gJy4uL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQnO1xuaW1wb3J0IHsgY3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbm5lY3Rpb24nO1xuLy8gY3JlYXRlIGEgY29tcG9zaXRpb24gd2l0aCBjYWNoaW5nIG1lY2hhbmlzbVxuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlKGpzb24sIG9mVGhlQ29uY2VwdElkID0gbnVsbCwgb2ZUaGVDb25jZXB0VXNlcklkID0gbnVsbCwgbWFpbktleSA9IG51bGwsIHVzZXJJZCA9IG51bGwsIGFjY2Vzc0lkID0gbnVsbCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSBudWxsLCBjb21wb3NpdGlvbiA9IG51bGwpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgY29uc3QgbG9jYWxBY2Nlc3NJZCA9IGFjY2Vzc0lkICE9PSBudWxsICYmIGFjY2Vzc0lkICE9PSB2b2lkIDAgPyBhY2Nlc3NJZCA6IDQ7XG4gICAgICAgIGNvbnN0IGxvY2FsU2Vzc2lvbklkID0gc2Vzc2lvbkluZm9ybWF0aW9uSWQgIT09IG51bGwgJiYgc2Vzc2lvbkluZm9ybWF0aW9uSWQgIT09IHZvaWQgMCA/IHNlc3Npb25JbmZvcm1hdGlvbklkIDogOTk5O1xuICAgICAgICBsZXQgTWFpbktleUxvY2FsID0gbWFpbktleSAhPT0gbnVsbCAmJiBtYWluS2V5ICE9PSB2b2lkIDAgPyBtYWluS2V5IDogMDtcbiAgICAgICAgbGV0IE1haW5Db25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGlmIG5vIGNvbXBvc2l0aW9uIGlzIHBhc3NlZCB0aGVuIGNyZWF0ZSBhIG5ldyBjb21wb3NpdGlvblxuICAgICAgICAgICAgY29tcG9zaXRpb24gPSBuZXcgQ29tcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGpzb25ba2V5XSA9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGpzb25ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksICcnLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YganNvbltrZXldICE9ICdzdHJpbmcnICYmIHR5cGVvZiBqc29uW2tleV0gIT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBwYXJlbnQgY29uY2VwdElkIGFuZCBjb25jZXB0VXNlcklkIHBhc3NlZCB0aGVuIHdlIGtub3cgdGhpcyBpcyB0aGUgbWFpbiBjb25jZXB0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgcmVsYXRlZCB0byB0aGlzIGNvbmNlcHQuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxNYWluS2V5ID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbktleUxvY2FsID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uaWQgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbldpdGhDYWNoZShqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBjb21wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjb25jZXB0IHdoaWNoIGhhcyBwYXJlbnQgcGFzc2VkIG9udG8gaXQgYW5kIHRoaXMgaXMgYSBzdWJjb21wb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2ZUaGVVc2VyID0gb2ZUaGVDb25jZXB0VXNlcklkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0VXNlcklkIDogOTk5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlKGpzb25ba2V5XSwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGpzb25ba2V5XSAhPSBudWxsICYmIGpzb25ba2V5XSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uc3ViY29tcG9zaXRpb25zLnB1c2goY29uY2VwdC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgcGFydCB3aGVyZSB0aGUgY29uY2VwdCBpcyBub3cgYSBrZXkgdmFsdWUgcGFpciBhbmQgaGFzIHRoZSBhY3R1YWwgZGF0YVxuICAgICAgICAgICAgICAgIGNvbnN0IG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCBqc29uW2tleV0sIGZhbHNlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uLmNvbmNlcHRzLnB1c2goY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiB0aGUgbWFpbiBjb25jZXB0XG4gICAgICAgIHJldHVybiBNYWluQ29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUgfSBmcm9tIFwiLi4vLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlXCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdEFwaSB9IGZyb20gXCIuLi8uLi9BcGkvU2VhcmNoQ29uY2VwdC9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdFwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhLCBDcmVhdGVEZWZhdWx0Q29uY2VwdCwgU3BsaXRTdHJpbmdzIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KGNoYXJhY3Rlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PSBcInRoZVwiKSB7XG4gICAgICAgICAgICBjb25jZXB0LmlkID0gMTtcbiAgICAgICAgICAgIGNvbmNlcHQudHlwZUlkID0gNTtcbiAgICAgICAgICAgIGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUgPSBcInRoZVwiO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3MoY2hhcmFjdGVyKTtcbiAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IGNhdGVnb3J5ID0gMTtcbiAgICAgICAgICAgIGxldCBwcmVmaXggPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeShzcGxpdHRlZFN0cmluZ0FycmF5WzBdKTtcbiAgICAgICAgICAgIGlmIChwcmVmaXguaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gcHJlZml4LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RnJvbU1lbW9yeShjaGFyYWN0ZXIsIGNhdGVnb3J5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5WzBdID09IGNoYXJhY3Rlcikge1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJWYWx1ZSwgNTEpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RnJvbU1lbW9yeShjaGFyYWN0ZXIsIGNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbChjaGFyYWN0ZXIsIGNhdGVnb3J5KTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0QXBpKGNoYXJhY3RlciwgY2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb25cIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tIFwiLi4vTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KSB7XG4gICAgY29uc3QgTENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICBMQ29uY2VwdC5pZCA9IGNvbmNlcHQuaWQ7XG4gICAgTENvbmNlcHQuZ2hvc3RJZCA9IGNvbmNlcHQuZ2hvc3RJZDtcbiAgICBMQ29uY2VwdC51c2VySWQgPSBjb25jZXB0LnVzZXJJZDtcbiAgICBMQ29uY2VwdC5hY2Nlc3NJZCA9IGNvbmNlcHQuYWNjZXNzSWQ7XG4gICAgTENvbmNlcHQuY2F0ZWdvcnlJZCA9IGNvbmNlcHQuY2F0ZWdvcnlJZDtcbiAgICBMQ29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSA9IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgTENvbmNlcHQuZW50cnlUaW1lU3RhbXAgPSBjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgIExDb25jZXB0LnR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgIExDb25jZXB0LnR5cGUgPSBjb25jZXB0LnR5cGU7XG4gICAgTENvbmNlcHQuaXNUZW1wID0gZmFsc2U7XG4gICAgcmV0dXJuIExDb25jZXB0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQobGNvbmNlcHQpIHtcbiAgICBjb25zdCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICBjb25jZXB0LmlkID0gbGNvbmNlcHQuaWQ7XG4gICAgY29uY2VwdC5naG9zdElkID0gbGNvbmNlcHQuZ2hvc3RJZDtcbiAgICBjb25jZXB0LnVzZXJJZCA9IGxjb25jZXB0LnVzZXJJZDtcbiAgICBjb25jZXB0LmFjY2Vzc0lkID0gbGNvbmNlcHQuYWNjZXNzSWQ7XG4gICAgY29uY2VwdC5lbnRyeVRpbWVTdGFtcCA9IGxjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgIGNvbmNlcHQudHlwZUlkID0gbGNvbmNlcHQudHlwZUlkO1xuICAgIGNvbmNlcHQuY2F0ZWdvcnlJZCA9IGxjb25jZXB0LmNhdGVnb3J5SWQ7XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyb21Db25uZWN0aW9uVG9MQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgTGNvbm5lY3Rpb24gPSBuZXcgTENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgTGNvbm5lY3Rpb24uaWQgPSBjb25uZWN0aW9uLmlkO1xuICAgIExjb25uZWN0aW9uLmdob3N0SWQgPSBjb25uZWN0aW9uLmdob3N0SWQ7XG4gICAgTGNvbm5lY3Rpb24uYWNjZXNzSWQgPSBjb25uZWN0aW9uLmFjY2Vzc0lkO1xuICAgIExjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gY29ubmVjdGlvbi5vZlRoZUNvbmNlcHRJZDtcbiAgICBMY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZCA9IGNvbm5lY3Rpb24udG9UaGVDb25jZXB0SWQ7XG4gICAgTGNvbm5lY3Rpb24uZW50cnlUaW1lU3RhbXAgPSBjb25uZWN0aW9uLmVudHJ5VGltZVN0YW1wO1xuICAgIExjb25uZWN0aW9uLnR5cGVJZCA9IGNvbm5lY3Rpb24udHlwZUlkO1xuICAgIExjb25uZWN0aW9uLmlzVGVtcCA9IGZhbHNlO1xuICAgIHJldHVybiBMY29ubmVjdGlvbjtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKFwiY29uY2VwdFwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdFRvTWVtb3J5KGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBub2RlID0gbmV3IE5vZGUoY29uY2VwdC5pZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gQmluYXJ5VHJlZS5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHZhciB0aW1lID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwgfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbFwiO1xuaW1wb3J0IHsgRGVsZXRlQ29ubmVjdGlvbkJ5SWQgfSBmcm9tIFwiLi9EZWxldGVDb25uZWN0aW9uXCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5pbXBvcnQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlSW5zdGFuY2VDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cyhvZlRoZUNvbmNlcHQsIHRvVGhlQ29uY2VwdCwgbGlua2VyLCBib3RoID0gZmFsc2UsIGNvdW50ID0gZmFsc2UpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHQudXNlcklkO1xuICAgICAgICB2YXIgb3JkZXJVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgaWYgKGJvdGgpIHtcbiAgICAgICAgICAgIGxldCBwcmVmaXgxID0gKChfYSA9IHRvVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICAgICAgbGV0IGxpbmtlckFkZDEgPSBsaW5rZXIgKyBcIl9ieVwiO1xuICAgICAgICAgICAgbGV0IGJhY2t3YXJkTGlua2VyID0gcHJlZml4MSArIFwiX1wiICsgbGlua2VyQWRkMTtcbiAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZDEsIHRvVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBiYWNrd2FyZExpbmtlciwgZmFsc2UsIDk5OSwgOTk5LCA5OTkpO1xuICAgICAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCB0b1RoZUNvbmNlcHQuaWQsIG9mVGhlQ29uY2VwdC5pZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlLmlkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UudXNlcklkLCAxMDAwLCB1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZpeCA9ICgoX2IgPSBvZlRoZUNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIjtcbiAgICAgICAgbGV0IGxpbmtlckFkZCA9IGxpbmtlciArIFwiX3NcIjtcbiAgICAgICAgbGV0IGZvcndhcmRMaW5rZXIgPSBwcmVmaXggKyBcIl9cIiArIGxpbmtlckFkZDtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICB5aWVsZCBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXJBZGQsIG9mVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29ubmVjdGlvbkNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgb2ZUaGVDb25jZXB0LmlkLCB0b1RoZUNvbmNlcHQuaWQsIG9mVGhlQ29uY2VwdC51c2VySWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIG9mVGhlQ29uY2VwdC51c2VySWQsIGNvbm5lY3Rpb25Db25jZXB0LmlkLCBjb25uZWN0aW9uQ29uY2VwdC51c2VySWQsIDEwMDAsIHVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICBTeW5jRGF0YS5BZGRDb25uZWN0aW9uKG5ld0Nvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gbmV3Q29ubmVjdGlvbjtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXIsIGNvbmNlcHQsIHBhc3NlZFVzZXJJZCA9IG51bGwpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHQxID0gY29uY2VwdDtcbiAgICAgICAgdmFyIHVzZXJJZCA9IHBhc3NlZFVzZXJJZCAhPT0gbnVsbCAmJiBwYXNzZWRVc2VySWQgIT09IHZvaWQgMCA/IHBhc3NlZFVzZXJJZCA6IGNvbmNlcHQudXNlcklkO1xuICAgICAgICB2YXIgb3JkZXJVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgdmFyIGZvcndhcmRMaW5rZXJDb3VudCA9IGxpbmtlciArIFwiX2NvdW50XCI7XG4gICAgICAgIHZhciBmb3J3YXJkTGlua2VyQ291bnRTdHJpbmcgPSAoKF9hID0gY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiICsgXCJfXCIgKyBmb3J3YXJkTGlua2VyQ291bnQ7XG4gICAgICAgIHZhciBmb3J3YXJkTGlua2VyQ291bnRDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvbm5lY3Rpb25cIiwgZm9yd2FyZExpbmtlckNvdW50U3RyaW5nLCBmYWxzZSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQpO1xuICAgICAgICB2YXIgY29ubmVjdGlvbnNTdHJpbmcgPSB5aWVsZCBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0KGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIHVzZXJJZCwgMTAsIDEpO1xuICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgdmFyIHByZWZldGNoID0gW107XG4gICAgICAgIHZhciBjb3VudENvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIHZhciBjb3VudENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBjb3VudENvbmNlcHRMaXN0LnB1c2godG9Db25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY291bnRDb25jZXB0TGlzdC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICBjb3VudENvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY291bnRcIiwgXCIxXCIsIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgb2xkY291bnRDb25jZXB0ID0gY291bnRDb25jZXB0TGlzdFswXTtcbiAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gTnVtYmVyKG9sZGNvdW50Q29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTtcbiAgICAgICAgICAgIGNvdW50Q29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb3VudFwiLCBjb3VudC50b1N0cmluZygpLCBmYWxzZSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIERlbGV0ZUNvbm5lY3Rpb25CeUlkKGNvbm5lY3Rpb25zW2ldLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIGNvbmNlcHQxLmlkLCBjb3VudENvbmNlcHQuaWQsIGNvbmNlcHQxLnVzZXJJZCwgY291bnRDb25jZXB0LnVzZXJJZCwgY29uY2VwdDEudXNlcklkLCBmb3J3YXJkTGlua2VyQ291bnRDb25jZXB0LmlkLCBmb3J3YXJkTGlua2VyQ291bnRDb25jZXB0LnVzZXJJZCwgMTAwMCwgdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIHlpZWxkIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c0dlbmVyYWwob2ZUaGVDb25jZXB0LCB0b1RoZUNvbmNlcHQsIGxpbmtlciwgYm90aCA9IGZhbHNlLCBjb3VudCA9IGZhbHNlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgdXNlcklkID0gb2ZUaGVDb25jZXB0LnVzZXJJZDtcbiAgICAgICAgdmFyIG9yZGVyVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgICAgICB2YXIgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSA5OTk7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSA5OTk7XG4gICAgICAgIGlmIChib3RoKSB7XG4gICAgICAgICAgICBsZXQgcHJlZml4MSA9ICgoX2EgPSB0b1RoZUNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIjtcbiAgICAgICAgICAgIGxldCBsaW5rZXJBZGQxID0gbGlua2VyICsgXCJfYnlcIjtcbiAgICAgICAgICAgIGxldCBiYWNrd2FyZExpbmtlciA9IHByZWZpeDEgKyBcIl9cIiArIGxpbmtlckFkZDE7XG4gICAgICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXJBZGQxLCB0b1RoZUNvbmNlcHQsIHVzZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvbm5lY3Rpb25cIiwgYmFja3dhcmRMaW5rZXIsIGZhbHNlLCA5OTksIDk5OSwgOTk5KTtcbiAgICAgICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgdG9UaGVDb25jZXB0LmlkLCBvZlRoZUNvbmNlcHQuaWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIG9mVGhlQ29uY2VwdC51c2VySWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZS5pZCwgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlLnVzZXJJZCwgMTAwMCwgdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgICAgICBTeW5jRGF0YS5BZGRDb25uZWN0aW9uKG5ld0Nvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmaXggPSAoKF9iID0gb2ZUaGVDb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCI7XG4gICAgICAgIGxldCBsaW5rZXJBZGQgPSBsaW5rZXIgKyBcIl9zXCI7XG4gICAgICAgIGxldCBmb3J3YXJkTGlua2VyID0gcHJlZml4ICsgXCJfXCIgKyBsaW5rZXJBZGQ7XG4gICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgeWllbGQgQ291bnRSZWxhdGlvbnNoaXAobGlua2VyQWRkLCBvZlRoZUNvbmNlcHQsIHVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvbm5lY3Rpb25cIiwgZm9yd2FyZExpbmtlciwgZmFsc2UsIDk5OSwgOTk5LCA5OTkpO1xuICAgICAgICBsZXQgbmV3Q29ubmVjdGlvbiA9IHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsKG9mVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LmlkLCB0b1RoZUNvbmNlcHQudXNlcklkLCBjb25uZWN0aW9uQ29uY2VwdC5pZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCAxMDAwLCBhY2Nlc3NJZCk7XG4gICAgICAgIHJldHVybiBuZXdDb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29uY2VwdCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKSB7XG4gICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICBsZXQgY29uY2VwdCA9IG5ldyBDb25jZXB0KDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwiMFwiLCAwLCAwLCAwLCAwLCAwLCAwLCBmYWxzZSwgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbik7XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRoZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25uZWN0aW9uXCI7XG5pbXBvcnQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlSW5zdGFuY2VDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDcmVhdGVUaGVDb21wb3NpdGlvbihqc29uLCBvZlRoZUNvbmNlcHRJZCA9IG51bGwsIG9mVGhlQ29uY2VwdFVzZXJJZCA9IG51bGwsIG1haW5LZXkgPSBudWxsLCB1c2VySWQgPSBudWxsLCBhY2Nlc3NJZCA9IG51bGwsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gbnVsbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgdmFyIGxvY2FsQWNjZXNzSWQgPSBhY2Nlc3NJZCAhPT0gbnVsbCAmJiBhY2Nlc3NJZCAhPT0gdm9pZCAwID8gYWNjZXNzSWQgOiA0O1xuICAgICAgICB2YXIgbG9jYWxTZXNzaW9uSWQgPSBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gbnVsbCAmJiBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gdm9pZCAwID8gc2Vzc2lvbkluZm9ybWF0aW9uSWQgOiA5OTk7XG4gICAgICAgIHZhciBNYWluS2V5TG9jYWwgPSBtYWluS2V5ICE9PSBudWxsICYmIG1haW5LZXkgIT09IHZvaWQgMCA/IG1haW5LZXkgOiAwO1xuICAgICAgICB2YXIgTWFpbkNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICAgICAgICBpZiAoKHR5cGVvZiBqc29uW2tleV0gIT0gJ3N0cmluZycgJiYgdHlwZW9mIGpzb25ba2V5XSAhPSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxNYWluS2V5ID0gTWFpbktleUxvY2FsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCBcIlwiLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxNYWluS2V5ID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbktleUxvY2FsID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb24oanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIFwiXCIsIHRydWUsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBjcmVhdGVUaGVDb25uZWN0aW9uKG9mVGhlLCBvZlRoZVVzZXIsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIGxvY2FsU2Vzc2lvbklkLCBjb25jZXB0LnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uKGpzb25ba2V5XSwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICB2YXIgb2ZUaGVVc2VyID0gb2ZUaGVDb25jZXB0VXNlcklkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0VXNlcklkIDogMTAyNjc7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCBqc29uW2tleV0sIGZhbHNlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICB5aWVsZCBjcmVhdGVUaGVDb25uZWN0aW9uKG9mVGhlLCBvZlRoZVVzZXIsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIGxvY2FsU2Vzc2lvbklkLCBjb25jZXB0LnVzZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1haW5Db25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25jZXB0QXBpIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29uY2VwdEFwaVwiO1xuaW1wb3J0IHsgQ29uY2VwdCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0XCI7XG5pbXBvcnQgeyBSZXNlcnZlZElkcyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9SZXNlcnZlZElkc1wiO1xuaW1wb3J0IHsgU3luY0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGFcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0geWllbGQgUmVzZXJ2ZWRJZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGlzTmV3ID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgdXBkYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBjb25jZXB0ID0gbmV3IENvbmNlcHQoaWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHJlZmVyZW50LCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgaXNOZXcsIGNyZWF0ZWRfb24sIHVwZGF0ZWRfb24pO1xuICAgICAgICBjb25jZXB0LmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICBTeW5jRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25jZXB0VGVtcG9yYXJ5KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBpZCA9IHlpZWxkIFJlc2VydmVkSWRzLmdldElkKCk7XG4gICAgICAgIHZhciBpc05ldyA9IHRydWU7XG4gICAgICAgIGxldCBjcmVhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IG5ldyBDb25jZXB0KGlkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCByZWZlcmVudCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uKTtcbiAgICAgICAgY29uY2VwdC5pc1RlbXAgPSB0cnVlO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlKHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBpZCA9IHlpZWxkIFJlc2VydmVkSWRzLmdldElkKCk7XG4gICAgICAgIHZhciBpc05ldyA9IGZhbHNlO1xuICAgICAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBuZXcgQ29uY2VwdChpZCwgdXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgcmVmZXJlbnQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBpc05ldywgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbik7XG4gICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICBDcmVhdGVUaGVDb25jZXB0QXBpKFtjb25jZXB0XSk7XG4gICAgICAgIC8vU3luY0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGhlQ29ubmVjdGlvbihvZlRoZUNvbmNlcHRJZCwgb2ZUaGVDb25jZXB0VXNlcklkLCB0b1RoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB0eXBlSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpIHtcbiAgICB2YXIgb3JkZXJJZCA9IDE7XG4gICAgdmFyIG9yZGVyVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgIHZhciB0eXBlVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIHNlY3VyaXR5SWQgPSAwO1xuICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgIHZhciBhY2Nlc3NVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCBvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgb3JkZXJJZCwgb3JkZXJVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gdG9UaGVDb25jZXB0SWQpIHtcbiAgICAgICAgY29ubmVjdGlvbi5vZlRoZUNvbmNlcHRJZCA9IDA7XG4gICAgICAgIGNvbm5lY3Rpb24udG9UaGVDb25jZXB0SWQgPSAxO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgY29ubmVjdGlvbi5pc1RlbXAgPSB0cnVlO1xuICAgIGNvbm5lY3Rpb24uaWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgUmVzZXJ2ZWRDb25uZWN0aW9uSWRzIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1Jlc2VydmVkSWRzXCI7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YVwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsKG9mVGhlQ29uY2VwdElkLCBvZlRoZUNvbmNlcHRVc2VySWQsIHRvVGhlQ29uY2VwdElkLCB0b1RoZUNvbmNlcHRVc2VySWQsIHR5cGVJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgb3JkZXJJZCA9IDEsIGFjY2Vzc0lkID0gNCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvcmRlclVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICAgICAgdmFyIHR5cGVVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gMDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB2YXIgYWNjZXNzVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB2YXIgaWQgPSB5aWVsZCBSZXNlcnZlZENvbm5lY3Rpb25JZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihpZCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCBvZlRoZUNvbmNlcHRVc2VySWQsIHRvVGhlQ29uY2VwdFVzZXJJZCwgdXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIG9yZGVySWQsIG9yZGVyVXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSB0b1RoZUNvbmNlcHRJZCkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5vZlRoZUNvbmNlcHRJZCA9IDA7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnRvVGhlQ29uY2VwdElkID0gMTtcbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMgd2lsbCBjYXVzZSB0aGUgY29ubmVjdGlvbiB0byBnbyBhbmQgdXBkYXRlIHRoZSBleGlzdGluZyB3aXRoIHRoZSByZXNlcnZlZCBpZFxuICAgICAgICBjb25uZWN0aW9uLnRvVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgY29ubmVjdGlvbi5pc1RlbXAgPSBmYWxzZTtcbiAgICAgICAgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBEZWxldGVUaGVDb25jZXB0IGZyb20gXCIuLi9BcGkvRGVsZXRlVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgQmluYXJ5Q2hhcmFjdGVyVHJlZSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBCaW5hcnlUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeVRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeVR5cGVUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeVR5cGVUcmVlXCI7XG5pbXBvcnQgeyByZW1vdmVGcm9tRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gRGVsZXRlQ29uY2VwdEJ5SWQoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoaWQpO1xuICAgICAgICB5aWVsZCBCaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIHZhciB0eXBlSWQgPSBjb25jZXB0LnR5cGVJZDtcbiAgICAgICAgdmFyIGNoYXJhY3RlciA9IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIHlpZWxkIEJpbmFyeVR5cGVUcmVlLnJlbW92ZVR5cGVDb25jZXB0KHR5cGVJZCwgaWQpO1xuICAgICAgICB5aWVsZCBCaW5hcnlDaGFyYWN0ZXJUcmVlLnJlbW92ZU5vZGVCeUNoYXJhY3RlcihjaGFyYWN0ZXIsIGlkKTtcbiAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29uY2VwdFwiLCBpZCk7XG4gICAgICAgIERlbGV0ZVRoZUNvbmNlcHQoaWQpO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgRGVsZXRlVGhlQ29ubmVjdGlvbiBmcm9tIFwiLi4vQXBpL0RlbGV0ZVRoZUNvbm5lY3Rpb25cIjtcbmltcG9ydCB7IENvbm5lY3Rpb25CaW5hcnlUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25CaW5hcnlUcmVlL0Nvbm5lY3Rpb25CaW5hcnlUcmVlXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHlwZVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvblR5cGVUcmVlXCI7XG5pbXBvcnQgeyByZW1vdmVGcm9tRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvaW5kZXhlZGRiXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnlJZCB9IGZyb20gXCIuL0dldENvbm5lY3Rpb25zXCI7XG5leHBvcnQgZnVuY3Rpb24gRGVsZXRlQ29ubmVjdGlvbkJ5SWQoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHlpZWxkIEdldENvbm5lY3Rpb25CeUlkKGlkKTtcbiAgICAgICAgRGVsZXRlVGhlQ29ubmVjdGlvbihpZCk7XG4gICAgICAgIHJlbW92ZUZyb21EYXRhYmFzZShcImNvbm5lY3Rpb25cIiwgaWQpO1xuICAgICAgICBDb25uZWN0aW9uQmluYXJ5VHJlZS5yZW1vdmVOb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICBDb25uZWN0aW9uVHlwZVRyZWUucmVtb3ZlVHlwZUNvbmNlcHQoY29ubmVjdGlvbi50eXBlSWQsIGlkKTtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ1bGsgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCdWxrXCI7XG5leHBvcnQgZnVuY3Rpb24gRmluZENvbmNlcHRzRnJvbUNvbm5lY3Rpb25zKGNvbm5lY3Rpb25MaXN0ID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIUNvbmNlcHRMaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0TGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFDb25jZXB0TGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29uY2VwdExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ1bGsoQ29uY2VwdExpc3QpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbnNCdWxrSW5NZW1vcnkoY29tcG9zaXRpb25faWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgRmluYWxDb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvc2l0aW9uX2lkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoY29tcG9zaXRpb25faWRzW2ldKTtcbiAgICAgICAgICAgIEZpbmFsQ29ubmVjdGlvbkxpc3QucHVzaCguLi5jb25uZWN0aW9uTGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZpbmFsQ29ubmVjdGlvbkxpc3Q7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRcIjtcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uXCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb24oaWQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgY29ubmVjdGlvbiBsaXN0IG9ubGluZVwiLCBjb25uZWN0aW9uTGlzdCk7XG4gICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aEFsbElkcyhpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoV2l0aFN1YkNvbXBvc2l0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uRnJvbU1lbW9yeShpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeShpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnY3JlYXRlZF9hdCddID0gY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkoaWQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2NyZWF0ZWRfYXQnXSA9IGNvbmNlcHQuZW50cnlUaW1lU3RhbXA7XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnlGcm9tQ29ubmVjdGlvbnMoaWQsIGNvbm5lY3Rpb25MaXN0KSB7XG4gICAgdmFyIGNvbm5lY3Rpb25MaXN0O1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gYXdhaXQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgRmluYWxSZXR1cm5bJ2lkJ10gPSBpZDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJiB0b0NvbmNlcHRJZCAhPSBudWxsICYmIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IHRvQ29uY2VwdC50eXBlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9Db25jZXB0VHlwZSA9PSBudWxsICYmIHRvQ29uY2VwdFR5cGVJZCAhPSBudWxsICYmIHRvQ29uY2VwdFR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbG1haW5TdHJpbmcgPSAoX2QgPSAoX2MgPSB0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsS2V5ID0gbG9jYWxtYWluU3RyaW5nLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIHRoZSBmYXVsdHkgY29ubmVjdGlvbiBcIiwgY29ubmVjdGlvbkxpc3RbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2hXaXRoU3ViQ29tcG9zaXRpb25zKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFtcImlkXCJdID0gaWQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJiB0b0NvbmNlcHRJZCAhPSBudWxsICYmIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbkJ1bGtcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhLCBHZXRDb25jZXB0QnVsayB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uV2l0aElkcyB9IGZyb20gXCIuL0NoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uXCI7XG5pbXBvcnQgeyBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeSB9IGZyb20gXCIuL0ZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrSW5NZW1vcnlcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbU1lbW9yeSwgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5IH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25cIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkJ1bGsoaWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrKGlkcyk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wID0geWllbGQgR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5KGlkc1tpXSk7XG4gICAgICAgICAgICBjb21wb3NpdGlvbnMucHVzaChjb21wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRpb25zO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uQnVsa1dpdGhEYXRhSWQoaWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrKGlkcyk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGlkc1tpXSk7XG4gICAgICAgICAgICBjb21wb3NpdGlvbnMucHVzaChjb21wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRpb25zO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZChpZHMgPSBbXSwgY29ubmVjdGlvbnMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBuZXdDb25uZWN0aW9ucyA9IHlpZWxkIEdldENvbm5lY3Rpb25CdWxrKGNvbm5lY3Rpb25zKTtcbiAgICAgICAgdmFyIG15TmV3Q29ubmVjdGlvbnMgPSBuZXdDb25uZWN0aW9ucztcbiAgICAgICAgdmFyIG9sZENvbm5lY3Rpb25zID0geWllbGQgRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbnNCdWxrSW5NZW1vcnkoaWRzKTtcbiAgICAgICAgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25XaXRoSWRzKGNvbm5lY3Rpb25zLCBvbGRDb25uZWN0aW9ucyk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGlkc1tpXSk7XG4gICAgICAgICAgICBjb21wb3NpdGlvbnMucHVzaChjb21wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRpb25zO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb25EYXRhUHJlZmV0Y2goY29ubmVjdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVtYWluaW5nQ29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zQWxsID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbihjb25uZWN0aW9uc1tpXSk7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nQ29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uc0FsbC5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmZXRjaENvbmNlcHRzID0gW107XG4gICAgICAgIGxldCBjb25uZWN0aW9uc0FsbExvY2FsID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsocmVtYWluaW5nQ29ubmVjdGlvbnMpO1xuICAgICAgICBjb25uZWN0aW9uc0FsbCA9IFsuLi5jb25uZWN0aW9uc0FsbExvY2FsXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb25uZWN0aW9uc0FsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgcHJlZmV0Y2hDb25jZXB0cy5wdXNoKGNvbm5lY3Rpb25zQWxsW2pdLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIHByZWZldGNoQ29uY2VwdHMucHVzaChjb25uZWN0aW9uc0FsbFtqXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ1bGsocHJlZmV0Y2hDb25jZXB0cyk7XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uc0FsbDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkZyb21Db25uZWN0aW9uc1dpdGhEYXRhSWRJbk9iamVjdChpZHMgPSBbXSwgY29ubmVjdGlvbnMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZW1haW5pbmdDb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbiA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb24oY29ubmVjdGlvbnNbaV0pO1xuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ0Nvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbnNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmZXRjaENvbmNlcHRzID0gW107XG4gICAgICAgIGxldCBjb25uZWN0aW9uc0FsbCA9IHlpZWxkIEdldENvbm5lY3Rpb25CdWxrKHJlbWFpbmluZ0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb25uZWN0aW9uc0FsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgcHJlZmV0Y2hDb25jZXB0cy5wdXNoKGNvbm5lY3Rpb25zQWxsW2pdLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIHByZWZldGNoQ29uY2VwdHMucHVzaChjb25uZWN0aW9uc0FsbFtqXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ1bGsocHJlZmV0Y2hDb25jZXB0cyk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJ0SElTIElTIFRIRSBTVEFSVFwiLCBpZHNbaV0pXG4gICAgICAgICAgICB2YXIgY29tcCA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeShpZHNbaV0pO1xuICAgICAgICAgICAgY29tcG9zaXRpb25zW2lkc1tpXV0gPSBjb21wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldEFsbENvbmNlcHRzQnlUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25jZXB0c0J5VHlwZVwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1wiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbCwgR2V0Q29tcG9zaXRpb25Mb2NhbFdpdGhJZCB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbU1lbW9yeSwgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5IH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25cIjtcbmltcG9ydCBHZXRDb25jZXB0QnlDaGFyYWN0ZXIgZnJvbSBcIi4vR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyXCI7XG5pbXBvcnQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwgZnJvbSBcIi4vTG9jYWwvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWxcIjtcbi8vIGdldCB0aGUgbGlzdCBvZiBjb21wb3NpdGlvbnMgZnJvbSB0aGUgdHlwZSBcbi8vIGZvciBlZyBnZXQgbGlzdCBvZiBib29tZ3B0XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0KGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3Rlcihjb21wb3NpdGlvbk5hbWUpO1xuICAgICAgICB2YXIgQ29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGlmIChjb25jZXB0KSB7XG4gICAgICAgICAgICB5aWVsZCBHZXRBbGxDb25jZXB0c0J5VHlwZShjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCk7XG4gICAgICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdHNCeVR5cGVJZEFuZFVzZXIoY29uY2VwdC5pZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBzdGFydFBhZ2UgPSBpbnBhZ2UgKiAocGFnZSAtIDEpO1xuICAgICAgICAgICAgdmFyIHByZWZldGNoQ29tcG9zaXRpb24gPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICBwcmVmZXRjaENvbXBvc2l0aW9uLnB1c2goY29uY2VwdExpc3RbaV0uaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsocHJlZmV0Y2hDb21wb3NpdGlvbik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRQYWdlOyBpIDwgc3RhcnRQYWdlICsgaW5wYWdlOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBvc2l0aW9uSnNvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uRnJvbU1lbW9yeShjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIENvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbXBvc2l0aW9uSnNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0QWxsKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgTG9jYWxDb21wb3NpdGlvbkxpc3QgPSBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbChjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCk7XG4gICAgICAgIGxldCBDb21wb3NpdGlvbkxpc3QgPSBHZXRDb21wb3NpdGlvbkxpc3QoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpO1xuICAgICAgICBsZXQgQWxsTGlzdCA9IFtdO1xuICAgICAgICBQcm9taXNlLnJhY2UoW0xvY2FsQ29tcG9zaXRpb25MaXN0LCBDb21wb3NpdGlvbkxpc3RdKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9taXNlIHJlc3VsdFwiLCByZXN1bHQpO1xuICAgICAgICAgICAgQWxsTGlzdC5wdXNoKC4uLnJlc3VsdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGhhbmRsaW5nXCIsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIENvbXBvc2l0aW9uTGlzdC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2Vjb25kIHByb21pc2UgcmVzdWx0XCIsIHJlc3VsdCk7XG4gICAgICAgICAgICBBbGxMaXN0LnB1c2goLi4ucmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBBbGxMaXN0O1xuICAgIH0pO1xufVxuLy8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uTGlzdEFsbFdpdGhJZChjb21wb3NpdGlvbk5hbWU6IHN0cmluZyx1c2VySWQ6bnVtYmVyLCAgaW5wYWdlOm51bWJlciA9IDEwLCBwYWdlOm51bWJlciA9MSl7XG4vLyAgICBsZXQgTG9jYWxDb21wb3NpdGlvbkxpc3QgPSAgYXdhaXQgR2V0Q29tcG9zaXRpb25MaXN0TG9jYWxXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpO1xuLy8gICAgY29uc29sZS5sb2coXCJ0YmlzIGlzIHRoZSBsb2NhbCBjb21wb3NpdGlvbiBsaXN0XCIsIExvY2FsQ29tcG9zaXRpb25MaXN0KTtcbi8vICAgIGxldCBDb21wb3NpdGlvbkxpc3QgPSAgICBhd2FpdCBHZXRDb21wb3NpdGlvbkxpc3RXaXRoSWQoY29tcG9zaXRpb25OYW1lLHVzZXJJZClcbi8vICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgb25saW5lIGNvbXBvc2l0aW9uIGxpc3RcIiwgQ29tcG9zaXRpb25MaXN0KTtcbi8vICAgIGxldCBBbGxMaXN0OiBhbnlbXSA9IFtdO1xuLy8gICAgLy8gUHJvbWlzZS5yYWNlKFtMb2NhbENvbXBvc2l0aW9uTGlzdCwgQ29tcG9zaXRpb25MaXN0XSlcbi8vICAgIC8vIC50aGVuKChyZXN1bHQpPT4ge1xuLy8gICAgLy8gICAgY29uc29sZS5sb2coXCJQcm9taXNlIHJlc3VsdFwiLCByZXN1bHQpO1xuLy8gICAgLy8gICAgQWxsTGlzdC5wdXNoKC4uLnJlc3VsdCk7XG4vLyAgICAvLyB9KVxuLy8gICAgLy8gLmNhdGNoKChlcnJvcik9Pntcbi8vICAgIC8vICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gaGFuZGxpbmdcIiwgZXJyb3IpO1xuLy8gICAgLy8gfSk7XG4vLyAgICAvLyBDb21wb3NpdGlvbkxpc3QudGhlbigocmVzdWx0KT0+e1xuLy8gICAgLy8gICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWNvbmQgcHJvbWlzZSByZXN1bHRcIiwgcmVzdWx0KTtcbi8vICAgIC8vICAgIEFsbExpc3QucHVzaCguLi5yZXN1bHQpO1xuLy8gICAgLy8gfSlcbi8vICAgIEFsbExpc3QucHVzaCguLi5Mb2NhbENvbXBvc2l0aW9uTGlzdCk7XG4vLyAgICBBbGxMaXN0LnB1c2goLi4uQ29tcG9zaXRpb25MaXN0KTtcbi8vICAgIHJldHVybiBBbGxMaXN0O1xuLy8gfVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uTGlzdEFsbFdpdGhJZChjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHRMb2NhbCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBjb25jZXB0T25saW5lID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgbGV0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGxldCBjb25jZXB0TGlzdExvY2FsID0gW107XG4gICAgICAgIGxldCBmaW5hbExvY2FsID0gW107XG4gICAgICAgIGxldCBjb25jZXB0TGlzdE9ubGluZSA9IFtdO1xuICAgICAgICBpZiAoY29uY2VwdExvY2FsLmlkICE9IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHRMaXN0TG9jYWwgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0TG9jYWwuaWQsIHVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHRPbmxpbmUuaWQgIT0gMCkge1xuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29uY2VwdHNCeVR5cGUoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdExpc3RPbmxpbmUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdHNCeVR5cGVJZEFuZFVzZXIoY29uY2VwdE9ubGluZS5pZCwgdXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHRMaXN0ID0gY29uY2VwdExpc3RPbmxpbmU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0TGlzdExvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaXNEdXBsaWNhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29uY2VwdExpc3RPbmxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdExpc3RMb2NhbFtpXS5naG9zdElkID09IGNvbmNlcHRMaXN0T25saW5lW2pdLmdob3N0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICBmaW5hbExvY2FsLnB1c2goY29uY2VwdExpc3RMb2NhbFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBhbGwgbGlzdFwiLCBmaW5hbExvY2FsKTtcbiAgICAgICAgbGV0IEFsbExpc3QgPSBbXTtcbiAgICAgICAgQWxsTGlzdCA9IHlpZWxkIEZvcm1hdFRoZUNvbmNlcHRzKGNvbmNlcHRMaXN0LCBmaW5hbExvY2FsLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICByZXR1cm4gQWxsTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3RXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbmNlcHRzQnlUeXBlKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UGFnZSA9IGlucGFnZSAqIChwYWdlIC0gMSk7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2hDb21wb3NpdGlvbiA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRUaGVDb25jZXB0cyhjb25jZXB0TGlzdCwgbG9jYWxDb25jZXB0TGlzdCwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IENvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgc3RhcnRQYWdlID0gaW5wYWdlICogKHBhZ2UgLSAxKTtcbiAgICAgICAgdmFyIHByZWZldGNoQ29tcG9zaXRpb24gPSBbXTtcbiAgICAgICAgbGV0IGxvY2FsQ29uY2VwdExlbmd0aCA9IGxvY2FsQ29uY2VwdExpc3QubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRQYWdlOyBpIDwgc3RhcnRQYWdlICsgaW5wYWdlIC0gbG9jYWxDb25jZXB0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbENvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25Mb2NhbFdpdGhJZChsb2NhbENvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgIENvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbXBvc2l0aW9uSnNvbik7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZSAtIGxvY2FsQ29uY2VwdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkxpc3QucHVzaChjb21wb3NpdGlvbkpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZVwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB2YXIgbGl0ZXJhbENoYXJhY3RlciA9IGAke2NoYXJhY3RlclZhbHVlfWA7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IChjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuaWQpID09IDApICYmIGxpdGVyYWxDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKGNoYXJhY3RlclZhbHVlLCA1MSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVXBkYXRlZChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgIHZhciBsaXRlcmFsQ2hhcmFjdGVyID0gYCR7Y2hhcmFjdGVyVmFsdWV9YDtcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgKGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC5pZCkgPT0gMCkgJiYgbGl0ZXJhbENoYXJhY3Rlcikge1xuICAgICAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb25CeUlkKGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uKGlkKTtcbiAgICAgICAgaWYgKChjb25uZWN0aW9uID09IG51bGwgfHwgY29ubmVjdGlvbi5pZCA9PSAwKSAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25TdHJpbmcgPSB5aWVsZCBHZXRDb25uZWN0aW9uKGlkKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgTG9jYWxDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbm5lY3Rpb25EYXRhXCI7XG5pbXBvcnQgeyBnZXRBbGxGcm9tTG9jYWxEYiB9IGZyb20gXCIuLi9EYXRhYmFzZS9pbmRleGRibG9jYWxcIjtcbmltcG9ydCB7IGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkIH0gZnJvbSBcIi4uL0RhdGFiYXNlL2luZGV4ZWRkYlwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldERhdGFGcm9tSW5kZXhEYigpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyB2YXIgY29uY2VwdExpc3QgPSBhd2FpdCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZChcImNvbmNlcHRcIik7XG4gICAgICAgIEdldENvbm5lY3Rpb25zRnJvbUluZGV4RGIoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coY29uY2VwdExpc3QpO1xuICAgICAgICAvLyBpZihBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSl7XG4gICAgICAgIC8vICAgICBmb3IodmFyIGk9MCA7aSA8IGNvbmNlcHRMaXN0Lmxlbmd0aCA7aSsrKXtcbiAgICAgICAgLy8gICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0TGlzdFtpXSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXREYXRhRnJvbUluZGV4RGJMb2NhbCgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyB2YXIgY29uY2VwdExpc3QgPSBhd2FpdCBnZXRBbGxGcm9tTG9jYWxEYihcImxvY2FsY29uY2VwdFwiKTtcbiAgICAgICAgR2V0Q29ubmVjdGlvbnNGcm9tSW5kZXhEYkxvY2FsKCk7XG4gICAgICAgIC8vIGlmKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKXtcbiAgICAgICAgLy8gICAgIGZvcih2YXIgaT0wIDtpIDwgY29uY2VwdExpc3QubGVuZ3RoIDtpKyspe1xuICAgICAgICAvLyAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBHZXRDb25uZWN0aW9uc0Zyb21JbmRleERiKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKFwiY29ubmVjdGlvblwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuQWRkQ29ubmVjdGlvblRvTWVtb3J5KGNvbm5lY3Rpb25MaXN0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gR2V0Q29ubmVjdGlvbnNGcm9tSW5kZXhEYkxvY2FsKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIGdldEFsbEZyb21Mb2NhbERiKFwibG9jYWxjb25uZWN0aW9uXCIpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBMb2NhbENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24oY29ubmVjdGlvbkxpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVcIjtcbmltcG9ydCB7IEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldENvbm5lY3Rpb25PZlRoZUNvbmNlcHRcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkgfSBmcm9tIFwiLi9HZXRDb21wb3NpdGlvblwiO1xuaW1wb3J0IEdldFRoZUNvbmNlcHQgZnJvbSBcIi4vR2V0VGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1wiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldExpbmsoaWQsIGxpbmtlciwgaW5wYWdlID0gMTAsIHBhZ2UgPSAxKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIGxpbmtTdHJpbmcgPSAoKF9hID0gY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiICsgXCJfXCIgKyBsaW5rZXI7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUobGlua1N0cmluZywgMTYpO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHQgPSByZWxhdGVkQ29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKHJlbGF0ZWRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdChyZWxhdGVkQ29uY2VwdC5pZCwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGlucGFnZSwgcGFnZSk7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIHZhciBwcmVmZXRjaCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByZWZldGNoLnB1c2goY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdElkID0gY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb21wb3NpdGlvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkodG9Db25jZXB0LmlkKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChuZXdDb21wb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rUmF3KGlkLCBsaW5rZXIsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciBsaW5rU3RyaW5nID0gKChfYSA9IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIiArIFwiX1wiICsgbGlua2VyO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKGxpbmtTdHJpbmcsIDE2KTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9Db25jZXB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc1RvVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNUb1RoZUNvbmNlcHRcIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rZXJDb25uZWN0aW9uRnJvbUNvbmNlcHRzKGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0geWllbGQgR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdChpZCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbm5lY3Rpb24gPSBjb25uZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uSWRlbnRpZmllciA9IGxvY2FsQ29ubmVjdGlvbi50eXBlSWQ7XG4gICAgICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbklkZW50aWZpZXIpO1xuICAgICAgICAgICAgbG9jYWxDb25uZWN0aW9uLnR5cGUgPSBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0cyhpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IHlpZWxkIEdldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0KGlkKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zW2ldO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25JZGVudGlmaWVyID0gbG9jYWxDb25uZWN0aW9uLnR5cGVJZDtcbiAgICAgICAgICAgIGxldCBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChjb25uZWN0aW9uSWRlbnRpZmllcik7XG4gICAgICAgICAgICBsb2NhbENvbm5lY3Rpb24udHlwZSA9IGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5IH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25cIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsgfSBmcm9tIFwiLi4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5IH0gZnJvbSBcIi4vQ29uY2VwdEZpbmRpbmcvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZWxhdGlvbihpZCwgcmVsYXRpb24sIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkocmVsYXRpb24pO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHQgPSByZWxhdGVkQ29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKHJlbGF0ZWRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdChyZWxhdGVkQ29uY2VwdC5pZCwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGlucGFnZSwgcGFnZSk7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIHZhciBwcmVmZXRjaCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByZWZldGNoLnB1c2goY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdElkID0gY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb21wb3NpdGlvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkQW5kRGF0ZUZyb21NZW1vcnkodG9Db25jZXB0LmlkKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChuZXdDb21wb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRSZWxhdGlvblJhdyhpZCwgcmVsYXRpb24sIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkocmVsYXRpb24pO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHQgPSByZWxhdGVkQ29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKHJlbGF0ZWRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdChyZWxhdGVkQ29uY2VwdC5pZCwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGlucGFnZSwgcGFnZSk7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1N0cmluZztcbiAgICAgICAgICAgIHZhciBwcmVmZXRjaCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByZWZldGNoLnB1c2goY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b0NvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRcIjtcbmltcG9ydCB7IGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQsIEdldFVzZXJHaG9zdElkIH0gZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHZXRUaGVDb25jZXB0KGlkLCB1c2VySWQgPSA5OTkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGlmIChpZCA8IDApIHtcbiAgICAgICAgICAgIGxldCBsY29uY2VwdCA9IHlpZWxkIEdldFVzZXJHaG9zdElkKHVzZXJJZCwgaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQobGNvbmNlcHQpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgY29uY2VwdC5pZCA9PSAwKSAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIGlmIChjb25jZXB0LnR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0VHlwZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdFR5cGUgPT0gbnVsbCAmJiBjb25jZXB0LnR5cGVJZCAhPSBudWxsICYmIGNvbmNlcHQudHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHR5cGVDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0QWlEYXRhIH0gZnJvbSBcIi4uL0FwaS9HZXRBaURhdGFcIjtcbmltcG9ydCB7IFNldHRpbmdEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdEYXRhXCI7XG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TZXR0aW5nc1wiO1xuaW1wb3J0IHsgQWlVcGRhdGVGbGFnLCBHZXRTdGF0c0Zyb21EYXRhYmFzZSB9IGZyb20gXCIuLi9EYXRhYmFzZS9pbmRleGVkZGJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEluaXRpYWxpemVTeXN0ZW0oZW5hYmxlQWkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKGVuYWJsZUFpKSB7XG4gICAgICAgICAgICB2YXIgc3RhdHNEYXRhID0geWllbGQgR2V0U3RhdHNGcm9tRGF0YWJhc2UoKTtcbiAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHN0YXRzRGF0YTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5pc09ubGluZVN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFpRGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFB1cmdhdG9yeURhdGFiYXNlVXBkYXRlZCgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBTZXR0aW5ncy5pc09ubGluZVN5bmMgPSB0cnVlO1xuICAgICAgICB2YXIgc2V0dGluZ0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEoU2V0dGluZ3MuaXNPbmxpbmVTeW5jKTtcbiAgICAgICAgQWlVcGRhdGVGbGFnKHNldHRpbmdEYXRhKTtcbiAgICB9KTtcbn1cbiIsImltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdChsY29uY2VwdCkge1xuICAgIGxldCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICBjb25jZXB0LmlkID0gbGNvbmNlcHQuaWQ7XG4gICAgY29uY2VwdC5naG9zdElkID0gbGNvbmNlcHQuZ2hvc3RJZDtcbiAgICBjb25jZXB0LmFjY2Vzc0lkID0gbGNvbmNlcHQuYWNjZXNzSWQ7XG4gICAgY29uY2VwdC5jYXRlZ29yeUlkID0gbGNvbmNlcHQuY2F0ZWdvcnlJZDtcbiAgICBjb25jZXB0LnR5cGVJZCA9IGxjb25jZXB0LnR5cGVJZDtcbiAgICBjb25jZXB0LnR5cGUgPSBsY29uY2VwdC50eXBlO1xuICAgIGNvbmNlcHQuZW50cnlUaW1lU3RhbXAgPSBsY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICBjb25jZXB0LnVzZXJJZCA9IGxjb25jZXB0LnVzZXJJZDtcbiAgICBjb25jZXB0LmNoYXJhY3RlclZhbHVlID0gbGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgcmV0dXJuIGNvbmNlcHQ7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmV4cG9ydCBmdW5jdGlvbiBDb252ZXJ0RnJvbUxDb25uZWN0aW9uVG9Db25uZWN0aW9uKGxjb25uZWN0aW9uKSB7XG4gICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gbGNvbm5lY3Rpb24ub2ZUaGVDb25jZXB0SWQ7XG4gICAgY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZCA9IGxjb25uZWN0aW9uLnRvVGhlQ29uY2VwdElkO1xuICAgIGNvbm5lY3Rpb24udHlwZUlkID0gbGNvbm5lY3Rpb24udHlwZUlkO1xuICAgIGNvbm5lY3Rpb24ub3JkZXJJZCA9IGxjb25uZWN0aW9uLm9yZGVySWQ7XG4gICAgY29ubmVjdGlvbi5pZCA9IGxjb25uZWN0aW9uLmlkO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwsIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzTG9jYWwob2ZUaGVDb25jZXB0LCB0b1RoZUNvbmNlcHQsIGxpbmtlciwgYm90aCA9IGZhbHNlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgdXNlcklkID0gb2ZUaGVDb25jZXB0LnVzZXJJZDtcbiAgICAgICAgaWYgKGJvdGgpIHtcbiAgICAgICAgICAgIGxldCBwcmVmaXgxID0gKChfYSA9IHRvVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICAgICAgbGV0IGxpbmtlckFkZDEgPSBsaW5rZXIgKyBcIl9ieVwiO1xuICAgICAgICAgICAgbGV0IGJhY2t3YXJkTGlua2VyID0gcHJlZml4MSArIFwiX1wiICsgbGlua2VyQWRkMTtcbiAgICAgICAgICAgIC8vIGlmKGNvdW50KXtcbiAgICAgICAgICAgIC8vICAgIGF3YWl0IENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZDEsIHRvVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZSA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChcImNvbm5lY3Rpb25cIiwgYmFja3dhcmRMaW5rZXIsIGZhbHNlLCA5OTksIDk5OSwgOTk5KTtcbiAgICAgICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKHRvVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LmlkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UuaWQsIDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmaXggPSAoKF9iID0gb2ZUaGVDb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCI7XG4gICAgICAgIGxldCBsaW5rZXJBZGQgPSBsaW5rZXIgKyBcIl9zXCI7XG4gICAgICAgIGxldCBmb3J3YXJkTGlua2VyID0gcHJlZml4ICsgXCJfXCIgKyBsaW5rZXJBZGQ7XG4gICAgICAgIC8vIGlmKGNvdW50KXtcbiAgICAgICAgLy8gLy8gYXdhaXQgQ291bnRSZWxhdGlvbnNoaXAobGlua2VyQWRkLCBvZlRoZUNvbmNlcHQsIHVzZXJJZCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKG9mVGhlQ29uY2VwdC5pZCwgdG9UaGVDb25jZXB0LmlkLCBjb25uZWN0aW9uQ29uY2VwdC5pZCwgMTAwMCk7XG4gICAgICAgIHJldHVybiBuZXdDb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgTENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKSB7XG4gICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICBsZXQgY29uY2VwdCA9IG5ldyBMQ29uY2VwdCgwLCAwLCAwLCAwLCAwLCBcIjBcIiwgXCIwXCIsIGZhbHNlLCBjcmVhdGVkX29uLCB1cGRhdGVkX29uLCAwKTtcbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgZ2V0QWxsRnJvbUxvY2FsRGIgfSBmcm9tIFwiLi4vLi4vRGF0YWJhc2UvaW5kZXhkYmxvY2FsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBnZXRBbGxGcm9tTG9jYWxEYihcImxvY2FsY29uY2VwdFwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0VG9NZW1vcnkoY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG5vZGUgPSBuZXcgTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBMb2NhbEJpbmFyeVRyZWUuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tIFwiLi4vTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0XCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwgfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25uZWN0aW9uTG9jYWxcIjtcbmltcG9ydCB7IE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCB9IGZyb20gXCIuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbFwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwoanNvbiwgb2ZUaGVDb25jZXB0SWQgPSBudWxsLCBvZlRoZUNvbmNlcHRVc2VySWQgPSBudWxsLCBtYWluS2V5ID0gbnVsbCwgdXNlcklkID0gbnVsbCwgYWNjZXNzSWQgPSBudWxsLCBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IG51bGwsIGF1dG9tYXRpY1N5bmMgPSBmYWxzZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgdmFyIGxvY2FsQWNjZXNzSWQgPSBhY2Nlc3NJZCAhPT0gbnVsbCAmJiBhY2Nlc3NJZCAhPT0gdm9pZCAwID8gYWNjZXNzSWQgOiA5OTk7XG4gICAgICAgIHZhciBsb2NhbFNlc3Npb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSBudWxsICYmIHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSB2b2lkIDAgPyBzZXNzaW9uSW5mb3JtYXRpb25JZCA6IDk5OTtcbiAgICAgICAgdmFyIE1haW5LZXlMb2NhbCA9IG1haW5LZXkgIT09IG51bGwgJiYgbWFpbktleSAhPT0gdm9pZCAwID8gbWFpbktleSA6IDA7XG4gICAgICAgIHZhciBNYWluQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGpzb25ba2V5XSAhPSAnc3RyaW5nJyAmJiB0eXBlb2YganNvbltrZXldICE9ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkID09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwoa2V5LCBcIlwiLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIE1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxNYWluS2V5ID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbktleUxvY2FsID0gY29uY2VwdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwoa2V5LCBcIlwiLCB0cnVlLCBsb2NhbFVzZXJJZCwgbG9jYWxBY2Nlc3NJZCwgbG9jYWxTZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChvZlRoZSwgY29uY2VwdC5pZCwgbG9jYWxNYWluS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgdmFyIG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxNYWluS2V5ID0gTWFpbktleUxvY2FsO1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwganNvbltrZXldLCBmYWxzZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKG9mVGhlLCBjb25jZXB0LmlkLCBsb2NhbE1haW5LZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYWluQ29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHRcIjtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IHN0b3JlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9pbmRleGRibG9jYWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHRMb2NhbChyZWZlcmVudCwgdHlwZWNoYXJhY3RlciwgdXNlcklkLCBjYXRlZ29yeUlkLCB0eXBlSWQsIGFjY2Vzc0lkLCBpc0NvbXBvc2l0aW9uID0gZmFsc2UsIHJlZmVyZW50SWQgPSAwKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0gLU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgICAgIHZhciBpc05ldyA9IHRydWU7XG4gICAgICAgIGxldCBjcmVhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAocmVmZXJlbnQgPT0gXCJ0aGVcIikge1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBuZXcgTENvbmNlcHQoMSwgOTk5LCA1LCA1LCBhY2Nlc3NJZCwgcmVmZXJlbnQsIHR5cGVjaGFyYWN0ZXIsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uLCByZWZlcmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0gbmV3IExDb25jZXB0KGlkLCB1c2VySWQsIHR5cGVJZCwgY2F0ZWdvcnlJZCwgYWNjZXNzSWQsIHJlZmVyZW50LCB0eXBlY2hhcmFjdGVyLCBpc05ldywgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbiwgcmVmZXJlbnRJZCk7XG4gICAgICAgIGNvbmNlcHQuaXNUZW1wID0gdHJ1ZTtcbiAgICAgICAgY29uY2VwdC5pc0NvbXBvc2l0aW9uID0gaXNDb21wb3NpdGlvbjtcbiAgICAgICAgTG9jYWxDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25jZXB0XCIsIGNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb25cIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL2luZGV4ZGJsb2NhbFwiO1xuaW1wb3J0IHsgTG9jYWxTeW5jRGF0YSB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwob2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQgPSAxLCB0eXBlU3RyaW5nID0gXCJcIikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIGxldCByYW5kb21pZCA9IC1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgICAgICBsZXQgcmVhbE9mVGhlQ29uY2VwdElkID0gMDtcbiAgICAgICAgbGV0IHJlYWxUb1RoZUNvbmNlcHRJZCA9IDA7XG4gICAgICAgIGxldCByZWFsVHlwZUlkID0gMDtcbiAgICAgICAgcmVhbE9mVGhlQ29uY2VwdElkID0gb2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgIHJlYWxUb1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICByZWFsVHlwZUlkID0gdHlwZUlkO1xuICAgICAgICBsZXQgY29ubmVjdGlvbiA9IG5ldyBMQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkICE9IHRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uID0gbmV3IExDb25uZWN0aW9uKHJhbmRvbWlkLCByZWFsT2ZUaGVDb25jZXB0SWQsIHJlYWxUb1RoZUNvbmNlcHRJZCwgdHlwZUlkLCBvcmRlcklkLCBhY2Nlc3NJZCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmlzVGVtcCA9IHRydWU7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnR5cGVDaGFyYWN0ZXIgPSB0eXBlU3RyaW5nO1xuICAgICAgICAgICAgTG9jYWxDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgTG9jYWxTeW5jRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkxvY2FsLCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkIH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25Mb2NhbFwiO1xuaW1wb3J0IEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsIGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wb3NpdGlvbkpzb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbkxvY2FsKGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkxpc3QucHVzaChjb21wb3NpdGlvbkpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0TG9jYWxXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdExpc3QgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wb3NpdGlvbkpzb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkKGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICBDb21wb3NpdGlvbkxpc3QucHVzaChjb21wb3NpdGlvbkpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb3NpdGlvbkxpc3Q7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTG9jYWxUb1JlYWwgfSBmcm9tIFwiLi4vLi4vQXBpL1RyYW5zbGF0ZS9UcmFuc2xhdGVMb2NhbFRvUmVhbFwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb24gfSBmcm9tIFwiLi4vR2V0Q29tcG9zaXRpb25cIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgbGV0IHJlYWxDb25jZXB0ID0geWllbGQgVHJhbnNsYXRlTG9jYWxUb1JlYWwoaWQpO1xuICAgICAgICAgICAgaWYgKHJlYWxDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCBHZXRDb21wb3NpdGlvbihyZWFsQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHJldHVybk91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBMb2NhbENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcInRvcFwiO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIEZpbmFsUmV0dXJuWydkYXRhJ10gPSByZXR1cm5PdXRwdXQ7XG4gICAgICAgIEZpbmFsUmV0dXJuWydpZCddID0gaWQ7XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGFycm91dHB1dCA9IFtdO1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gY29uY2VwdC50eXBlSWQ7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGUgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2aXNpdGVkQ29uY2VwdHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2aXNpdGVkQ29uY2VwdHMucHVzaChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwidG9wXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaExvY2FsKHRvQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hMb2NhbCh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldExvY2FsQ29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUgfSBmcm9tIFwiLi4vLi4vQXBpL0xvY2FsL0dldExvY2FsQ29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVcIjtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCwgU3BsaXRTdHJpbmdzIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJWYWx1ZSwgNTEpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKGNoYXJhY3Rlcikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBsY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09IFwidGhlXCIpIHtcbiAgICAgICAgICAgIGxjb25jZXB0LmlkID0gMTtcbiAgICAgICAgICAgIGxjb25jZXB0LnR5cGVJZCA9IDU7XG4gICAgICAgICAgICBsY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSA9IFwidGhlXCI7XG4gICAgICAgICAgICByZXR1cm4gbGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3MoY2hhcmFjdGVyKTtcbiAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IGNhdGVnb3J5ID0gMTtcbiAgICAgICAgICAgIGxldCBwcmVmaXggPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0pO1xuICAgICAgICAgICAgaWYgKHByZWZpeC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSBwcmVmaXguaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNhdGVnb3J5QW5kQ2hhcmFjdGVyTG9jYWxNZW1vcnkoY2hhcmFjdGVyLCBjYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3BsaXR0ZWRTdHJpbmdBcnJheVswXSA9PSBjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIGxjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwoY2hhcmFjdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2F0ZWdvcnlBbmRDaGFyYWN0ZXJMb2NhbE1lbW9yeSh2YWx1ZSwgY2F0ZWdvcnlJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25jZXB0ID0gTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbCh2YWx1ZSwgY2F0ZWdvcnlJZCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsRnVsbChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgdmFyIGxpdGVyYWxDaGFyYWN0ZXIgPSBgJHtjaGFyYWN0ZXJWYWx1ZX1gO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCAoY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmlkKSA9PSAwKSAmJiBsaXRlcmFsQ2hhcmFjdGVyKSB7XG4gICAgICAgICAgICB5aWVsZCBHZXRMb2NhbENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWwob2ZUaGVDb25jZXB0LCB0eXBlSWQsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25uZWN0aW9ucyA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbk9mQ29tcG9zaXRpb25BbmRUeXBlTG9jYWwodHlwZUlkLCBvZlRoZUNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uTG9jYWwsIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5TG9jYWwgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWwgfSBmcm9tIFwiLi9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0TG9jYWxcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZWxhdGlvbkxvY2FsKGlkLCByZWxhdGlvbiwgdXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHR5cGVDb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbChyZWxhdGlvbik7XG4gICAgICAgIGxldCBsb2NhbENvbm5lY3Rpb25zID0gW107XG4gICAgICAgIGlmICh0eXBlQ29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBsb2NhbENvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdExvY2FsKGlkLCB0eXBlQ29uY2VwdC5pZCwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0cHV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxDb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbkxvY2FsKGxvY2FsQ29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goY29tcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0LCBHZXRUaGVDb25jZXB0IH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHsgY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdCB9IGZyb20gXCIuLi9Db252ZXJzaW9uL0NvbnZlcnRDb25jZXB0c1wiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldFRoZUNvbmNlcHRMb2NhbChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBsY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgICAgICBsY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGxjb25jZXB0ID0gY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0TG9jYWwgZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ29uY2VwdExvY2FsKHJlZmVyZW50LCB0eXBlQ2hhcmFjdGVyLCB1c2VySWQsIGNhdGVnb3J5SWQsIHR5cGVJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKHJlZmVyZW50LCB0eXBlSWQpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIGxldCBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIGlmICh0eXBlQ2hhcmFjdGVyID09IFwidGhlXCIpIHtcbiAgICAgICAgICAgIGNhdGVnb3J5SWQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGVDaGFyYWN0ZXIsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUlkLCBhY2Nlc3NJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IENyZWF0ZVRoZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0TG9jYWxcIjtcbmltcG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsIH0gZnJvbSBcIi4vTWFrZVRoZVR5cGVMb2NhbFwiO1xuaW1wb3J0IHsgTG9jYWxDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgTG9jYWxTeW5jRGF0YSB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwodHlwZSwgcmVmZXJlbnQsIGNvbXBvc2l0aW9uID0gZmFsc2UsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5LCByZWZlcmVudElkID0gMCkge1xuICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCwgYWNjZXNzSWQ7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSA5OTk7XG4gICAgICAgIHZhciBjYXRlZ29yeUlkID0gNDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgYWNjZXNzSWQgPSA0O1xuICAgICAgICB2YXIgc3RyaW5nVG9DaGVjayA9IFwiXCI7XG4gICAgICAgIHZhciBzdHJpbmdMZW5ndGggPSByZWZlcmVudC5sZW5ndGg7XG4gICAgICAgIHZhciB0eXBlQ29uY2VwdDtcbiAgICAgICAgdmFyIGNvbmNlcHQ7XG4gICAgICAgIHZhciBzdGFydHNXaXRoVGhlID0gdHlwZS5zdGFydHNXaXRoKFwidGhlX1wiKTtcbiAgICAgICAgaWYgKHN0YXJ0c1dpdGhUaGUpIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IFwidGhlX1wiICsgdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHR5cGUsIHNlc3Npb25JbmZvcm1hdGlvbklkLCB1c2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGUsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkLCB0cnVlLCByZWZlcmVudElkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3RyaW5nVG9DaGVjaywgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRMb2NhbChyZWZlcmVudCwgc3RyaW5nVG9DaGVjaywgdXNlcklkLCBjYXRlZ29yeUlkLCB0eXBlQ29uY2VwdC5pZCwgYWNjZXNzSWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbChzdHJpbmdUb0NoZWNrLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIHZhciBjb25jZXB0QnlDaGFyVHlwZVN0cmluZyA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChyZWZlcmVudCwgdHlwZUNvbmNlcHQuaWQpO1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRUeXBlQ2hhcmFjdGVyID0gY29uY2VwdEJ5Q2hhclR5cGVTdHJpbmc7XG4gICAgICAgICAgICAvLyB2YXIgbWFrZVRoZU5hbWVTdHJpbmcgPSBhd2FpdCBNYWtlVGhlTmFtZShyZWZlcmVudCx1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsY29uY2VwdFR5cGVDaGFyYWN0ZXIgKTtcbiAgICAgICAgICAgIC8vIHZhciBtYWtlVGhlTmFtZUNvbmNlcHQgPSBtYWtlVGhlTmFtZVN0cmluZyBhcyBDb25jZXB0O1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRUeXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRUeXBlQ2hhcmFjdGVyLmlkID09IDAgJiYgY29uY2VwdFR5cGVDaGFyYWN0ZXIudXNlcklkID09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRMb2NhbChyZWZlcmVudCwgc3RyaW5nVG9DaGVjaywgdXNlcklkLCBjYXRlZ29yeUlkLCB0eXBlQ29uY2VwdC5pZCwgYWNjZXNzSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbmNlcHQudHlwZSA9IHR5cGVDb25jZXB0O1xuICAgICAgICBMb2NhbFN5bmNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgQ3JlYXRlVGhlQ29uY2VwdExvY2FsIGZyb20gXCIuL0NyZWF0ZVRoZUNvbmNlcHRMb2NhbFwiO1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbCB9IGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsXCI7XG5pbXBvcnQgeyBTcGxpdFN0cmluZ3MgfSBmcm9tIFwiLi4vU3BsaXRTdHJpbmdzXCI7XG5pbXBvcnQgTWFrZVRoZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9NYWtlVGhlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwodHlwZVN0cmluZywgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgICAgICB2YXIgZXhpc3RpbmdDb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlMb2NhbCh0eXBlU3RyaW5nKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdCkge1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdC5pZCA9PSAwIHx8IGV4aXN0aW5nQ29uY2VwdC51c2VySWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzcGxpdHRlZFN0cmluZ0FycmF5ID0gU3BsaXRTdHJpbmdzKHR5cGVTdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5WzBdID09IHR5cGVTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlQ29uY2VwdExvY2FsKHR5cGVTdHJpbmcsIFwidGhlXCIsIHVzZXJJZCwgMSwgNTEpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGNhdGVnb3J5Q29uY2VwdCA9IGF3YWl0IE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0sIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIHR5cGVDb25jZXB0ID0gYXdhaXQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3BsaXR0ZWRTdHJpbmdBcnJheVsxXSwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYodHlwZUNvbmNlcHQpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlDb25jZXB0ID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3BsaXR0ZWRTdHJpbmdBcnJheVswXSwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbChzcGxpdHRlZFN0cmluZ0FycmF5WzFdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdExvY2FsKHR5cGVTdHJpbmcsIHNwbGl0dGVkU3RyaW5nQXJyYXlbMV0sIHVzZXJJZCwgY2F0ZWdvcnlDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC5pZCwgYWNjZXNzSWQpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9jYWxTeW5jRGF0YS5BZGRDb25jZXB0KGV4aXN0aW5nQ29uY2VwdCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBJbnNlcnRVbmlxdWVOdW1iZXIgZnJvbSAnLi4vLi4vSGVscGVycy9VbmlxdWVJbnNlcnQnO1xuaW1wb3J0IHsgQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluTENvbm5lY3Rpb25BcnJheSwgQ2hlY2tJZlR5cGVMQ29uY2VwdHNFeGlzdHNJbkFycmF5LCB9IGZyb20gJy4uLy4uL0hlbHBlcnMvQ2hlY2tJZkV4aXN0cyc7XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24gfSBmcm9tICcuLi8uLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uJztcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gJy4vLi4vR2V0VGhlQ29uY2VwdCc7XG5pbXBvcnQgeyBEZWxldGVDb25uZWN0aW9uQnlJZCB9IGZyb20gJy4vLi4vRGVsZXRlQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhJztcbmltcG9ydCB7IENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL0NyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwnO1xuaW1wb3J0IHsgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsIH0gZnJvbSAnLi9NYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwnO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0LCBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwgfSBmcm9tICcuLi8uLi9hcHAnO1xuaW1wb3J0IHsgY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdCwgY29udmVydEZyb21Db25uZWN0aW9uVG9MQ29ubmVjdGlvbiB9IGZyb20gJy4uL0NvbnZlcnNpb24vQ29udmVydENvbmNlcHRzJztcbi8vIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgY2FjaGUgY29tcG9zaXRpb25cbmV4cG9ydCBmdW5jdGlvbiBVcGRhdGVDb21wb3NpdGlvbkxvY2FsKHBhdGNoZXJTdHJ1Y3R1cmUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBkZWZhdWx0IHVzZXJJZCwgc2Vzc2lvbklkLCBhY2Nlc3NJZCBwYXNzZWQgYnkgdGhlIHBhdGNoZXJTdHJ1Y3R1cmVcbiAgICAgICAgY29uc3QgdXNlcklkID0gcGF0Y2hlclN0cnVjdHVyZS51c2VySWQ7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuc2Vzc2lvbklkO1xuICAgICAgICBjb25zdCBhY2Nlc3NJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuYWNjZXNzSWQ7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgbGV0IHBhcmVudENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgY29uc3QgdG9EZWxldGVDb25jZXB0cyA9IFtdO1xuICAgICAgICAvLyB0aGUgbWFpbiBjb21wb3NpdGlvbiBJZCB0aGF0IGhhcyB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHBhdGNoZWRcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25JZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuY29tcG9zaXRpb25JZDtcbiAgICAgICAgLy8gaWYgeW91IHdhbnQgdG8gZWRpdCB0aGUgc3ViY29tcG9zaXRpb25zIG9mIHRoZSBjb21wb3NpdGlvbiB0aGVuIHlvdSBoYXZlIHRvIHBhc3MgdG8gdGhpc1xuICAgICAgICBjb25zdCBvZlRoZUNvbmNlcHRJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUub2ZUaGVDb21wb3NpdGlvbklkO1xuICAgICAgICBsZXQgdG9EZWxldGVDb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICAvLyBnZXQgYWxsIGNvbm5lY3Rpb25zIGZyb20gdGhlIGJhY2tlbmQgYmVjYXVzZSBpdCBuZWVkcyBsYXRlc3QgZGF0YVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihjb21wb3NpdGlvbklkKTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0T3JpZ2luYWwgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdE9yaWdpbmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbnZlcnRGcm9tQ29ubmVjdGlvblRvTENvbm5lY3Rpb24oY29ubmVjdGlvbkxpc3RPcmlnaW5hbFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbmNlcHRJZExpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIC8vIHB1dCB0aGlzIGluIHRoZSB1cHBlciBzZWN0aW9uIGJlZm9yZSB1cGRhdGluZyBiZWNhdXNlIHRoaXMgd2lsbCB0ZWxsIGFsbCBvdGhlciBkaXN0cmlidXRlZFxuICAgICAgICAvL3NlcnZlcnMgdG8gZGVzdHJveSB0aGUgY29weSBvZiB0aGUgY29tcG9zaXRpb24gdGhhdCB0aGV5IGhhdmUgYXMgbmV3IGNvbXBvc2l0aW9uIGlzIGNvbWluZyB1cFxuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjb25uZWN0aW9ucyB0aGF0IGFyZSBpbnNpZGUgb2YgdGhlIGNvbXBvc2l0aW9uIGFuZCBzdG9yZSB0aGVtIGluXG4gICAgICAgIGxldCBhbGxDb25jZXB0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29tcG9zaXRpb25MaXN0LCBjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29uY2VwdElkTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgSW5zZXJ0VW5pcXVlTnVtYmVyKGNvbmNlcHRJZExpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIGFsbENvbmNlcHRzLnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNvbmNlcHRzIHRoYXQgYXJlIGluc2lkZSBvZiB0aGUgY29tcG9zaXRpb24gYW5kIHN0b3JlIHRoZW0gaW4gYSBjb25jZXB0TGlzdFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRJZExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbmNlcHRJZExpc3RbaV0pO1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JZCA9PSBjb25jZXB0SWRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb24gPSBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkID09IGNvbmNlcHRJZExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25jZXB0ID0gY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmNlcHRMaXN0LnB1c2goY29udmVydEZyb21Db25jZXB0VG9MQ29uY2VwdChjb25jZXB0KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IHRyeWluZyB0byBwYXRjaCB0aGUgbmV3IG9iamVjdCBpbnRvIHRoZSBjb21wb3NpdGlvblxuICAgICAgICBjb25zdCBvYmplY3QgPSBwYXRjaGVyU3RydWN0dXJlLnBhdGNoT2JqZWN0O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIGxldCBpbnNlcnRpbmdDb25jZXB0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29uY2VwdCA9IGNvbXBvc2l0aW9uO1xuICAgICAgICAgICAgLy8gaWYgdGhlIGltbWVkaWRhdGUgcGFyZW50IGV4aXN0cyBpbiB0aGUgY29tcG9zaXRpb24gKGkuZS4gZm9yIG11bHRpbGV2ZWwgY29tcG9zaXRpb24pXG4gICAgICAgICAgICBpZiAocGFyZW50Q29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbENvbmNlcHQgPSBwYXJlbnRDb25jZXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGluc2VydGluZ0NvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwoa2V5LCBcIlwiLCB0cnVlLCBjb21wb3NpdGlvbi51c2VySWQsIDQsIDk5OSk7XG4gICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChvYmplY3Rba2V5XSwgaW5zZXJ0aW5nQ29uY2VwdC5pZCwgaW5zZXJ0aW5nQ29uY2VwdC51c2VySWQsIGNvbXBvc2l0aW9uLmlkLCBjb21wb3NpdGlvbi51c2VySWQsIDQsIDk5OSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSBuZXcgY29uY2VwdCBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW5nQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChrZXksIHZhbHVlLCBmYWxzZSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25jZXB0IGV4aXN0cyBpbiB0aGUgY29uY2VwdCBsaXN0IGJlY2F1c2UgaWYgaXQgZXhpc3RzIHRoZW4gd2UgaGF2ZSB0byBkZWxldGUgb2xkIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IEV4aXN0aW5nQ29uY2VwdHMgPSBDaGVja0lmVHlwZUxDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QsIGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICAgICAgLy8gaWYgdGhlIGV4aXN0aW5nIGNvbmNlcHQgdGhlbiBzdGFydCB0aGUgcHJvY2VzcyBmb3IgZGVsZXRpbmcgdGhlIGNvbmNlcHQgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRXhpc3RpbmdDb25jZXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChFeGlzdGluZ0NvbmNlcHRzW2ldLmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGluZ0Nvbm5lY3Rpb25zID0gQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluTENvbm5lY3Rpb25BcnJheShjb25uZWN0aW9uTGlzdCwgRXhpc3RpbmdDb25jZXB0c1tpXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29ubmVjdGlvbnMgPSB0b0RlbGV0ZUNvbm5lY3Rpb25zLmNvbmNhdChkZWxldGluZ0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25jZXB0cy5wdXNoKEV4aXN0aW5nQ29uY2VwdHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBuZXcgY29uY2VwdCBhbmQgdGhlIG9sZCBjb21wb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChsb2NhbENvbmNlcHQuaWQsIGluc2VydGluZ0NvbmNlcHQuaWQsIGNvbXBvc2l0aW9uLmlkLCAyKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChpbnNlcnRpbmdDb25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgeW91IGhhdmUgdG8gZGVsZXRlIHRoZSBjb25uZWN0aW9uIGluIGJ1bGtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b0RlbGV0ZUNvbm5lY3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgZnJvbSB0aGUgY2FjaGUgbGlzdFxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSBjb25uZWN0aW9uIGluIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICBEZWxldGVDb25uZWN0aW9uQnlJZCh0b0RlbGV0ZUNvbm5lY3Rpb25zW2pdLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBTeW5jRGF0YS5TeW5jRGF0YU9ubGluZSgpO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgTWFrZVRoZUNoYXJhY3RlckRhdGEgZnJvbSBcIi4vTWFrZVRoZUNoYXJhY3RlckRhdGFcIjtcbmltcG9ydCBNYWtlVGhlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlQ29uY2VwdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWFrZVRoZUNoYXJhY3Rlcih0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkKSB7XG4gICAgdmFyIGFjY2Vzc1VzZXJJZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIHZhciB0eXBlSWQgPSA1MTtcbiAgICAgICAgdmFyIHR5cGVVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgcmVmZXJlbnRVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBsZW5ndGhPZkNoYXJhY3RlcnMgPSB0aGVfY2hhcmFjdGVyX2RhdGEubGVuZ3RoO1xuICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgaWYgKGxlbmd0aE9mQ2hhcmFjdGVycyA9PSAxKSB7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbnRJZCA9IHRoZV9jaGFyYWN0ZXJfZGF0YS5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgdmFyIHR5cGVJZEZvckNoYXJhY3RlciA9IDQ5O1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlckRhdGFTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ2hhcmFjdGVyRGF0YSh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gTWFrZVRoZUNvbmNlcHQodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgdHlwZUlkRm9yQ2hhcmFjdGVyLCB0eXBlVXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjaGFyYWN0ZXJEYXRhU3RyaW5nID0geWllbGQgTWFrZVRoZUNoYXJhY3RlckRhdGEodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIHNlY3VyaXR5SWQsIGFjY2Vzc0lkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlckRhdGEgPSBjaGFyYWN0ZXJEYXRhU3RyaW5nO1xuICAgICAgICAgICAgaWYgKGNoYXJhY3RlckRhdGEuaXNOZXcpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVDb25jZXB0KHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjaGFyYWN0ZXJEYXRhLmlkLCBjaGFyYWN0ZXJEYXRhLnVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVDb25jZXB0KHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjaGFyYWN0ZXJEYXRhLmlkLCBjaGFyYWN0ZXJEYXRhLnVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZVRoZUNoYXJhY3RlciB9IGZyb20gXCIuLi9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNoYXJhY3RlclwiO1xuaW1wb3J0IHsgVGhlQ2hhcmFjdGVyIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1RoZUNoYXJhY3RlclwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWFrZVRoZUNoYXJhY3RlckRhdGEodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIHNlY3VyaXR5SWQsIGFjY2Vzc0lkLCBzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHRoZUNoYXJhY3RlciA9IG5ldyBUaGVDaGFyYWN0ZXIodXNlcklkLCB0aGVfY2hhcmFjdGVyX2RhdGEsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgXCJcIiwgZmFsc2UpO1xuICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgQ3JlYXRlVGhlQ2hhcmFjdGVyKHRoZUNoYXJhY3Rlcik7XG4gICAgICAgIHZhciByZXR1cm5lciA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlXCI7XG5pbXBvcnQgQ3JlYXRlVGhlQ29uY2VwdCBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUocmVmZXJlbnQsIHR5cGVJZCk7XG4gICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUZXh0RGF0YSB9IGZyb20gXCIuLi9BcGkvQ3JlYXRlL0NyZWF0ZVRoZVRleHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlXCI7XG5pbXBvcnQgeyBNYWtlVGhlTmFtZUluQmFja2VuZCB9IGZyb20gXCIuLi9BcGkvTWFrZVRoZU5hbWVJbkJhY2tlbmRcIjtcbmltcG9ydCB7IFRoZVRleHRzIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1RoZVRleHRzXCI7XG5pbXBvcnQgeyBNYWtlVGhlVHlwZUNvbmNlcHRBcGkgfSBmcm9tIFwiLi4vYXBwXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgQ3JlYXRlVGhlQ29uY2VwdCwgeyBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlIH0gZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWFrZVRoZUluc3RhbmNlQ29uY2VwdCh0eXBlLCByZWZlcmVudCwgY29tcG9zaXRpb24gPSBmYWxzZSwgdXNlcklkLCBwYXNzZWRBY2Nlc3NJZCA9IDQsIHBhc3NlZFNlc3Npb25JZCA9IDk5OSwgcmVmZXJlbnRJZCA9IDApIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSBwYXNzZWRTZXNzaW9uSWQ7XG4gICAgICAgIGxldCBjYXRlZ29yeUlkID0gNDtcbiAgICAgICAgbGV0IGNhdGVnb3J5VXNlcklkID0gdXNlcklkO1xuICAgICAgICBsZXQgcmVmZXJlbnRVc2VySWQgPSA5OTk7XG4gICAgICAgIGxldCBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICBsZXQgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIGxldCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIC8vIGNoYW5nZSB0aGlzXG4gICAgICAgIGxldCBhY2Nlc3NJZCA9IHBhc3NlZEFjY2Vzc0lkO1xuICAgICAgICBsZXQgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICBsZXQgc3RyaW5nVG9DaGVjayA9IFwiXCI7XG4gICAgICAgIGxldCBzdHJpbmdMZW5ndGggPSByZWZlcmVudC5sZW5ndGg7XG4gICAgICAgIGxldCB0eXBlQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGxldCBjb25jZXB0O1xuICAgICAgICBsZXQgc3RhcnRzV2l0aFRoZSA9IHR5cGUuc3RhcnRzV2l0aChcInRoZV9cIik7XG4gICAgICAgIGlmIChzdGFydHNXaXRoVGhlKSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSBcInRoZV9cIiArIHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkodHlwZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdXNlcklkLCB0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkoc3RyaW5nVG9DaGVjaywgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHQocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdXNlcklkLCB0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgVGhlVGV4dHNEYXRhID0gbmV3IFRoZVRleHRzKHVzZXJJZCwgcmVmZXJlbnQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBEYXRlLm5vdygpLnRvU3RyaW5nKCksIHRydWUpO1xuICAgICAgICAgICAgQ3JlYXRlVGV4dERhdGEoVGhlVGV4dHNEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdEFwaShzdHJpbmdUb0NoZWNrLCB1c2VySWQpO1xuICAgICAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIGxldCBjb25jZXB0QnlDaGFyVHlwZVN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUocmVmZXJlbnQsIHR5cGVDb25jZXB0LmlkKTtcbiAgICAgICAgICAgIGxldCBjb25jZXB0VHlwZUNoYXJhY3RlciA9IGNvbmNlcHRCeUNoYXJUeXBlU3RyaW5nO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRUeXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRUeXBlQ2hhcmFjdGVyLmlkID09IDAgJiYgY29uY2VwdFR5cGVDaGFyYWN0ZXIudXNlcklkID09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBsZXQgbWFrZVRoZU5hbWVTdHJpbmcgPSBhd2FpdCBNYWtlVGhlTmFtZShyZWZlcmVudCx1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsY29uY2VwdFR5cGVDaGFyYWN0ZXIgKTtcbiAgICAgICAgICAgICAgICAvLyBsZXQgbWFrZVRoZU5hbWVDb25jZXB0ID0gbWFrZVRoZU5hbWVTdHJpbmcgYXMgQ29uY2VwdDtcbiAgICAgICAgICAgICAgICAvLyBjb25jZXB0ID0gY29uY2VwdFR5cGVDaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlKHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgMTIsIDEyLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgTWFrZVRoZU5hbWVJbkJhY2tlbmQoY29uY2VwdC5pZCwgYCR7cmVmZXJlbnR9YCwgdHlwZUNvbmNlcHQuaWQsIHVzZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYoY29uY2VwdCl7XG4gICAgICAgIC8vICAgICBpZihjb25jZXB0LnR5cGUgPT0gbnVsbCl7XG4gICAgICAgIC8vICAgICAgICAgbGV0IGNvbmNlcHRUeXBlID0gQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoY29uY2VwdC50eXBlSWQpO1xuICAgICAgICAvLyAgICAgICAgIGlmKGNvbmNlcHRUeXBlID09IG51bGwgJiYgY29uY2VwdC50eXBlSWQgIT0gbnVsbCAmJiBjb25jZXB0LnR5cGVJZCAhPSB1bmRlZmluZWQpe1xuICAgICAgICAvLyAgICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmdOZXcgPSBhd2FpdCBHZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgbGV0IG5ld1R5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmdOZXcgYXMgQ29uY2VwdDtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uY2VwdC50eXBlID0gbmV3VHlwZUNvbmNlcHQ7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIGNvbmNlcHQudHlwZSA9IHR5cGVDb25jZXB0O1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgTWFrZVRoZVR5cGVDb25jZXB0QXBpIH0gZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuaW1wb3J0IE1ha2VUaGVDb25jZXB0IGZyb20gXCIuL01ha2VUaGVDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZVRpbWVzdGFtcCh0eXBlLCByZWZlcmVudCwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSA5OTkpIHtcbiAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGFjY2Vzc0lkO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHJlZmVyZW50SWQgPSAwO1xuICAgICAgICB2YXIgcmVmZXJlbnRVc2VySWQgPSA5OTk7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHN0cmluZ1RvQ2hlY2sgPSBcIlwiO1xuICAgICAgICB2YXIgc3RhcnRzV2l0aFRoZSA9IHR5cGUuc3RhcnRzV2l0aChcInRoZV9cIik7XG4gICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHZhciBjb25jZXB0O1xuICAgICAgICBpZiAoc3RhcnRzV2l0aFRoZSkge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gXCJ0aGVfXCIgKyB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdEFwaShzdHJpbmdUb0NoZWNrLCB1c2VySWQpO1xuICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlIH0gZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdFwiO1xuaW1wb3J0IEdldENvbmNlcHRCeUNoYXJhY3RlciBmcm9tIFwiLi9HZXRDb25jZXB0QnlDaGFyYWN0ZXJcIjtcbmltcG9ydCBNYWtlVGhlQ2hhcmFjdGVyIGZyb20gXCIuL01ha2VUaGVDaGFyYWN0ZXJcIjtcbmltcG9ydCB7IFNwbGl0U3RyaW5ncyB9IGZyb20gXCIuL1NwbGl0U3RyaW5nc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIE1ha2VUaGVUeXBlQ29uY2VwdCh0eXBlU3RyaW5nLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciByZWZlcmVudElkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgZXhpc3RpbmdDb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKHR5cGVTdHJpbmcpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0KSB7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0LmlkID09IDAgfHwgZXhpc3RpbmdDb25jZXB0LnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3ModHlwZVN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzcGxpdHRlZFN0cmluZ0FycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0gPT0gdHlwZVN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ2hhcmFjdGVyKHR5cGVTdHJpbmcsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnlDb25jZXB0ID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0KHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0sIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdChzcGxpdHRlZFN0cmluZ0FycmF5WzFdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUNvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRJbW1lZGlhdGUodHlwZVN0cmluZywgdXNlcklkLCBjYXRlZ29yeUNvbmNlcHQuaWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHVzZXJJZCwgcmVmZXJlbnRJZCwgdXNlcklkLCBzZWN1cml0eUlkLCB1c2VySWQsIGFjY2Vzc0lkLCB1c2VySWQsIHNlc3Npb25JZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoTWVzc2FnZSh0b3BpYywgbWVzc2FnZSkge1xuICAgIGlmIChCYXNlVXJsLk1RVFRfQ09OTkVDVElPTikge1xuICAgICAgICBCYXNlVXJsLk1RVFRfQ09OTkVDVElPTi5wdWJsaXNoKHRvcGljLCBtZXNzYWdlKTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFNlYXJjaEludGVybmFsQXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9TZWFyY2gvU2VhcmNoSW50ZXJuYWxBcGlcIjtcbmltcG9ydCB7IFZpZXdJbnRlcm5hbERhdGEgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoTGlua0ludGVybmFsKHNlYXJjaFF1ZXJ5LCB0b2tlbiA9IFwiXCIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdHNDb25uZWN0aW9ucyA9IHlpZWxkIFNlYXJjaEludGVybmFsQXBpKHNlYXJjaFF1ZXJ5LCB0b2tlbik7XG4gICAgICAgIGxldCBvdXQgPSB5aWVsZCBWaWV3SW50ZXJuYWxEYXRhKGNvbmNlcHRzQ29ubmVjdGlvbnMpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBTZWFyY2hMaW5rTXVsdGlwbGVBcGkgfSBmcm9tIFwiLi4vLi4vQXBpL1NlYXJjaC9TZWFyY2hMaW5rTXVsdGlwbGVBcGlcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCdWxrLCBHZXRDb25uZWN0aW9uQnVsaywgR2V0VGhlQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZEluT2JqZWN0LCBHZXRDb25uZWN0aW9uRGF0YVByZWZldGNoIH0gZnJvbSBcIi4uL0dldENvbXBvc2l0aW9uQnVsa1wiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaExpbmtNdWx0aXBsZUFsbChzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHRzID0gW107XG4gICAgICAgIGxldCBjb25jZXB0c0Nvbm5lY3Rpb25zID0geWllbGQgU2VhcmNoTGlua011bHRpcGxlQXBpKHNlYXJjaFF1ZXJ5LCB0b2tlbik7XG4gICAgICAgIGxldCBtYWluQ29tcG9zaXRpb25JZCA9IHNlYXJjaFF1ZXJ5WzBdLmNvbXBvc2l0aW9uO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb25jZXB0c0Nvbm5lY3Rpb25zO1xuICAgICAgICBsZXQgY29uY2VwdElkcyA9IHJlc3VsdC5jb21wb3NpdGlvbklkcztcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0gcmVzdWx0LmludGVybmFsQ29ubmVjdGlvbnM7XG4gICAgICAgIGxldCBsaW5rZXJzID0gcmVzdWx0LmxpbmtlcnM7XG4gICAgICAgIGxldCByZXZlcnNlID0gcmVzdWx0LnJldmVyc2U7XG4gICAgICAgIHlpZWxkIEdldENvbm5lY3Rpb25EYXRhUHJlZmV0Y2gobGlua2Vycyk7XG4gICAgICAgIGNvbmNlcHRzID0geWllbGQgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QoY29uY2VwdElkcywgY29ubmVjdGlvbnMpO1xuICAgICAgICBsZXQgb3V0ID0geWllbGQgRm9ybWF0RnJvbUNvbm5lY3Rpb25zKGxpbmtlcnMsIGNvbmNlcHRzLCBtYWluQ29tcG9zaXRpb25JZCwgcmV2ZXJzZSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0RnJvbUNvbm5lY3Rpb25zKGxpbmtlcnMsIGNvbXBvc2l0aW9uRGF0YSwgbWFpbkNvbXBvc2l0aW9uLCByZXZlcnNlID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgbWFpbkRhdGEgPSB7fTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsobGlua2Vycyk7XG4gICAgICAgIGxldCBteUNvbmNlcHRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG15Q29uY2VwdHMucHVzaChjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBteUNvbmNlcHRzLnB1c2goY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgbXlDb25jZXB0cy5wdXNoKGNvbm5lY3Rpb25zW2ldLnR5cGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ1bGsobXlDb25jZXB0cyk7XG4gICAgICAgIGNvbm5lY3Rpb25zLnNvcnQoZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB5LmlkIC0geC5pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXZlcnNlRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJldmVyc2UuaW5jbHVkZXMoY29ubmVjdGlvbnNbaV0uaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZUZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJldmVyc2VGbGFnID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLm9mVGhlQ29uY2VwdElkXSAmJiBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteWRhdGEgPSBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlua2VyQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbnNbaV0udHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0RhdGEgPSBteWRhdGEgPT09IG51bGwgfHwgbXlkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBteWRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKG5ld0RhdGEpWzBdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJldmVyc2VDaGFyYXRlciA9IGxpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWUgKyBcIl9yZXZlcnNlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdEYXRhW2tleV1bcmV2ZXJzZUNoYXJhdGVyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV1bcmV2ZXJzZUNoYXJhdGVyXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS5vZlRoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtyZXZlcnNlQ2hhcmF0ZXJdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldW3JldmVyc2VDaGFyYXRlcl0ucHVzaChjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLm9mVGhlQ29uY2VwdElkXSAmJiBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteWRhdGEgPSBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlua2VyQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbnNbaV0udHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0RhdGEgPSBteWRhdGEgPT09IG51bGwgfHwgbXlkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBteWRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKG5ld0RhdGEpWzBdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RGF0YVtrZXldW2xpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYWluRGF0YSA9IGNvbXBvc2l0aW9uRGF0YVttYWluQ29tcG9zaXRpb25dO1xuICAgICAgICByZXR1cm4gbWFpbkRhdGE7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBUb2tlblN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVxdWVzdEhlYWRlcihjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJywgQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbixcbiAgICAgICAgJ0FjY2VwdCc6IEFjY2VwdCxcbiAgICB9O1xuICAgIHJldHVybiBoZWFkZXJzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJywgdG9rZW4gPSBcIlwiLCBBY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICBpZiAodG9rZW4gPT0gXCJcIikge1xuICAgICAgICB0b2tlbiA9IFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbjtcbiAgICB9XG4gICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIHRva2VuLFxuICAgICAgICAnQWNjZXB0JzogQWNjZXB0LFxuICAgIH07XG4gICAgcmV0dXJuIGhlYWRlcnM7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0T25seVRva2VuSGVhZGVyKCkge1xuICAgIGxldCB0b2tlbiA9IFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbjtcbiAgICBjb25zdCBteUhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgIG15SGVhZGVycy5hcHBlbmQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0b2tlbik7XG4gICAgcmV0dXJuIG15SGVhZGVycztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBTcGxpdFN0cmluZ3ModHlwZVN0cmluZykge1xuICAgIGNvbnN0IHBvcyA9IHR5cGVTdHJpbmcubGFzdEluZGV4T2YoXCJfXCIpO1xuICAgIGxldCBTcGxpdHRlZFN0cmluZ3MgPSBbXTtcbiAgICBpZiAocG9zID4gMCkge1xuICAgICAgICB2YXIgcmVzdCA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDAsIHBvcyk7XG4gICAgICAgIHZhciBsYXN0ID0gdHlwZVN0cmluZy5zdWJzdHJpbmcocG9zICsgMSwgdHlwZVN0cmluZy5sZW5ndGgpO1xuICAgICAgICBTcGxpdHRlZFN0cmluZ3MgPSBbcmVzdCwgbGFzdF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBTcGxpdHRlZFN0cmluZ3MgPSBbdHlwZVN0cmluZ107XG4gICAgfVxuICAgIHJldHVybiBTcGxpdHRlZFN0cmluZ3M7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBJbnNlcnRVbmlxdWVOdW1iZXIgZnJvbSAnLi4vSGVscGVycy9VbmlxdWVJbnNlcnQnO1xuaW1wb3J0IHsgQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluQ29ubmVjdGlvbkFycmF5LCBDaGVja0lmVHlwZUNvbmNlcHRzRXhpc3RzSW5BcnJheSwgfSBmcm9tICcuLi9IZWxwZXJzL0NoZWNrSWZFeGlzdHMnO1xuaW1wb3J0IHsgUmVtb3ZlQ29uY2VwdEZyb21MaXN0LCBSZW1vdmVDb25uZWN0aW9uRnJvbUxpc3QsIH0gZnJvbSAnLi4vSGVscGVycy9SZW1vdmVGcm9tQXJyYXknO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gJy4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24nO1xuaW1wb3J0IEdldFRoZUNvbmNlcHQgZnJvbSAnLi9HZXRUaGVDb25jZXB0JztcbmltcG9ydCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IGZyb20gJy4vTWFrZVRoZUluc3RhbmNlQ29uY2VwdCc7XG5pbXBvcnQgeyBjcmVhdGVUaGVDb25uZWN0aW9uIH0gZnJvbSAnLi9DcmVhdGVUaGVDb25uZWN0aW9uJztcbmltcG9ydCB7IERlbGV0ZUNvbm5lY3Rpb25CeUlkIH0gZnJvbSAnLi9EZWxldGVDb25uZWN0aW9uJztcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGEnO1xuaW1wb3J0IHsgQ29tcG9zaXRpb25CaW5hcnlUcmVlIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25CaW5hcnlUcmVlJztcbmltcG9ydCB7IENvbXBvc2l0aW9uIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUgfSBmcm9tICcuL0NvbXBvc2l0aW9uL0NyZWF0ZUNvbXBvc2l0aW9uQ2FjaGUnO1xuLy8gZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBjYWNoZSBjb21wb3NpdGlvblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVXBkYXRlQ29tcG9zaXRpb24ocGF0Y2hlclN0cnVjdHVyZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGRlZmF1bHQgdXNlcklkLCBzZXNzaW9uSWQsIGFjY2Vzc0lkIHBhc3NlZCBieSB0aGUgcGF0Y2hlclN0cnVjdHVyZVxuICAgICAgICBjb25zdCB1c2VySWQgPSBwYXRjaGVyU3RydWN0dXJlLnVzZXJJZDtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gcGF0Y2hlclN0cnVjdHVyZS5zZXNzaW9uSWQ7XG4gICAgICAgIGNvbnN0IGFjY2Vzc0lkID0gcGF0Y2hlclN0cnVjdHVyZS5hY2Nlc3NJZDtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGxldCBwYXJlbnRDb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgY29uc3QgdG9EZWxldGVDb25jZXB0cyA9IFtdO1xuICAgICAgICAvLyB0aGUgbWFpbiBjb21wb3NpdGlvbiBJZCB0aGF0IGhhcyB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHBhdGNoZWRcbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uSWQgPSBwYXRjaGVyU3RydWN0dXJlLmNvbXBvc2l0aW9uSWQ7XG4gICAgICAgIC8vIGlmIHlvdSB3YW50IHRvIGVkaXQgdGhlIHN1YmNvbXBvc2l0aW9ucyBvZiB0aGUgY29tcG9zaXRpb24gdGhlbiB5b3UgaGF2ZSB0byBwYXNzIHRvIHRoaXNcbiAgICAgICAgY29uc3Qgb2ZUaGVDb25jZXB0SWQgPSBwYXRjaGVyU3RydWN0dXJlLm9mVGhlQ29tcG9zaXRpb25JZDtcbiAgICAgICAgbGV0IHRvRGVsZXRlQ29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uSWQgPCAwKSB7XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChjb21wb3NpdGlvbklkLCB1c2VySWQpO1xuICAgICAgICAgICAgaWYgKGxvY2FsQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbklkID0gbG9jYWxDb25jZXB0LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2V0IGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoZSBiYWNrZW5kIGJlY2F1c2UgaXQgbmVlZHMgbGF0ZXN0IGRhdGFcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oY29tcG9zaXRpb25JZCk7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgIGNvbnN0IGNvbmNlcHRJZExpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25DYWNoZSA9IG5ldyBDb21wb3NpdGlvbigpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5pZCA9IGNvbXBvc2l0aW9uSWQ7XG4gICAgICAgIC8vIHB1dCB0aGlzIGluIHRoZSB1cHBlciBzZWN0aW9uIGJlZm9yZSB1cGRhdGluZyBiZWNhdXNlIHRoaXMgd2lsbCB0ZWxsIGFsbCBvdGhlciBkaXN0cmlidXRlZFxuICAgICAgICAvL3NlcnZlcnMgdG8gZGVzdHJveSB0aGUgY29weSBvZiB0aGUgY29tcG9zaXRpb24gdGhhdCB0aGV5IGhhdmUgYXMgbmV3IGNvbXBvc2l0aW9uIGlzIGNvbWluZyB1cFxuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLmlzVXBkYXRpbmcoKTtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY29ubmVjdGlvbnMgdGhhdCBhcmUgaW5zaWRlIG9mIHRoZSBjb21wb3NpdGlvbiBhbmQgc3RvcmUgdGhlbSBpblxuICAgICAgICBsZXQgYWxsQ29uY2VwdHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgSW5zZXJ0VW5pcXVlTnVtYmVyKGNvbXBvc2l0aW9uTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgSW5zZXJ0VW5pcXVlTnVtYmVyKGNvbmNlcHRJZExpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb25jZXB0SWRMaXN0LCBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBhbGxDb25jZXB0cy5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLnN1YmNvbXBvc2l0aW9ucyA9IGNvbXBvc2l0aW9uTGlzdDtcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjb25jZXB0cyB0aGF0IGFyZSBpbnNpZGUgb2YgdGhlIGNvbXBvc2l0aW9uIGFuZCBzdG9yZSB0aGVtIGluIGEgY29uY2VwdExpc3RcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0SWRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0VGhlQ29uY2VwdChjb25jZXB0SWRMaXN0W2ldKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uSWQgPT0gY29uY2VwdElkTGlzdFtpXSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uID0gY29uY2VwdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSBjb25jZXB0SWRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25jZXB0TGlzdC5wdXNoKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyB0cnlpbmcgdG8gcGF0Y2ggdGhlIG5ldyBvYmplY3QgaW50byB0aGUgY29tcG9zaXRpb25cbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gcGF0Y2hlclN0cnVjdHVyZS5wYXRjaE9iamVjdDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBsZXQgaW5zZXJ0aW5nQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29uY2VwdCA9IGNvbXBvc2l0aW9uO1xuICAgICAgICAgICAgLy8gaWYgdGhlIGltbWVkaWRhdGUgcGFyZW50IGV4aXN0cyBpbiB0aGUgY29tcG9zaXRpb24gKGkuZS4gZm9yIG11bHRpbGV2ZWwgY29tcG9zaXRpb24pXG4gICAgICAgICAgICBpZiAocGFyZW50Q29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbENvbmNlcHQgPSBwYXJlbnRDb25jZXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGluc2VydGluZ0NvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KGtleSwgXCJcIiwgdHJ1ZSwgY29tcG9zaXRpb24udXNlcklkLCA0LCA5OTkpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuc3ViY29tcG9zaXRpb25zLnB1c2goaW5zZXJ0aW5nQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGNvbmNlcHQgZXhpc3RzIGluIHRoZSBjb25jZXB0IGxpc3QgYmVjYXVzZSBpZiBpdCBleGlzdHMgdGhlbiB3ZSBoYXZlIHRvIGRlbGV0ZSBvbGQgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IEV4aXN0aW5nQ29uY2VwdHMgPSBDaGVja0lmVHlwZUNvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCwgaW5zZXJ0aW5nQ29uY2VwdCk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGV4aXN0aW5nIGNvbmNlcHQgdGhlbiBzdGFydCB0aGUgcHJvY2VzcyBmb3IgZGVsZXRpbmcgdGhlIGNvbmNlcHQgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEV4aXN0aW5nQ29uY2VwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGluZ0Nvbm5lY3Rpb25zID0gQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluQ29ubmVjdGlvbkFycmF5KGNvbXBvc2l0aW9uQ2FjaGUuY29ubmVjdGlvbnMsIEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25uZWN0aW9ucyA9IHRvRGVsZXRlQ29ubmVjdGlvbnMuY29uY2F0KGRlbGV0aW5nQ29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25jZXB0cy5wdXNoKEV4aXN0aW5nQ29uY2VwdHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlKG9iamVjdFtrZXldLCBpbnNlcnRpbmdDb25jZXB0LmlkLCBpbnNlcnRpbmdDb25jZXB0LnVzZXJJZCwgY29tcG9zaXRpb24uaWQsIGNvbXBvc2l0aW9uLnVzZXJJZCwgNCwgOTk5LCBjb21wb3NpdGlvbkNhY2hlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIG5ldyBjb25jZXB0IGluIHRoZSBvYmplY3RcbiAgICAgICAgICAgICAgICBpbnNlcnRpbmdDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIHZhbHVlLCBmYWxzZSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY29uY2VwdCBleGlzdHMgaW4gdGhlIGNvbmNlcHQgbGlzdCBiZWNhdXNlIGlmIGl0IGV4aXN0cyB0aGVuIHdlIGhhdmUgdG8gZGVsZXRlIG9sZCBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgRXhpc3RpbmdDb25jZXB0cyA9IENoZWNrSWZUeXBlQ29uY2VwdHNFeGlzdHNJbkFycmF5KGNvbmNlcHRMaXN0LCBpbnNlcnRpbmdDb25jZXB0KTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZXhpc3RpbmcgY29uY2VwdCB0aGVuIHN0YXJ0IHRoZSBwcm9jZXNzIGZvciBkZWxldGluZyB0aGUgY29uY2VwdCBpbiB0aGUgbGlzdFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRXhpc3RpbmdDb25jZXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRXhpc3RpbmdDb25jZXB0c1tpXS5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0aW5nQ29ubmVjdGlvbnMgPSBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5Db25uZWN0aW9uQXJyYXkoY29tcG9zaXRpb25DYWNoZS5jb25uZWN0aW9ucywgRXhpc3RpbmdDb25jZXB0c1tpXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b0RlbGV0ZUNvbm5lY3Rpb25zID0gdG9EZWxldGVDb25uZWN0aW9ucy5jb25jYXQoZGVsZXRpbmdDb25uZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b0RlbGV0ZUNvbmNlcHRzLnB1c2goRXhpc3RpbmdDb25jZXB0c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgbmV3IGNvbmNlcHQgYW5kIHRoZSBvbGQgY29tcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdHJpbmcgPSBjcmVhdGVUaGVDb25uZWN0aW9uKGxvY2FsQ29uY2VwdC5pZCwgbG9jYWxDb25jZXB0LnVzZXJJZCwgaW5zZXJ0aW5nQ29uY2VwdC5pZCwgaW5zZXJ0aW5nQ29uY2VwdC51c2VySWQsIGNvbXBvc2l0aW9uLmlkLCBzZXNzaW9uSWQsIHVzZXJJZCk7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIGNvbmNlcHRMaXN0LnB1c2goaW5zZXJ0aW5nQ29uY2VwdCk7XG4gICAgICAgICAgICBjb21wb3NpdGlvbkNhY2hlLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IHlvdSBoYXZlIHRvIGRlbGV0ZSB0aGUgY29ubmVjdGlvbiBpbiBidWxrXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9EZWxldGVDb25uZWN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gdGhlIGNhY2hlIGxpc3RcbiAgICAgICAgICAgIFJlbW92ZUNvbm5lY3Rpb25Gcm9tTGlzdChjb21wb3NpdGlvbkNhY2hlLmNvbm5lY3Rpb25zLCB0b0RlbGV0ZUNvbm5lY3Rpb25zW2pdKTtcbiAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgY29ubmVjdGlvbiBpbiB0aGUgYmFja2VuZFxuICAgICAgICAgICAgRGVsZXRlQ29ubmVjdGlvbkJ5SWQodG9EZWxldGVDb25uZWN0aW9uc1tqXS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWxzbyBkZWxldGUgdGhlIGV4aXN0aW5nIGNvbmNlcHQgZnJvbSB0aGUgY2FjaGUuXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdG9EZWxldGVDb25jZXB0cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGNvbmNlcHQgZnJvbSB0aGUgY2FjaGUgY29uY2VwdCBsaXN0XG4gICAgICAgICAgICBSZW1vdmVDb25jZXB0RnJvbUxpc3QoY29uY2VwdExpc3QsIHRvRGVsZXRlQ29uY2VwdHNba10pO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyBjcmVhdGUgYSBjb21wb3NpdGlvbiBjYWNoZSBvYmplY3QgdG8gY2FjaGUgaXQgaW50byBub2RlIHNlcnZlclxuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLmNvbmNlcHRzID0gY29tcG9zaXRpb25DYWNoZS5jb25jZXB0cy5jb25jYXQoY29uY2VwdExpc3QpO1xuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLm1haW5Db25jZXB0ID0gY29tcG9zaXRpb247XG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuaWQgPSBjb21wb3NpdGlvbi5pZDtcbiAgICAgICAgLy8gLy8gY3JlYXRlIGEgY2FjaGVcbiAgICAgICAgeWllbGQgY29tcG9zaXRpb25DYWNoZS51cGRhdGVDYWNoZSgpO1xuICAgICAgICAvLyB1cGRhdGUgaXQgdGhlIGJpbmFyeSB0cmVlXG4gICAgICAgIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5hZGRDb21wb3NpdGlvblRvVHJlZShjb21wb3NpdGlvbkNhY2hlKTtcbiAgICAgICAgU3luY0RhdGEuU3luY0RhdGFPbmxpbmUoKTtcbiAgICAgICAgbGV0IHggPSBjb21wb3NpdGlvbkNhY2hlLkdldERhdGFDYWNoZSgpO1xuICAgICAgICByZXR1cm4geDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSAnLi8uLi8uLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHQnO1xuaW1wb3J0IHsgVXNlckJpbmFyeVRyZWUgfSBmcm9tICcuLy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL1VzZXIvVXNlckJpbmFyeVRyZWUnO1xuZXhwb3J0IGZ1bmN0aW9uIEdldFVzZXJHaG9zdElkKHVzZXJJZCwgZ2hvc3RJZCwgc2Vzc2lvbklkID0gOTk5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHVzZXJOb2RlID0geWllbGQgVXNlckJpbmFyeVRyZWUuZ2V0Tm9kZUZyb21UcmVlKHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIHRoZSBnaG9zdCBpZFwiLCB1c2VySWQsIHNlc3Npb25JZCk7XG4gICAgICAgIGxldCByZWFsQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBpZiAodXNlck5vZGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXNlck5vZGUudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdENvbmNlcHQgPSB1c2VyTm9kZS52YWx1ZVtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGVzdENvbmNlcHQuZ2hvc3RJZCA9PSBnaG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWxDb25jZXB0ID0gdGVzdENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWFsQ29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBBZGRHaG9zdENvbmNlcHQoY29uY2VwdCwgdXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBVc2VyQmluYXJ5VHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQsIHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgVmlld0ludGVybmFsRGF0YUFwaSB9IGZyb20gXCIuLi8uLi9BcGkvVmlldy9WaWV3SW50ZXJuYWxEYXRhQXBpXCI7XG5pbXBvcnQgeyBHZXRUaGVDb25jZXB0LCByZWN1cnNpdmVGZXRjaCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBWaWV3SW50ZXJuYWxEYXRhKGlkcykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbnMgPSB5aWVsZCBWaWV3SW50ZXJuYWxEYXRhQXBpKGlkcyk7XG4gICAgICAgIGxldCBvdXRwdXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGlkc1tpXTtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNbaWRdO1xuICAgICAgICAgICAgaWYgKGlkICYmIGxvY2FsQ29ubmVjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgZm9ybWF0dGVkT3V0cHV0ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsb2NhbENvbm5lY3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uY2VwdHMuaW5jbHVkZXMobG9jYWxDb25uZWN0aW9uc1tqXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2gobG9jYWxDb25uZWN0aW9uc1tqXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG91dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBsb2NhbENvbm5lY3Rpb25zLCBjb25jZXB0cyk7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkT3V0cHV0LmRhdGEgPSBvdXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkT3V0cHV0LmlkID0gaWQ7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goZm9ybWF0dGVkT3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmb3JtYXR0ZWRPdXRwdXQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRPdXRwdXQuaWQgPSBpZDtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoaWQpO1xuICAgICAgICAgICAgICAgIGxldCBub2Nvbm4gPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vY29ublsoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlXSA9IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZE91dHB1dC5kYXRhID0gbm9jb25uO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChmb3JtYXR0ZWRPdXRwdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwiZXhwb3J0IHsgaW5pdCwgdXBkYXRlQWNjZXNzVG9rZW4gfTtcbmltcG9ydCBDcmVhdGVCaW5hcnlUcmVlRnJvbURhdGEgZnJvbSAnLi9TZXJ2aWNlcy9DcmVhdGVCaW5hcnlUcmVlRnJvbURhdGEnO1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9JZGVudGlmaWVyRmxhZ3MnO1xuZXhwb3J0IHsgU3BsaXRTdHJpbmdzIH0gZnJvbSAnLi9TZXJ2aWNlcy9TcGxpdFN0cmluZ3MnO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25MaXN0LCBHZXRDb21wb3NpdGlvbkxpc3RXaXRoSWQgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uTGlzdCc7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbCwgR2V0Q29tcG9zaXRpb25MaXN0TG9jYWxXaXRoSWQgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0dldENvbXBvc2l0aW9uTGlzdExvY2FsJztcbmV4cG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gJy4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbic7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbiwgR2V0Q29tcG9zaXRpb25XaXRoSWQsIHJlY3Vyc2l2ZUZldGNoLCBHZXRDb21wb3NpdGlvbldpdGhBbGxJZHMgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uTG9jYWwsIEdldENvbXBvc2l0aW9uTG9jYWxXaXRoSWQgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0dldENvbXBvc2l0aW9uTG9jYWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDcmVhdGVDb21wb3NpdGlvbiB9IGZyb20gJy4vU2VydmljZXMvQ3JlYXRlVGhlQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbCc7XG5leHBvcnQgeyBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzLCBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzR2VuZXJhbCB9IGZyb20gJy4vU2VydmljZXMvQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdldFRoZUNvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL0dldFRoZUNvbmNlcHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9NYWtlVGhlSW5zdGFuY2VDb25jZXB0JztcbmV4cG9ydCB7IE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsJztcbmV4cG9ydCB7IHN0b3JlVG9EYXRhYmFzZSwgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUsIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkIH0gZnJvbSAnLi9EYXRhYmFzZS9Ob0luZGV4RGInO1xuZXhwb3J0IHsgY3JlYXRlVGhlQ29ubmVjdGlvbiBhcyBDcmVhdGVUaGVDb25uZWN0aW9uIH0gZnJvbSAnLi9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb25jZXB0QnlDaGFyYWN0ZXInO1xuZXhwb3J0IHsgR2V0TGluaywgR2V0TGlua1JhdyB9IGZyb20gJy4vU2VydmljZXMvR2V0TGluayc7XG5leHBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHQnO1xuZXhwb3J0IHsgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL01ha2VUaGVUeXBlTG9jYWwnO1xuZXhwb3J0IHsgTWFrZVRoZVR5cGVDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9NYWtlVGhlVHlwZUNvbmNlcHQnO1xuZXhwb3J0IHsgTWFrZVRoZVR5cGVDb25jZXB0QXBpIH0gZnJvbSAnLi9BcGkvTWFrZVRoZVR5cGVDb25jZXB0QXBpJztcbmV4cG9ydCB7IEdldExpbmtlckNvbm5lY3Rpb25Gcm9tQ29uY2VwdHMsIEdldExpbmtlckNvbm5lY3Rpb25Ub0NvbmNlcHRzIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRMaW5rZXJDb25uZWN0aW9uRnJvbUNvbmNlcHQnO1xuZXhwb3J0IHsgRGVsZXRlQ29uY2VwdEJ5SWQgfSBmcm9tICcuL1NlcnZpY2VzL0RlbGV0ZUNvbmNlcHQnO1xuZXhwb3J0IHsgRGVsZXRlQ29ubmVjdGlvbkJ5SWQgfSBmcm9tICcuL1NlcnZpY2VzL0RlbGV0ZUNvbm5lY3Rpb24nO1xuZXhwb3J0IHsgVHJhc2hUaGVDb25jZXB0IH0gZnJvbSAnLi9BcGkvRGVsZXRlL0RlbGV0ZUNvbmNlcHRJbkJhY2tlbmQnO1xuZXhwb3J0IHsgR2V0Q29ubmVjdGlvbkJ5SWQgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbm5lY3Rpb25zJztcbmV4cG9ydCB7IE1ha2VUaGVUaW1lc3RhbXAgfSBmcm9tICcuL1NlcnZpY2VzL01ha2VUaGVUaW1lc3RhbXAnO1xuZXhwb3J0IHsgUmVjdXJzaXZlU2VhcmNoQXBpIH0gZnJvbSAnLi9BcGkvUmVjdXJzaXZlU2VhcmNoJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uQnVsa1dpdGhEYXRhSWQsIEdldENvbXBvc2l0aW9uQnVsaywgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkJ1bGsnO1xuZXhwb3J0IHsgR2V0Q29uY2VwdEJ1bGsgfSBmcm9tICcuL0FwaS9HZXRDb25jZXB0QnVsayc7XG5leHBvcnQgeyBHZXRDb25uZWN0aW9uQnVsayB9IGZyb20gJy4vQXBpL0dldENvbm5lY3Rpb25CdWxrJztcbmV4cG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsgfSBmcm9tICcuL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrJztcbmV4cG9ydCB7IExvZ2luVG9CYWNrZW5kIH0gZnJvbSAnLi9BcGkvTG9naW4nO1xuZXhwb3J0IHsgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdCB9IGZyb20gJy4vQXBpL0dldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTaWdudXAgfSBmcm9tICcuL0FwaS9TaWdudXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTaWduaW4gfSBmcm9tICcuL0FwaS9TaWduaW4nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBVcGRhdGVDb21wb3NpdGlvbiB9IGZyb20gJy4vU2VydmljZXMvVXBkYXRlQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgU2VhcmNoQWxsQ29uY2VwdHMgfSBmcm9tICcuL0FwaS9TZWFyY2gvU2VhcmNoJztcbmV4cG9ydCB7IFNlYXJjaFdpdGhMaW5rZXIgfSBmcm9tICcuL0FwaS9TZWFyY2gvU2VhcmNoV2l0aExpbmtlcic7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbldpdGhDYWNoZSwgR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkV2l0aENhY2hlLCBHZXRDb21wb3NpdGlvbldpdGhEYXRhSWRCdWxrIH0gZnJvbSAnLi9TZXJ2aWNlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkNhY2hlJztcbmV4cG9ydCB7IENyZWF0ZVNlc3Npb24gfSBmcm9tICcuL0FwaS9TZXNzaW9uL0NyZWF0ZVNlc3Npb24nO1xuZXhwb3J0IHsgQ3JlYXRlU2Vzc2lvblZpc2l0IH0gZnJvbSAnLi9BcGkvU2Vzc2lvbi9DcmVhdGVTZXNzaW9uVmlzaXQnO1xuZXhwb3J0IHsgR2V0UmVsYXRpb24sIEdldFJlbGF0aW9uUmF3IH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRSZWxhdGlvbic7XG5leHBvcnQgeyByZWN1cnNpdmVGZXRjaE5ldyB9IGZyb20gJy4vU2VydmljZXMvQ29tcG9zaXRpb24vQnVpbGRDb21wb3NpdGlvbic7XG5leHBvcnQgeyBDcmVhdGVUaGVDb21wb3NpdGlvbldpdGhDYWNoZSB9IGZyb20gJy4vU2VydmljZXMvQ29tcG9zaXRpb24vQ3JlYXRlQ29tcG9zaXRpb25DYWNoZSc7XG5leHBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdCc7XG5leHBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbCB9IGZyb20gJy4vU2VydmljZXMvQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwnO1xuZXhwb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwnO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25MaXN0QWxsLCBHZXRDb21wb3NpdGlvbkxpc3RBbGxXaXRoSWQgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uTGlzdCc7XG5leHBvcnQgeyBHZXRVc2VyR2hvc3RJZCwgQWRkR2hvc3RDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9Vc2VyL1VzZXJUcmFuc2xhdGlvbic7XG5leHBvcnQgeyBTZWFyY2hMaW5rTXVsdGlwbGVBbGwsIEZvcm1hdEZyb21Db25uZWN0aW9ucyB9IGZyb20gJy4vU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtNdWx0aXBsZSc7XG5leHBvcnQgeyBHZXRUaGVDb25jZXB0TG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0dldFRoZUNvbmNlcHRMb2NhbCc7XG5leHBvcnQgeyBVcGRhdGVDb21wb3NpdGlvbkxvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9VcGRhdGVDb21wb3NpdGlvbkxvY2FsJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZEluT2JqZWN0IH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkJ1bGsnO1xuZXhwb3J0IHsgR2V0UmVsYXRpb25Mb2NhbCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvR2V0UmVsYXRpb25Mb2NhbCc7XG5leHBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9HZXRDb25jZXB0QnlDaGFyYWN0ZXJMb2NhbCc7XG5leHBvcnQgeyBWaWV3SW50ZXJuYWxEYXRhIH0gZnJvbSAnLi9TZXJ2aWNlcy9WaWV3L1ZpZXdJbnRlcm5hbERhdGEnO1xuZXhwb3J0IHsgVmlld0ludGVybmFsRGF0YUFwaSB9IGZyb20gJy4vQXBpL1ZpZXcvVmlld0ludGVybmFsRGF0YUFwaSc7XG5leHBvcnQgeyBjb252ZXJ0RnJvbUxDb25jZXB0VG9Db25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9Db252ZXJzaW9uL0NvbnZlcnRDb25jZXB0cyc7XG5leHBvcnQgeyBTZWFyY2hMaW5rSW50ZXJuYWwgfSBmcm9tICcuL1NlcnZpY2VzL1NlYXJjaC9TZWFyY2hMaW5rSW50ZXJuYWwnO1xuZXhwb3J0IHsgQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c0xvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzTG9jYWwnO1xuZXhwb3J0IHsgU3luY0RhdGEgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhJztcbmV4cG9ydCB7IENvbmNlcHQgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHQnO1xuZXhwb3J0IHsgTENvbmNlcHQgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25jZXB0JztcbmV4cG9ydCB7IExDb25uZWN0aW9uIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29ubmVjdGlvbic7XG5leHBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uJztcbmV4cG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGEnO1xuZXhwb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhJztcbmV4cG9ydCB7IEJpbmFyeVRyZWUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeVRyZWUnO1xuZXhwb3J0IHsgU2VhcmNoUXVlcnkgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1NlYXJjaFF1ZXJ5JztcbmV4cG9ydCB7IFBhdGNoZXJTdHJ1Y3R1cmUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1BhdGNoZXJTdHJ1Y3R1cmUnO1xuZXhwb3J0IHsgU2Vzc2lvbkRhdGEgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1Nlc3Npb24vU2Vzc2lvbkRhdGEnO1xuZXhwb3J0IHsgQ29tcG9zaXRpb24gfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uJztcbmV4cG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25CaW5hcnlUcmVlJztcbmV4cG9ydCB7IENvbXBvc2l0aW9uTm9kZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25Ob2RlJztcbmV4cG9ydCB7IExvY2FsU3luY0RhdGEgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsU3luY0RhdGEnO1xuZXhwb3J0IHsgVXNlckJpbmFyeVRyZWUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1VzZXIvVXNlckJpbmFyeVRyZWUnO1xuZXhwb3J0IHsgRmlsdGVyU2VhcmNoIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9GaWx0ZXJTZWFyY2gnO1xuZXhwb3J0IHsgU2VhcmNoU3RydWN0dXJlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9TZWFyY2gvU2VhcmNoU3RydWN0dXJlJztcbmltcG9ydCB7IEdldERhdGFGcm9tSW5kZXhEYiwgR2V0RGF0YUZyb21JbmRleERiTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0dldERhdGFGcm9tSW5kZXhEYic7XG5pbXBvcnQgQ3JlYXRlTG9jYWxCaW5hcnlUcmVlRnJvbURhdGEgZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YSc7XG5pbXBvcnQgSW5pdGlhbGl6ZVN5c3RlbSBmcm9tICcuL1NlcnZpY2VzL0luaXRpYWxpemVTeXN0ZW0nO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybCc7XG5pbXBvcnQgeyBUb2tlblN0b3JhZ2UgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1NlY3VyaXR5L1Rva2VuU3RvcmFnZSc7XG5leHBvcnQgeyBCYXNlVXJsIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsJztcbmZ1bmN0aW9uIHVwZGF0ZUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuID0gXCJcIikge1xuICAgIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xufVxuZnVuY3Rpb24gaW5pdCh1cmwgPSBcIlwiLCBhaXVybCA9IFwiXCIsIGFjY2Vzc1Rva2VuID0gXCJcIiwgbm9kZVVybCA9IFwiXCIsIGVuYWJsZUFpID0gdHJ1ZSkge1xuICAgIEJhc2VVcmwuQkFTRV9VUkwgPSB1cmw7XG4gICAgQmFzZVVybC5BSV9VUkwgPSBhaXVybDtcbiAgICBCYXNlVXJsLk5PREVfVVJMID0gbm9kZVVybDtcbiAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXN0IGhlIGJhc2UgdXJsXCIsIEJhc2VVcmwuQkFTRV9VUkwpO1xuICAgIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xuICAgIEluaXRpYWxpemVTeXN0ZW0oZW5hYmxlQWkpLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBDcmVhdGVCaW5hcnlUcmVlRnJvbURhdGEoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0RhdGFMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzQ2hhcmFjdGVyTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc1R5cGVMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgdGltZSB0YWtlbiB0byBwcmVwYXJlIGNvbmNlcHQgIGRhdGEgaXMgIFwiLCBlbGFwc2VkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIENyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzTG9jYWxUeXBlTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0xvY2FsQ2hhcmFjdGVyTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIHRpbWUgdGFrZW4gdG8gcHJlcGFyZSBsb2NhbCBjb25jZXB0ICBcIiwgZWxhcHNlZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBHZXREYXRhRnJvbUluZGV4RGJMb2NhbCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDb25uZWN0aW9uTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIEdldERhdGFGcm9tSW5kZXhEYigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzQ29ubmVjdGlvbkxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uVHlwZUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSB0aW1lIHRha2VuIHRvIHByZXBhcmUgY29ubmVjdGlvbnMgIFwiLCBlbGFwc2VkKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vc3JjL2FwcC50c1wiKTtcbiIsIiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==