oxygen-cli 1.30.3 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v1.32.0 (2023-12-15)
4
+
5
+ #### :tada: New Feature
6
+ * Add `web.mockClearAll` and `web.mockRestoreAll`.
7
+
8
+ ## v1.31.0 (2023-12-08)
9
+
10
+ #### :tada: New Feature
11
+ * Allow to capture and attach test video to test results if running against a Selenoid hub.
12
+ * Add `web.mock` method allowing to mock network responses.
13
+
14
+ #### :nail_care: Polish
15
+ * Minor improvements to API documentation.
16
+
17
+ #### :beetle: Bug Fix
18
+ * Mark transaction as warning if one of steps has warning status.
19
+
3
20
  ## v1.30.3 (2023-09-01)
4
21
 
5
22
  #### :beetle: Bug Fix
@@ -94,6 +94,7 @@ const DEFAULT_CTX = {
94
94
  const DEFAULT_RESULT_STORE = {
95
95
  steps: [],
96
96
  logs: [],
97
+ attachments: [],
97
98
  har: null,
98
99
  attributes: {}
99
100
  };
@@ -215,6 +216,10 @@ class Oxygen extends _OxygenEvents.default {
215
216
  if (step.endTime > transStep.endTime) {
216
217
  transStep.endTime = step.endTime;
217
218
  }
219
+
220
+ if (step.status === _status.default.WARNING) {
221
+ transStep.status = _status.default.WARNING;
222
+ }
218
223
  }
219
224
  }
220
225
  }
@@ -248,6 +253,7 @@ class Oxygen extends _OxygenEvents.default {
248
253
  resetResults() {
249
254
  this.resultStore.steps = [];
250
255
  this.resultStore.logs = [];
256
+ this.resultStore.attachments = [];
251
257
  this.har = null;
252
258
  }
253
259
 
@@ -1032,4 +1038,4 @@ class Oxygen extends _OxygenEvents.default {
1032
1038
  }
1033
1039
 
1034
1040
  exports.default = Oxygen;
1035
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnbG9iYWwiLCJnZXQiLCJvcmlnIiwiRXJyb3IiLCJwcmVwYXJlU3RhY2tUcmFjZSIsIl8iLCJzdGFjayIsImVyciIsImNhcHR1cmVTdGFja1RyYWNlIiwiREVGQVVMVF9USU1FT1VUIiwiREVGQVVMVF9PUFRTIiwiYmFja3RyYWNlIiwiY29tcGlsZXIiLCJmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnMiLCJmYWlsRmFzdCIsImlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zIiwibmFtZSIsInByb2ZpbGUiLCJyZXF1aXJlIiwib3JkZXIiLCJzbmlwcGV0U3ludGF4IiwidW5kZWZpbmVkIiwic25pcHBldHMiLCJzb3VyY2UiLCJzdHJpY3QiLCJ0YWdFeHByZXNzaW9uIiwidGFnc0luVGl0bGUiLCJ0aW1lb3V0IiwiTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgiLCJTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgiLCJET19OT1RfV1JBUF9NRVRIT0RTIiwiREVGQVVMVF9DVFgiLCJwYXJhbXMiLCJ2YXJzIiwiZW52IiwiY2FwcyIsImF0dHJpYnV0ZXMiLCJERUZBVUxUX1JFU1VMVF9TVE9SRSIsInN0ZXBzIiwibG9ncyIsImhhciIsIk94eWdlbiIsIk94eWdlbkV2ZW50cyIsImNvbnN0cnVjdG9yIiwiaXNJbml0aWFsaXplZCIsInJlc3VsdFN0b3JlIiwiY3R4IiwibW9kdWxlcyIsInNlcnZpY2VzIiwicmVwbyIsImNhcGFiaWxpdGllcyIsIm9wdHMiLCJveEJhc2VEaXIiLCJwYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsImxvZ2dlciIsIl93cmFwTG9nZ2VyIiwiX3dhaXRTdGVwUmVzdWx0TGlzdCIsImluaXQiLCJvcHRpb25zIiwicmVzdWx0cyIsImFzc2lnbiIsImN3ZCIsInByb2Nlc3MiLCJrZXlzIiwibGVuZ3RoIiwibWFrZU94R2xvYmFsIiwiX2xvYWRTZXJ2aWNlcyIsIl9sb2FkTW9kdWxlcyIsImdsb2JhbFNjb3BlIiwibWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsIiwiZGlzcG9zZU1vZHVsZXMiLCJzdGF0dXMiLCJfZGlzcG9zZU1vZHVsZXMiLCJlIiwiY29uc29sZSIsImVycm9yIiwiZGlzcG9zZSIsIl9kaXNwb3NlU2VydmljZXMiLCJhZGp1c3RTY3JpcHRMaW5lIiwiaXNJbkRlYnVnTW9kZSIsIm94dXRpbCIsInJlc3VsdCIsImNvbnRleHQiLCJveCIsInJlcG9zaXRvcnkiLCJ0cmFuc1N0ZXAiLCJpbmNsdWRlcyIsInRyYW5zTmFtZSIsInRyYW5zYWN0aW9uIiwiZHVyYXRpb24iLCJzdGVwIiwiZW5kVGltZSIsImdldE1vZHVsZXNDYXBhYmlsaXRpZXMiLCJtb2RDYXBzIiwibW9kdWxlTmFtZSIsIm1vZHVsZSIsIl9nZXRDYXBhYmlsaXRpZXMiLCJyZXNldFJlc3VsdHMiLCJvbkJlZm9yZUNhc2UiLCJfaXRlcmF0aW9uU3RhcnQiLCJvbkFmdGVyQ2FzZSIsIl9pdGVyYXRpb25FbmQiLCJhZGRBdHRyaWJ1dGUiLCJiaW5kIiwidmFsdWUiLCJsb2FkUGFnZU9iamVjdEZpbGUiLCJwb1BhdGgiLCJwbyIsIl9sb2dnZXIiLCJsb2dnZXJXcmFwIiwiaW5mbyIsImFyZ3MiLCJfbG9nIiwiZGVidWciLCJ3YXJuIiwidXNlckluZm8iLCJJU1NVRVJTIiwiVVNFUiIsInVzZXJEZWJ1ZyIsInVzZXJFcnJvciIsInVzZXJXYXJuIiwibGV2ZWwiLCJzcmMiLCJERUZBVUxUX0xPR0dFUl9JU1NVRVIiLCJhcHBseSIsIm1lc3NhZ2UiLCJzdHJpbmdpZnkiLCJ0aW1lIiwiZ2V0VGltZVN0YW1wIiwicHVzaCIsInRvVXBwZXJDYXNlIiwibXNnIiwic2hpZnQiLCJlbWl0TG9nIiwib3hTZXJ2aWNlc0RpclBhdGgiLCJyZXNvbHZlIiwic2VydmljZUZpbGVzIiwiZ2xvYiIsInN5bmMiLCJpIiwic2VydmljZUZpbGVOYW1lIiwic2VydmljZUZpbGVQYXRoIiwibWF0Y2giLCJzZXJ2aWNlTmFtZSIsIkFycmF5IiwiaXNBcnJheSIsInNlcnZpY2UiLCJfbG9hZFNlcnZpY2UiLCJFT0wiLCJzdGFja3RyYWNlIiwic2VydmljZVBhdGgiLCJTZXJ2aWNlQ2xhc3MiLCJkZWZhdWx0Iiwic2VydmljZUxvZ2dlciIsIl9sb2FkSW50ZXJuYWxNb2R1bGVzIiwiX2xvYWRFeHRlcm5hbE1vZHVsZXMiLCJtb2R1bGVzRm9sZGVyUGF0aCIsIm1vZHVsZXNfZXh0Iiwib3hNb2R1bGVzRGlyUGF0aCIsImZzIiwiZXhpc3RzU3luYyIsIm1vZHVsZUZpbGVzIiwiZm9yRWFjaCIsIm1vZHVsZUZpbGVOYW1lIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm1vZHVsZUxvZ2dlciIsIm1vZCIsImNvcmVVdGlscyIsImxvYWRNb2R1bGVGcm9tRmlsZSIsIl9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZCIsIl93cmFwTW9kdWxlIiwiZXhjbHVkZVVuZGVmaW5lZE1vZHMiLCJNb2R1bGVzIiwiTW9kdWxlQ2xhc3MiLCJnZXRPeE1vZHVsZXNEaXIiLCJsb2FkTW9kdWxlRnJvbUNsYXNzIiwid3JhcHBlciIsIl90aGlzIiwibW9kdWxlTWV0aG9kcyIsInNvbWUiLCJ4IiwiX2dldEFsbFByb3BlcnR5TmFtZXMiLCJtZXRob2ROYW1lIiwibWV0aG9kIiwiRnVuY3Rpb24iLCJPeHlnZW5TdWJNb2R1bGUiLCJpbmRleE9mIiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiZ2V0TWV0aG9kU2lnbmF0dXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRPeHlnZW5FcnJvciIsIl9jb21tYW5kV3JhcHBlciIsIk94RXJyb3IiLCJjbWROYW1lIiwiY21kQXJncyIsInJldHZhbCIsImNtZEZuIiwicHVibGljTWV0aG9kIiwic3RhcnRzV2l0aCIsImRlbGF5IiwiZGVhc3luYyIsInNsZWVwIiwiZXJyb3JDb2RlIiwiTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiIsImRlY3J5cHRlZEFyZ3MiLCJfZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5IiwiX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlIiwiY21kTG9jYXRpb24iLCJfZ2V0Q29tbWFuZExvY2F0aW9uIiwiZW1pdEJlZm9yZUNvbW1hbmQiLCJfd3JhcEFzeW5jIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UiLCJyZXR2YWxQcm9taXNlIiwidGhlbiIsInByb21pc2VEb25lIiwibG9vcFdoaWxlIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlSW5pdGlhbGl6ZWQiLCJzdGVwUmVzdWx0IiwiZG9uZSIsIndhaXRJZCIsIl9nZXRTdGVwUmVzdWx0IiwiaW5kZXgiLCJzcGxpY2UiLCJlbWl0QWZ0ZXJDb21tYW5kIiwiaXNGYXRhbCIsImNvbnRpbnVlT25FcnJvciIsImxvY2F0aW9uIiwiZmFpbHVyZSIsImZuIiwic2VsZiIsIkZpYmVyIiwiY3VycmVudCIsImZpbmFsVmFsIiwiUHJvbWlzZSIsInZhbCIsImNhdGNoIiwiZnV0dXJlIiwiRnV0dXJlIiwicmV0dXJuIiwidGhyb3ciLCJ3YWl0IiwiX19zdGFjayIsImNhbGxlciIsIl9fZmlsZW5hbWUiLCJnZXRGaWxlTmFtZSIsImdldExpbmVOdW1iZXIiLCJnZXRDb2x1bW5OdW1iZXIiLCJTdGVwUmVzdWx0IiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJ0eXBlIiwiQVNTRVJUX1BBU1NFRCIsIlNUQVRVUyIsIlBBU1NFRCIsIkZBSUxFRCIsIldBUk5JTkciLCJhY3Rpb24iLCJfaXNBY3Rpb24iLCJfZ2V0U3RhdHMiLCJzdGF0cyIsIlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCIsIkFQUElVTV9TRVNTSU9OX1RJTUVPVVQiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwiZGlzYWJsZVNjcmVlbnNob3QiLCJzY3JlZW5zaG90Iiwia2V5IiwiZGlzcG9zZVJlc3VsdCIsIm9uTW9kdWxlTG9hZGVkIiwib25Nb2R1bGVJbml0aWFsaXplZCIsIm9uTW9kdWxlV2lsbERpc3Bvc2UiLCJfbmV3QXJncyIsImFyZyIsIl9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudCIsImdldERlY3J5cHRSZXN1bHQiLCJwYXJhbU5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhcmFtVmFsdWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiZW52TmFtZSIsImVudlZhbHVlIiwib2JqIiwicHJvcHMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvcCIsImdldFByb3RvdHlwZU9mIiwiX2NoZWNrU3RlcFJlc3VsdCIsInJlamVjdCIsIl93YWl0U3RlcFJlc3VsdCIsIl9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7Ozs7Ozs7QUFHQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxNQUF0QixFQUE4QixTQUE5QixFQUF5QztBQUNyQ0MsRUFBQUEsR0FBRyxFQUFFLFlBQVk7QUFDYixRQUFJQyxJQUFJLEdBQUdDLEtBQUssQ0FBQ0MsaUJBQWpCOztBQUNBRCxJQUFBQSxLQUFLLENBQUNDLGlCQUFOLEdBQTBCLFVBQVVDLENBQVYsRUFBYUMsS0FBYixFQUFvQjtBQUFFLGFBQU9BLEtBQVA7QUFBZSxLQUEvRDs7QUFDQSxRQUFJQyxHQUFHLEdBQUcsSUFBSUosS0FBSixFQUFWO0FBQ0FBLElBQUFBLEtBQUssQ0FBQ0ssaUJBQU4sQ0FBd0JELEdBQXhCO0FBQ0EsUUFBSUQsS0FBSyxHQUFHQyxHQUFHLENBQUNELEtBQWhCO0FBQ0FILElBQUFBLEtBQUssQ0FBQ0MsaUJBQU4sR0FBMEJGLElBQTFCO0FBQ0EsV0FBT0ksS0FBUDtBQUNIO0FBVG9DLENBQXpDO0FBWUEsTUFBTUcsZUFBZSxHQUFHLEtBQXhCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHO0FBQ2pCQyxFQUFB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QUksQ0FBQ2lCLElBQUQsSUFBUyxDQUFDaUMsS0FBSyxDQUFDQyxPQUFOLENBQWNsQyxJQUFkLENBQVYsSUFBaUNBLElBQUksQ0FBQy9DLE1BQUwsSUFBZSxDQUFwRCxFQUF1RDtBQUNuRCxhQUFPK0MsSUFBUDtBQUNIOztBQUNELFVBQU1tSyxRQUFRLEdBQUcsRUFBakI7O0FBQ0EsU0FBSyxJQUFJQyxHQUFULElBQWdCcEssSUFBaEIsRUFBc0I7QUFDbEJtSyxNQUFBQSxRQUFRLENBQUNqSixJQUFULENBQWMsS0FBS29LLG1DQUFMLENBQXlDbEIsR0FBekMsRUFBOENyTCxVQUE5QyxDQUFkO0FBQ0g7O0FBQ0QsV0FBT29MLFFBQVA7QUFDSDs7QUFFRG1CLEVBQUFBLG1DQUFtQyxDQUFDbEIsR0FBRCxFQUFNckwsVUFBTixFQUFrQjtBQUNqRCxRQUFJcUwsR0FBRyxJQUFJLE9BQU9BLEdBQUcsQ0FBQ0UsZ0JBQVgsS0FBZ0MsVUFBM0MsRUFBdUQ7QUFDbkQsVUFBSXZMLFVBQVUsS0FBSyxLQUFuQixFQUEwQjtBQUN0QixlQUFPLFdBQVA7QUFDSCxPQUZELE1BRU87QUFDSCxlQUFPcUwsR0FBRyxDQUFDRSxnQkFBSixFQUFQO0FBQ0g7QUFDSjs7QUFFRCxXQUFPRixHQUFQO0FBQ0g7O0FBNzZCNEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cclxuaW1wb3J0IGdsb2IgZnJvbSAnZ2xvYic7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgZGVhc3luYyBmcm9tICdkZWFzeW5jJztcclxuaW1wb3J0IEZ1dHVyZSBmcm9tICdmaWJlcnMvZnV0dXJlJztcclxuaW1wb3J0IEZpYmVyIGZyb20gJ2ZpYmVycyc7XHJcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcclxuaW1wb3J0IFN0ZXBSZXN1bHQgZnJvbSAnLi4vbW9kZWwvc3RlcC1yZXN1bHQnO1xyXG5pbXBvcnQgT3h5Z2VuRXZlbnRzIGZyb20gJy4vT3h5Z2VuRXZlbnRzJztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi9saWIvdXRpbCc7XHJcbmltcG9ydCAqIGFzIGNvcmVVdGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgU1RBVFVTIGZyb20gJy4uL21vZGVsL3N0YXR1cy5qcyc7XHJcbmltcG9ydCAqIGFzIE1vZHVsZXMgZnJvbSAnLi4vb3hfbW9kdWxlcy9pbmRleCc7XHJcblxyXG4vLyBzZXR1cCBsb2dnZXJcclxuaW1wb3J0IGxvZ2dlciwgeyBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIElTU1VFUlMgfSBmcm9tICcuLi9saWIvbG9nZ2VyJztcclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi9PeHlnZW5TdWJNb2R1bGUnO1xyXG5cclxuLypnbG9iYWwgX19zdGFjayovXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWwsICdfX3N0YWNrJywge1xyXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIG9yaWcgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcclxuICAgICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGZ1bmN0aW9uIChfLCBzdGFjaykgeyByZXR1cm4gc3RhY2s7IH07XHJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xyXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycik7XHJcbiAgICAgICAgdmFyIHN0YWNrID0gZXJyLnN0YWNrO1xyXG4gICAgICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb3JpZztcclxuICAgICAgICByZXR1cm4gc3RhY2s7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuY29uc3QgREVGQVVMVF9USU1FT1VUID0gMzAwMDA7XHJcbmNvbnN0IERFRkFVTFRfT1BUUyA9IHtcclxuICAgIGJhY2t0cmFjZTogZmFsc2UsIC8vIDxib29sZWFuPiBzaG93IGZ1bGwgYmFja3RyYWNlIGZvciBlcnJvcnNcclxuICAgIGNvbXBpbGVyOiBbXSwgLy8gPHN0cmluZ1tdPiAoXCJleHRlbnNpb246bW9kdWxlXCIpIHJlcXVpcmUgZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gRVhURU5TSU9OIGFmdGVyIHJlcXVpcmluZyBNT0RVTEUgKHJlcGVhdGFibGUpXHJcbiAgICBmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnM6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gdHJlYXQgYW1iaWd1b3VzIGRlZmluaXRpb25zIGFzIGVycm9yc1xyXG4gICAgZmFpbEZhc3Q6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gYWJvcnQgdGhlIHJ1biBvbiBmaXJzdCBmYWlsdXJlXHJcbiAgICBpZ25vcmVVbmRlZmluZWREZWZpbml0aW9uczogZmFsc2UsIC8vIDxib29sZWFuPiB0cmVhdCB1bmRlZmluZWQgZGVmaW5pdGlvbnMgYXMgd2FybmluZ3NcclxuICAgIG5hbWU6IFtdLCAvLyA8UkVHRVhQW10+IG9ubHkgZXhlY3V0ZSB0aGUgc2NlbmFyaW9zIHdpdGggbmFtZSBtYXRjaGluZyB0aGUgZXhwcmVzc2lvbiAocmVwZWF0YWJsZSlcclxuICAgIHByb2ZpbGU6IFtdLCAvLyA8c3RyaW5nPiAobmFtZSkgc3BlY2lmeSB0aGUgcHJvZmlsZSB0byB1c2VcclxuICAgIHJlcXVpcmU6IFtdLCAvLyA8c3RyaW5nPiAoZmlsZS9kaXIvZ2xvYikgcmVxdWlyZSBmaWxlcyBiZWZvcmUgZXhlY3V0aW5nIGZlYXR1cmVzXHJcbiAgICBvcmRlcjogJ2RlZmluZWQnLCAvLyA8c3RyaW5nPiBzd2l0Y2ggYmV0d2VlbiBkZXRlcm1pbmlzdGljICBhbmQgcmFuZG9tIGZlYXR1cmUgZXhlY3V0aW9uLiBFaXRoZXIgXCJkZWZpbmVkXCIsIFwicmFuZG9tXCIgb3IgXCJyYW5kb206NDJcIiB3aGVyZWFzIDQyIGlzIHRoZSBzZWVkIGZvciByYW5kb21pemF0aW9uXHJcbiAgICBzbmlwcGV0U3ludGF4OiB1bmRlZmluZWQsIC8vIDxzdHJpbmc+IHNwZWNpZnkgYSBjdXN0b20gc25pcHBldCBzeW50YXhcclxuICAgIHNuaXBwZXRzOiB0cnVlLCAvLyA8Ym9vbGVhbj4gaGlkZSBzdGVwIGRlZmluaXRpb24gc25pcHBldHMgZm9yIHBlbmRpbmcgc3RlcHNcclxuICAgIHNvdXJjZTogdHJ1ZSwgLy8gPGJvb2xlYW4+IGhpZGUgc291cmNlIHVyaXNcclxuICAgIHN0cmljdDogZmFsc2UsIC8vIDxib29sZWFuPiBmYWlsIGlmIHRoZXJlIGFyZSBhbnkgdW5kZWZpbmVkIG9yIHBlbmRpbmcgc3RlcHNcclxuICAgIHRhZ0V4cHJlc3Npb246ICcnLCAvLyA8c3RyaW5nPiAoZXhwcmVzc2lvbikgb25seSBleGVjdXRlIHRoZSBmZWF0dXJlcyBvciBzY2VuYXJpb3Mgd2l0aCB0YWdzIG1hdGNoaW5nIHRoZSBleHByZXNzaW9uXHJcbiAgICB0YWdzSW5UaXRsZTogZmFsc2UsIC8vIDxib29sZWFuPiBhZGQgY3VjdW1iZXIgdGFncyB0byBmZWF0dXJlIG9yIHNjZW5hcmlvIG5hbWVcclxuICAgIHRpbWVvdXQ6IERFRkFVTFRfVElNRU9VVCAvLyA8bnVtYmVyPiB0aW1lb3V0IGZvciBzdGVwIGRlZmluaXRpb25zIGluIG1pbGxpc2Vjb25kc1xyXG59O1xyXG5jb25zdCBNT0RVTEVfTkFNRV9NQVRDSF9SRUdFWCA9IC9ebW9kdWxlLSguKz8pXFwuanMkLztcclxuY29uc3QgU0VSVklDRV9OQU1FX01BVENIX1JFR0VYID0gL15zZXJ2aWNlLSguKz8pXFwuanMkLztcclxuY29uc3QgRE9fTk9UX1dSQVBfTUVUSE9EUyA9IFsnZHJpdmVyJywgJ2dldERyaXZlciddO1xyXG5cclxuY29uc3QgREVGQVVMVF9DVFggPSB7XHJcbiAgICBwYXJhbXM6IHt9LFxyXG4gICAgdmFyczoge30sXHJcbiAgICBlbnY6IHt9LFxyXG4gICAgY2Fwczoge30sXHJcbiAgICBhdHRyaWJ1dGVzOiB7fSxcclxufTtcclxuY29uc3QgREVGQVVMVF9SRVNVTFRfU1RPUkUgPSB7XHJcbiAgICBzdGVwczogW10sXHJcbiAgICBsb2dzOiBbXSxcclxuICAgIGhhcjogbnVsbCxcclxuICAgIGF0dHJpYnV0ZXM6IHt9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPeHlnZW4gZXh0ZW5kcyBPeHlnZW5FdmVudHMge1xyXG4gICAgY29uc3RydWN0b3IgKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZSA9IHsgLi4uREVGQVVMVF9SRVNVTFRfU1RPUkUgfTtcclxuICAgICAgICB0aGlzLmN0eCA9IHsgLi4uREVGQVVMVF9DVFggfTtcclxuICAgICAgICB0aGlzLm1vZHVsZXMgPSB7fTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VzID0ge307XHJcbiAgICAgICAgdGhpcy5yZXBvID0ge307XHJcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMub3B0cyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5veEJhc2VEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vJyk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcignT3h5Z2VuJykpO1xyXG4gICAgICAgIHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdCA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQob3B0aW9ucywgY2FwcywgY3R4ID0ge30sIHJlc3VsdHMgPSB7fSkge1xyXG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9PUFRTLCBvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmN3ZCA9IHRoaXMub3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgICAgICB0aGlzLmN0eCA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9DVFgsIGN0eCB8fCB7fSk7XHJcbiAgICAgICAgdGhpcy5jdHguY2FwcyA9IHsgLi4uY3R4LmNhcHMgfHwge30sIC4uLmNhcHMsIH07XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZSA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9SRVNVTFRfU1RPUkUsIHJlc3VsdHMgfHwge30pO1xyXG4gICAgICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gdGhpcy5jdHguY2FwcyA9IGNhcHM7XHJcblxyXG4gICAgICAgIGlmIChjdHguYXR0cmlidXRlcyAmJiAoIXJlc3VsdHMuYXR0cmlidXRlcyB8fCAhT2JqZWN0LmtleXMocmVzdWx0cy5hdHRyaWJ1dGVzKS5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUuYXR0cmlidXRlcyA9IHsgLi4uY3R4LmF0dHJpYnV0ZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRlZmluZSAnb3gnIG9iamVjdCBpbiBnbG9iYWwgSlMgc2NvcGVcclxuICAgICAgICAvLyB3ZSB3aWxsIHVzZSB0aGlzIG9iamVjdCB0byBhY2Nlc3MgT3h5Z2VuIG1vZHVsZXMgYW5kIHRlc3QgY29udGV4dCBmcm9tIG1vZHVsZXMgdXNlZCBpbiB0aGUgdGVzdCAoaWYgYW55KSAgICAgICAgXHJcbiAgICAgICAgdGhpcy5tYWtlT3hHbG9iYWwoKTtcclxuICAgICAgICAvLyBsb2FkIHNlcnZpY2VzXHJcbiAgICAgICAgdGhpcy5fbG9hZFNlcnZpY2VzKCk7XHJcbiAgICAgICAgLy8gbG9hZCBtb2R1bGVzXHJcbiAgICAgICAgdGhpcy5fbG9hZE1vZHVsZXMoKTtcclxuICAgICAgICAvLyBpZiBvcHRpb25zLm1ha2VNb2R1bGVzR2xvYmFsIGlzIHRydWUgb3IgdW5kZWZpbmVkIHRoYW4gZGVmaW5lICdjdHgnIGNvbnRlbnQgYW5kIGVhY2ggbW9kdWxlIGluIGdsb2JhbCBzY29wZVxyXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm1ha2VDb250ZXh0QW5kTW9kdWxlc0dsb2JhbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBtb2R1bGVzOiAnLCBlKTtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGlzcG9zZU1vZHVsZXMoc3RhdHVzKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGlzcG9zZVNlcnZpY2VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRpc3Bvc2U6ICcsIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgYWRqdXN0U2NyaXB0TGluZSgpIHtcclxuICAgICAgICBjb25zdCBpc0luRGVidWdNb2RlID0gb3h1dGlsLmlzSW5EZWJ1Z01vZGUoKTtcclxuICAgICAgICAvLyBhZGQgZXh0cmEgbGluZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBkZWJ1Z2dlciBtb2RlIChWOCBkZWJ1Z2dlciBhZGRzIGFuIGV4dHJhIGxpbmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSlcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBpc0luRGVidWdNb2RlID8gLTEgOiAwO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRleHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4O1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBjb250ZXh0KGN0eCkge1xyXG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xyXG4gICAgICAgIGlmIChnbG9iYWwub3gpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLm94LmN0eCA9IGN0eDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIFwicGFyYW1zXCIgYW5kIFwiZW52XCIgaW4gXCJveFwiIGdsb2JhbCB2YXJpYWJsZVxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLnBhcmFtcyA9IGN0eC5wYXJhbXMgfHwge307XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuZW52ID0gY3R4LmVudiB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5hdHRyaWJ1dGVzID0gY3R4LmF0dHJpYnV0ZXMgfHwge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlcG9zaXRvcnkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcmVwb3NpdG9yeShyZXBvKSB7XHJcbiAgICAgICAgdGhpcy5yZXBvID0gcmVwbztcclxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5veC5yZXBvID0gcmVwbztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlc3VsdHMoKSB7XHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRpbWUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGYgLSBzdW1tYXJ5IG9mIGR1cmF0aW9ucyBmb3IgYWxsIHRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zYWN0aW9uXHJcbiAgICAgICAgLy8gYWxzbyBhZGp1c3QgdHJhbnNhY3Rpb24gZW5kIHRpbWUgdG8gbXVjaCBlbmQgdGltZSBmb3IgdGhlIGxhc3QgZXhlY3V0ZWQgc3RlcCB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cclxuICAgICAgICBmb3IgKGNvbnN0IHRyYW5zU3RlcCBvZiB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzKSB7XHJcbiAgICAgICAgICAgIGlmICh0cmFuc1N0ZXAubmFtZS5pbmNsdWRlcygnLnRyYW5zYWN0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zTmFtZSA9IHRyYW5zU3RlcC50cmFuc2FjdGlvbjtcclxuICAgICAgICAgICAgICAgIHRyYW5zU3RlcC5kdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgYmVsb25ncyB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAmIGlzIG5vdCB0aGUgdHJhbnNhY3Rpb24gc3RlcFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLnRyYW5zYWN0aW9uID09PSB0cmFuc05hbWUgJiYgc3RlcCAhPT0gdHJhbnNTdGVwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zU3RlcC5kdXJhdGlvbiArPSBzdGVwLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC5lbmRUaW1lID4gdHJhbnNTdGVwLmVuZFRpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zU3RlcC5lbmRUaW1lID0gc3RlcC5lbmRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdFN0b3JlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1vZHVsZXNDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1vZENhcHMgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgICAgIGlmIChtb2R1bGUubmFtZSAmJiBtb2R1bGUuX2dldENhcGFiaWxpdGllcyAmJiB0eXBlb2YgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhcHMgPSBtb2R1bGUuX2dldENhcGFiaWxpdGllcygpO1xyXG4gICAgICAgICAgICAgICAgLy8gc3RvcmUgb25seSBub24tZW1wdHkgY2FwcyBwZXIgbW9kdWxlIHRoYXQgaGFzIHRoaXMuY2FwcyBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGNhcHMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RDYXBzW21vZHVsZS5uYW1lXSA9IGNhcHM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1vZENhcHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRSZXN1bHRzKCkge1xyXG4gICAgICAgIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMgPSBbXTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmxvZ3MgPSBbXTtcclxuICAgICAgICB0aGlzLmhhciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25CZWZvcmVDYXNlKGNvbnRleHQpIHtcclxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLm9uQmVmb3JlQ2FzZSAmJiBhd2FpdCBtb2R1bGUub25CZWZvcmVDYXNlKGNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLl9pdGVyYXRpb25TdGFydCAmJiBhd2FpdCBtb2R1bGUuX2l0ZXJhdGlvblN0YXJ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uQmVmb3JlQ2FzZVwiIG1ldGhvZCBvZiAke21vZHVsZU5hbWV9IG1vZHVsZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkFmdGVyQ2FzZShlcnJvciA9IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgZm9yIGF2b2lkIHN0dWNrIG9uICouZGlzcG9zZSBjYWxsXHJcbiAgICAgICAgICAgICAgICBtb2R1bGUub25BZnRlckNhc2UgJiYgYXdhaXQgbW9kdWxlLm9uQWZ0ZXJDYXNlKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5faXRlcmF0aW9uRW5kICYmIGF3YWl0IG1vZHVsZS5faXRlcmF0aW9uRW5kKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25BZnRlckNhc2VcIiBtZXRob2Qgb2YgJHttb2R1bGVOYW1lfSBtb2R1bGUuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZU94R2xvYmFsKCkge1xyXG4gICAgICAgIGlmICghZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5veCA9IHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZXM6IHRoaXMubW9kdWxlcyxcclxuICAgICAgICAgICAgICAgIGN0eDogdGhpcy5jdHgsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdHMsXHJcbiAgICAgICAgICAgICAgICBjYXBzOiB0aGlzLmNhcGFiaWxpdGllcyxcclxuICAgICAgICAgICAgICAgIHJlc3VsdFN0b3JlOiB0aGlzLnJlc3VsdFN0b3JlLFxyXG4gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlOiB0aGlzLmFkZEF0dHJpYnV0ZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBnbG9iYWwudmFycyA9IHRoaXMuY3R4LnZhcnM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1ha2VDb250ZXh0QW5kTW9kdWxlc0dsb2JhbCgpIHtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgJ294JyBpcyBhbHJlYWR5IGdsb2JhbFxyXG4gICAgICAgIGlmIChnbG9iYWwub3gpIHtcclxuICAgICAgICAgICAgLy8gZXhwb3NlIG1vZHVsZXMgYXMgZ2xvYmFsIHZhcmlhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFnbG9iYWxbbW9kdWxlTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxbbW9kdWxlTmFtZV0gPSB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZXhwb3NlIFwiY3R4XCIsIFwicGFyYW1zXCIgYW5kIFwiZW52XCIgYXMgZ2xvYmFsIHZhcmlhYmxlc1xyXG4gICAgICAgICAgICBnbG9iYWwucGFyYW1zID0gZ2xvYmFsLm94LmN0eC5wYXJhbXM7XHJcbiAgICAgICAgICAgIGdsb2JhbC5lbnYgPSBnbG9iYWwub3guY3R4LmVudjtcclxuICAgICAgICAgICAgZ2xvYmFsLmN0eCA9IGdsb2JhbC5veC5jdHg7XHJcbiAgICAgICAgICAgIGdsb2JhbC5hdHRyaWJ1dGVzID0gZ2xvYmFsLm94LmN0eC5hdHRyaWJ1dGVzIHx8IHt9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5yZXN1bHRTdG9yZSAmJiB0aGlzLnJlc3VsdFN0b3JlLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQYWdlT2JqZWN0RmlsZShwb1BhdGgpIHtcclxuICAgICAgICBpZiAoIXBvUGF0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvID0gcmVxdWlyZShwb1BhdGgpO1xyXG4gICAgICAgICAgICAvLyBzZXQgcGFnZSBvYmplY3QgcmVwb3NpdG9yeSBhcyB0aGUgbWFpbiBvbmVcclxuICAgICAgICAgICAgdGhpcy5yZXBvc2l0b3J5ID0gcG87XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5wbyA9IHBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvclxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogUHJpdmF0ZSBNZXRob2RzXHJcbiAgICAgKi9cclxuICAgIF93cmFwTG9nZ2VyKF9sb2dnZXIpIHtcclxuICAgICAgICBjb25zdCBsb2dnZXJXcmFwID0ge1xyXG4gICAgICAgICAgICBpbmZvOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdpbmZvJywgYXJncyksXHJcbiAgICAgICAgICAgIGRlYnVnOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdkZWJ1ZycsIGFyZ3MpLFxyXG4gICAgICAgICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZXJyb3InLCBhcmdzKSxcclxuICAgICAgICAgICAgd2FybjogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnd2FybicsIGFyZ3MpLFxyXG4gICAgICAgICAgICB1c2VySW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MsIElTU1VFUlMuVVNFUiksXHJcbiAgICAgICAgICAgIHVzZXJEZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgICAgICB1c2VyRXJyb3I6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2Vycm9yJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICAgICAgdXNlcldhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGxvZ2dlcldyYXA7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvZyhfbG9nZ2VyLCBsZXZlbCwgYXJncywgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgaWYgKCFfbG9nZ2VyW2xldmVsXSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF9sb2dnZXJbbGV2ZWxdLmFwcGx5KF9sb2dnZXIsIGFyZ3MpO1xyXG5cclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gb3h1dGlsLnN0cmluZ2lmeShhcmdzLCAyKTtcclxuICAgICAgICBjb25zdCB0aW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIC8vIGFkZCB0aGUgbG9nIGVudHJ5IHRvIHRoZSByZXN1bHQgc3RvcmVcclxuICAgICAgICBpZiAodGhpcy5yZXN1bHRTdG9yZSAmJiB0aGlzLnJlc3VsdFN0b3JlLmxvZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBsZXZlbC50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICAgICAgICAgICAgbXNnOiBtZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgc3JjOiBzcmNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlbW92ZSBmaXJzdCBhcmd1bWVudCwgaWYgaXQncyBhIG1lc3NhZ2VcclxuICAgICAgICBhcmdzID0gbWVzc2FnZSA/IGFyZ3Muc2hpZnQoKSA6IGFyZ3M7XHJcbiAgICAgICAgdGhpcy5lbWl0TG9nKHRpbWUsIGxldmVsLCBtZXNzYWdlLCBhcmdzLCBzcmMpO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkU2VydmljZXMoKSB7XHJcbiAgICAgICAgY29uc3Qgb3hTZXJ2aWNlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X3NlcnZpY2VzJyk7XHJcbiAgICAgICAgY29uc3Qgc2VydmljZUZpbGVzID0gZ2xvYi5zeW5jKCdzZXJ2aWNlLSouanMnLCB7IGN3ZDogb3hTZXJ2aWNlc0RpclBhdGggfSk7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbGwgc2VydmljZXNcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBzZXJ2aWNlcy4uLicpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcnZpY2VGaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZU5hbWUgPSBzZXJ2aWNlRmlsZXNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlUGF0aCA9IHBhdGguam9pbihveFNlcnZpY2VzRGlyUGF0aCwgc2VydmljZUZpbGVOYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VydmljZUZpbGVOYW1lLm1hdGNoKFNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gcmVzdWx0WzFdO1xyXG5cclxuICAgICAgICAgICAgLy8gdGhpcy5vcHRzLnNlcnZpY2VzID0gdW5kZWZpbmVkIGluIHNpbmdsZSBmaWxlIG1vZGVcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRzLnNlcnZpY2VzKSAmJiAhdGhpcy5vcHRzLnNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2VOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBzZXJ2aWNlOiAnICsgc2VydmljZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuX2xvYWRTZXJ2aWNlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlRmlsZVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5pbml0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgc2VydmljZSBcIicgKyBzZXJ2aWNlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2xvYWRTZXJ2aWNlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlUGF0aCkge1xyXG4gICAgICAgIGxldCBTZXJ2aWNlQ2xhc3MgPSByZXF1aXJlKHNlcnZpY2VQYXRoKTtcclxuICAgICAgICAvLyBFUzYgY2xhc3Mgd2lsbCBiZSB1bmRlciAnZGVmYXVsdCcgcHJvcGVydHlcclxuICAgICAgICBpZiAoU2VydmljZUNsYXNzLmRlZmF1bHQpIHtcclxuICAgICAgICAgICAgU2VydmljZUNsYXNzID0gU2VydmljZUNsYXNzLmRlZmF1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgU2VydmljZToke3NlcnZpY2VOYW1lfWApKTtcclxuICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VDbGFzcyh0aGlzLm9wdHMsIHRoaXMuY3R4LCB0aGlzLnJlc3VsdFN0b3JlLCBzZXJ2aWNlTG9nZ2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZE1vZHVsZXMoKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgaW50ZXJuYWwgbW9kdWxlcy4uLicpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRJbnRlcm5hbE1vZHVsZXMoKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBleHRlcm5hbCBtb2R1bGVzLi4uJyk7XHJcbiAgICAgICAgdGhpcy5fbG9hZEV4dGVybmFsTW9kdWxlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkRXh0ZXJuYWxNb2R1bGVzKCkge1xyXG4gICAgICAgIGxldCBtb2R1bGVzRm9sZGVyUGF0aCA9ICcuL21vZHVsZXMnO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMubW9kdWxlc19leHQgJiYgdHlwZW9mIHRoaXMub3B0cy5tb2R1bGVzX2V4dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgbW9kdWxlc0ZvbGRlclBhdGggPSB0aGlzLm9wdHMubW9kdWxlc19leHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vY29uc3Qgb3hNb2R1bGVzRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLm94QmFzZURpciwgJy4vb3hfbW9kdWxlcycpO1xyXG4gICAgICAgIGNvbnN0IG94TW9kdWxlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5jd2QsIG1vZHVsZXNGb2xkZXJQYXRoKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3hNb2R1bGVzRGlyUGF0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbW9kdWxlRmlsZXMgPSBbXTtcclxuICAgICAgICAvLyBpZiBwYXJ0aWN1bGFyIG1vZHVsZSBuYW1lcyBhcmUgZGVmaW5lZCBpbiB0aGUgY29uZmlnLCB0aGVuIGxvYWQgb25seSB0aGVzZSBtb2R1bGVzXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRzLm1vZHVsZXMpICYmIHRoaXMub3B0cy5tb2R1bGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLm1vZHVsZXMuZm9yRWFjaChtb2R1bGVOYW1lID0+IG1vZHVsZUZpbGVzLnB1c2goYG1vZHVsZS0ke21vZHVsZU5hbWV9LmpzYCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBvdGhlcndpc2UsIGxvYWQgYWxsIGF2YWlsYWJsZSBtb2R1bGVzIChtaWdodCBiZSBtb3JlIHRpbWUgY29uc3VtaW5nKVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBtb2R1bGVGaWxlcyA9IGdsb2Iuc3luYygnbW9kdWxlLSouanMnLCB7IGN3ZDogb3hNb2R1bGVzRGlyUGF0aCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbGwgbW9kdWxlcyAgICAgICAgXHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlRmlsZU5hbWUgb2YgbW9kdWxlRmlsZXMpIHtcclxuICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gdGhlIG1vZHVsZSBmaWxlIG5hbWUgYmFzZWQgb24gbW9kdWxlIG5hbWUgcGF0dGVyblxyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGVOYW1lID0gbW9kdWxlRmlsZU5hbWUubWF0Y2goTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgpWzFdO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IGxvZ2dlciBmb3IgdGhlIG1vZHVsZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYE1vZHVsZToke21vZHVsZU5hbWV9YCkpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbW9kdWxlIGluc3RhbmNlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2QgPSBjb3JlVXRpbHMubG9hZE1vZHVsZUZyb21GaWxlKG1vZHVsZU5hbWUsIG1vZHVsZUZpbGVOYW1lLCBtb2R1bGVMb2dnZXIsIG94TW9kdWxlc0RpclBhdGgsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2FsbCBvbk1vZHVsZUxvYWRlZCBob29rXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZChtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb2R1bGUgdG8gdGhlIG1vZHVsZSBsaXN0XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gPSBnbG9iYWwub3gubW9kdWxlc1ttb2R1bGVOYW1lXSA9IHRoaXMuX3dyYXBNb2R1bGUobW9kdWxlTmFtZSwgbW9kKTtcclxuICAgICAgICAgICAgICAgIC8vIHdyYXAgdXBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoZW5kVGltZSAtIHN0YXJ0VGltZSkgLyAxMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgbW9kdWxlOiAnICsgbW9kdWxlTmFtZSArICcgWyAnICsgZHVyYXRpb24gKyAnIHNlYyBdJyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlIFwiJyArIG1vZHVsZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgbW9kdWxlIHRoYXQgZmFpbGVkIHRvIGxvYWQsIGV4Y2VwdCBXZWIgYW5kIE1vYiBtb2R1bGVzXHJcbiAgICAgICAgICAgICAgICAvLyB3aXRob3V0IE1vYiBhbmQgV2ViIG1vZHVsZXMgbG9hZGVkLCB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaGFsbCBmYWlsXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ3dlYicgfHwgbW9kdWxlTmFtZSA9PT0gJ21vYicpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEludGVybmFsTW9kdWxlcygpIHtcclxuICAgICAgICAvLyBpZiBgbW9kdWxlc2AgaXMgZW1wdHkgb3IgdW5kZWZpbmVkIGluIG94eWdlbi5jb25mIHRoZW4gbG9hZCBhbGwgbW9kdWxlc1xyXG4gICAgICAgIC8vIG90aGVyd2lzZSwgbG9hZCBvbmx5IHRob3NlIGltcGxpY2l0bHkgZGVmaW5lZFxyXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVVbmRlZmluZWRNb2RzID0gdGhpcy5vcHRzLm1vZHVsZXMgJiYgdGhpcy5vcHRzLm1vZHVsZXMubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBvZiBPYmplY3Qua2V5cyhNb2R1bGVzKSkge1xyXG4gICAgICAgICAgICBpZiAoZXhjbHVkZVVuZGVmaW5lZE1vZHMgJiYgIXRoaXMub3B0cy5tb2R1bGVzLmluY2x1ZGVzKG1vZHVsZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBNb2R1bGVDbGFzcyA9IE1vZHVsZXNbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgICAgIGNvbnN0IG94TW9kdWxlc0RpclBhdGggPSBveHV0aWwuZ2V0T3hNb2R1bGVzRGlyKCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbG9nZ2VyIGZvciB0aGUgbW9kdWxlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgTW9kdWxlOiR7bW9kdWxlTmFtZX1gKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBtb2R1bGUgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGNvcmVVdGlscy5sb2FkTW9kdWxlRnJvbUNsYXNzKG1vZHVsZU5hbWUsIE1vZHVsZUNsYXNzLCBtb2R1bGVMb2dnZXIsIG94TW9kdWxlc0RpclBhdGgsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2FsbCBvbk1vZHVsZUxvYWRlZCBob29rXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZChtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb2R1bGUgdG8gdGhlIG1vZHVsZSBsaXN0XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gPSBnbG9iYWwub3gubW9kdWxlc1ttb2R1bGVOYW1lXSA9IHRoaXMuX3dyYXBNb2R1bGUobW9kdWxlTmFtZSwgbW9kKTtcclxuICAgICAgICAgICAgICAgIC8vIHdyYXAgdXBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoZW5kVGltZSAtIHN0YXJ0VGltZSkgLyAxMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgbW9kdWxlOiAnICsgbW9kdWxlTmFtZSArICcgWyAnICsgZHVyYXRpb24gKyAnIHNlYyBdJyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlIFwiJyArIG1vZHVsZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgbW9kdWxlIHRoYXQgZmFpbGVkIHRvIGxvYWQsIGV4Y2VwdCBXZWIgYW5kIE1vYiBtb2R1bGVzXHJcbiAgICAgICAgICAgICAgICAvLyB3aXRob3V0IE1vYiBhbmQgV2ViIG1vZHVsZXMgbG9hZGVkLCB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaGFsbCBmYWlsXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ3dlYicgfHwgbW9kdWxlTmFtZSA9PT0gJ21vYicpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfd3JhcE1vZHVsZShuYW1lLCBtb2R1bGUpIHtcclxuICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3cmFwcGVyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBuYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IG1vZHVsZU1ldGhvZHMgPSBPYmplY3Qua2V5cyhtb2R1bGUpO1xyXG4gICAgICAgIGlmICghbW9kdWxlTWV0aG9kcy5zb21lKHggPT4geD09PSAnZXhwb3J0cycpKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZU1ldGhvZHMgPSB0aGlzLl9nZXRBbGxQcm9wZXJ0eU5hbWVzKG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG1ldGhvZE5hbWUgb2YgbW9kdWxlTWV0aG9kcykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSBtb2R1bGVbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgbW9kdWxlIHByb3BlcnR5IHRoYXQgaXMgbm90IGEgZnVuY3Rpb24gb3IgYSBPeHlnZW5TdWJNb2R1bGVcclxuICAgICAgICAgICAgaWYgKCghKG1ldGhvZCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSAmJiAhKG1ldGhvZCBpbnN0YW5jZW9mIE94eWdlblN1Yk1vZHVsZSkgJiYgdHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykgfHwgbWV0aG9kTmFtZSA9PT0gJ2V4cG9ydHMnIHx8IG1ldGhvZE5hbWUgPT09ICdfY29tcGlsZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG1hcCBhbmQgd3JhcCBzdWItbW9kdWxlIG1ldGhvZHMgKHJlY3Vyc2l2ZSBjYWxsIHRvIF93cmFwTW9kdWxlKVxyXG4gICAgICAgICAgICBpZiAobWV0aG9kIGluc3RhbmNlb2YgT3h5Z2VuU3ViTW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShgJHtuYW1lfS4ke21ldGhvZE5hbWV9YCwgbWV0aG9kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBkbyBub3Qgd3JhcCBtZXRob2RzXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKERPX05PVF9XUkFQX01FVEhPRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIC8vID09PSAnZHJpdmVyJyB8fCBtZXRob2ROYW1lID09PSAnZ2V0RHJpdmVyJ1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9IG1vZHVsZVttZXRob2ROYW1lXS5iaW5kKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcHJpdmF0ZSBtZXRob2RzIGFuZCBldmVudCBoYW5kbGVyc1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtZXRob2ROYW1lLmluZGV4T2YoJ18nKSA9PT0gMCB8fCBtZXRob2ROYW1lLmluZGV4T2YoJ29uJykgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nOiAnICsgb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShuYW1lLCBtZXRob2ROYW1lLCBhcmdzKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVbbWV0aG9kTmFtZV0uYXBwbHkobW9kdWxlLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9ySGVscGVyLmdldE94eWdlbkVycm9yKGUsIG5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gaW50ZXJuYWwgX2dldENhcGFiaWxpdGllcyBtZXRob2QgZm9yIGludGVybmFsIE94eWdlbiBDb3JlIHVzZVxyXG4gICAgICAgICAgICAgICAgLy8gY2FsbGluZyBfZ2V0Q2FwYWJpbGl0aWVzIG1ldGhvZCB3b24ndCBiZSB2aXNpYmxlIGluIHRoZSB0ZXN0IHJlc3VsdHNcclxuICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZ2V0Q2FwYWJpbGl0aWVzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZXJbJ19nZXRDYXBhYmlsaXRpZXMnXSA9IG1ldGhvZC5iaW5kKG1vZHVsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2NvbW1hbmRXcmFwcGVyKG1ldGhvZE5hbWUsIGFyZ3MsIG1vZHVsZSwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgT3hFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGhyb3dpbmcgYWdhaW46JywgZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gd3JhcHBlcjtcclxuICAgIH1cclxuXHJcbiAgICBfY29tbWFuZFdyYXBwZXIoY21kTmFtZSwgY21kQXJncywgbW9kdWxlLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKCFtb2R1bGUgfHwgIW1vZHVsZVtjbWROYW1lXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJldHZhbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcclxuICAgICAgICBjb25zdCBjbWRGbiA9IG1vZHVsZVtjbWROYW1lXTtcclxuICAgICAgICBjb25zdCBwdWJsaWNNZXRob2QgPSAhY21kTmFtZS5zdGFydHNXaXRoKCdfJykgJiYgY21kTmFtZSAhPT0gJ2Rpc3Bvc2UnO1xyXG5cclxuICAgICAgICAvLyBkZWxheSB0aGUgY29tbWFuZCBleGVjdXRpb24gaWYgcmVxdWlyZWRcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5kZWxheSAmJlxyXG4gICAgICAgICAgICBwdWJsaWNNZXRob2QgJiZcclxuICAgICAgICAgICAgY21kTmFtZSAhPT0gJ2luaXQnICYmXHJcbiAgICAgICAgICAgIGNtZE5hbWUgIT09ICd0cmFuc2FjdGlvbidcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZGVhc3luYy5zbGVlcCh0aGlzLm9wdHMuZGVsYXkgKiAxMDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRocm93IGlmIGEgY29tbWFuZCBleGVjdXRlZCBvbiB1bml0aWFsaXplZCBtb2R1bGUgKGV4Y2VwdCBpbnRlcm5hbCBtZXRob2RzIGFuZCBhIGZldyBvdGhlcilcclxuICAgICAgICBpZiAoIW1vZHVsZS5pc0luaXRpYWxpemVkICYmIHB1YmxpY01ldGhvZCAmJiBjbWROYW1lICE9PSAnaW5pdCcgJiYgY21kTmFtZSAhPT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ01pc3NpbmcgJyArIG1vZHVsZU5hbWUgKyAnLmluaXQoKScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZGVjdHlwdCBhcmd1bWVudHNcclxuICAgICAgICBsZXQgZGVjcnlwdGVkQXJncyA9IHRoaXMuX2dldERlY3J5cHRlZEFyZ3NGb3JBcHBseShjbWRBcmdzLCBtb2R1bGVOYW1lKTtcclxuICAgICAgICBkZWNyeXB0ZWRBcmdzID0gdGhpcy5fcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUoZGVjcnlwdGVkQXJncyk7XHJcblxyXG4gICAgICAgIC8vIHJlcGxhY2UgcGFyYW1ldGVycyBpbiBtZXRob2QgYXJndW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXNcclxuICAgICAgICBjbWRBcmdzID0gdGhpcy5fcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUoY21kQXJncyk7XHJcbiAgICAgICAgLy8gc3RhcnQgbWVhc3VyaW5nIG1ldGhvZCBleGVjdXRpb24gdGltZVxyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGNvbW1hbmQgbG9jYXRpb24gaW5mb3JtYXRpb24gKGUuZy4gZmlsZSBuYW1lIGFuZCBjb21tYW5kIGxpbmUpXHJcbiAgICAgICAgbGV0IGNtZExvY2F0aW9uID0gbnVsbDtcclxuICAgICAgICAvLyBkbyBub3QgcmVwb3J0IHJlc3VsdHMgb3IgbGluZSB1cGRhdGVzIG9uIGludGVybmFsIG1ldGhvZHMgKHN0YXJ0ZWQgd2l0aCAnXycpXHJcbiAgICAgICAgaWYgKHB1YmxpY01ldGhvZCkge1xyXG4gICAgICAgICAgICBjbWRMb2NhdGlvbiA9IHRoaXMuX2dldENvbW1hbmRMb2NhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCZWZvcmVDb21tYW5kKGNtZE5hbWUsIG1vZHVsZU5hbWUsIGNtZEZuLCBjbWRBcmdzLCB0aGlzLmN0eCwgY21kTG9jYXRpb24sIHN0YXJ0VGltZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nOiAnICsgb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIGVtaXQgYmVmb3JlIGV2ZW50c1xyXG4gICAgICAgICAgICBpZiAoY21kTmFtZSA9PT0gJ2Rpc3Bvc2UnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cmFwQXN5bmModGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZSkuYXBwbHkodGhpcywgW21vZHVsZV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXR2YWxQcm9taXNlID0gdGhpcy5fd3JhcEFzeW5jKG1vZHVsZVtjbWROYW1lXSkuYXBwbHkobW9kdWxlLCBkZWNyeXB0ZWRBcmdzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXR2YWxQcm9taXNlICYmIHJldHZhbFByb21pc2UudGhlbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VEb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dmFsUHJvbWlzZS50aGVuKCh2YWx1ZSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlRG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9LCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlRG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhcHJvbWlzZURvbmUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsUHJvbWlzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNtZE5hbWUgPT09ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd3JhcEFzeW5jKHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlSW5pdGlhbGl6ZWQpLmFwcGx5KHRoaXMsIFttb2R1bGVdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlICYmIGUubWVzc2FnZSAmJiB0eXBlb2YgZS5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2ludmFsaWQgc2Vzc2lvbiBpZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgaWYgZXJyb3Igb2N1cnJlZCBhZnRlciB0aGUgbW9kdWxlIHdhcyBkaXNwb3NlZCAob3IgaW4gYSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkKVxyXG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0IGZvciBpbml0IG1ldGhvZHMgb2YgY291cnNlXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBtb2R1bGUuaXNJbml0aWFsaXplZCA9PT0gJ2Jvb2xlYW4nICYmICFtb2R1bGUuaXNJbml0aWFsaXplZClcclxuICAgICAgICAgICAgICAgICAgICAmJiBjbWROYW1lICE9PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCc9PT09IGVycm9yID09PT0nLCBlKVxyXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuXHJcbiAgICAgICAgbGV0IHN0ZXBSZXN1bHQ7XHJcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHB1YmxpY01ldGhvZCkge1xyXG4gICAgICAgICAgICBjb25zdCB3YWl0SWQgPSArbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LnB1c2god2FpdElkKTtcclxuXHJcbiAgICAgICAgICAgIHN0ZXBSZXN1bHQgPSB0aGlzLl9nZXRTdGVwUmVzdWx0KG1vZHVsZSwgbW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncywgY21kTG9jYXRpb24sIHN0YXJ0VGltZSwgZW5kVGltZSwgcmV0dmFsLCBlcnJvcik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5pbmRleE9mKHdhaXRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgICAgLy9zdGVwUmVzdWx0LmxvY2F0aW9uID0gY21kTG9jYXRpb247XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzLnB1c2goc3RlcFJlc3VsdCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEFmdGVyQ29tbWFuZChjbWROYW1lLCBtb2R1bGVOYW1lLCBjbWRGbiwgY21kQXJncywgdGhpcy5jdHgsIGNtZExvY2F0aW9uLCBlbmRUaW1lLCBzdGVwUmVzdWx0KTtcclxuICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuaXNGYXRhbCAmJiAhdGhpcy5vcHRzLmNvbnRpbnVlT25FcnJvcikge1xyXG4gICAgICAgICAgICBpZiAoIWVycm9yLmxvY2F0aW9uICYmIGNtZExvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvci5sb2NhdGlvbiA9IGNtZExvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RlcFJlc3VsdCAmJiBzdGVwUmVzdWx0LmZhaWx1cmUgJiYgc3RlcFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvci5sb2NhdGlvbiA9IHN0ZXBSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXB1YmxpY01ldGhvZCkge1xyXG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XHJcblxyXG4gICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgX3dyYXBBc3luYyAoZm4sIGNvbnRleHQpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSBjb250ZXh0IHx8IHRoaXM7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvZGUgaXMgbm90IHJ1bm5pbmcgaW5zaWRlIHRoZSBGaWJlciBjb250ZXh0LCB0aGVuIHJ1biBhc3luYyBjb2RlIGFzIHN5bmMgdXNpbmcgZGVhc3luYyBtb2R1bGVcclxuICAgICAgICAgICAgaWYgKCFGaWJlci5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR2YWwgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGxldCBmaW5hbFZhbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJldHZhbCAmJiByZXR2YWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXR2YWwpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbCA9IHZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxWYWwgPSByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhZG9uZSAmJiAhZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5tZXNzYWdlICYmIHR5cGVvZiBlLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGUubWVzc2FnZS5pbmNsdWRlcygncmVhZHlTdGF0ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBlcnJvciBhcyBpdCB1c3VhbGx5IGhhcHBlbnMgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBPeHlnZW4gaXMgZGlzcG9zZWQgYW5kIHByb2Nlc3MgaXMgYmVpbmcga2lsbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlYXN5bmMubG9vcFdoaWxlKCkgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgcmV0dmFsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiB3ZSBhcmUgaW5zaWRlIHRoZSBGaWJlciBjb250ZXh0LCB0aGVuIHVzZSBGaWJlcidzIEZ1dHVyZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZnV0dXJlID0gbmV3IEZ1dHVyZSgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsKSA9PiBmdXR1cmUucmV0dXJuKHZhbCksIChlcnIpID0+IGZ1dHVyZS50aHJvdyhlcnIpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnV0dXJlLndhaXQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV0cmlldmUgY3VycmVudCBsaW5lIGFuZCBmdW5jdGlvbiBuYW1lIGZyb20gdGhlIGNhbGwgc3RhY2tcclxuICAgIF9nZXRDb21tYW5kTG9jYXRpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBfX3N0YWNrO1xyXG4gICAgICAgIGxldCBjYWxsZXIgPSBudWxsO1xyXG4gICAgICAgIGZvciAobGV0IGNhbGwgb2Ygc3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKF9fZmlsZW5hbWUgPT09IGNhbGwuZ2V0RmlsZU5hbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmaXJzdCBjYWxsZXIsIHdoaWNoIGlzIG5vdCB0aGUgY3VycmVudCBmaWxlXHJcbiAgICAgICAgICAgIGNhbGxlciA9IGNhbGw7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2FsbGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtjYWxsZXIuZ2V0RmlsZU5hbWUoKX06JHtjYWxsZXIuZ2V0TGluZU51bWJlcigpICsgdGhpcy5hZGp1c3RTY3JpcHRMaW5lfToke2NhbGxlci5nZXRDb2x1bW5OdW1iZXIoKX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0U3RlcFJlc3VsdChtb2R1bGUsIG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MsIGxvY2F0aW9uLCBzdGFydFRpbWUsIGVuZFRpbWUsIHJldHZhbCwgZXJyKSB7XHJcbiAgICAgICAgdmFyIHN0ZXAgPSBuZXcgU3RlcFJlc3VsdCgpO1xyXG5cclxuICAgICAgICBzdGVwLm5hbWUgPSBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIHN0ZXAudHJhbnNhY3Rpb24gPSBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgfHwgbnVsbDsgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHdoeSBpcyB0aGlzIGhlcmUgaWYgaXQncyBhbHJlYWR5IHBvcHVsYXRlZCBpbiBycz9cclxuICAgICAgICBzdGVwLmxvY2F0aW9uID0gbG9jYXRpb247XHJcblxyXG4gICAgICAgIGlmIChlcnIgJiYgZXJyLnR5cGUgJiYgZXJyLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfUEFTU0VEKSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU1RBVFVTLlBBU1NFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSBzdGVwIHN0YXR1c1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmlzRmF0YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1vZHVsZU5hbWUgPT09ICdsb2cnICYmIG1ldGhvZE5hbWUgPT09ICd3YXJuJykge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuV0FSTklORztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU1RBVFVTLlBBU1NFRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RlcC5hY3Rpb24gPSAodHlwZW9mIG1vZHVsZS5faXNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBtb2R1bGUuX2lzQWN0aW9uKG1ldGhvZE5hbWUpIDogZmFsc2UpO1xyXG4gICAgICAgIHN0ZXAuc3RhcnRUaW1lID0gc3RhcnRUaW1lO1xyXG4gICAgICAgIHN0ZXAuZW5kVGltZSA9IGVuZFRpbWU7XHJcbiAgICAgICAgc3RlcC5kdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlLl9nZXRTdGF0cyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBzdGVwLnN0YXRzID0gbW9kdWxlLl9nZXRTdGF0cyhtZXRob2ROYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdGVwLnN0YXRzID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLnR5cGUgJiYgZXJyLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfUEFTU0VEKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAmJiBlcnIudHlwZSAmJiAoZXJyLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5TRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQgfHwgZXJyLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5BUFBJVU1fU0VTU0lPTl9USU1FT1VUKSkge1xyXG4gICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0ZXAuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgIHN0ZXAuZmFpbHVyZS5sb2NhdGlvbiA9IGxvY2F0aW9uO1xyXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBtb2R1bGUgZGVjaWRlIHdoZXRoZXIgYSBzY3JlZW5zaG90IHNob3VsZCBiZSB0YWtlbiBvbiBlcnJvciBvciBub3RcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZS5fdGFrZVNjcmVlbnNob3RTaWxlbnQgPT09ICdmdW5jdGlvbicgJiYgIXRoaXMub3B0cy5kaXNhYmxlU2NyZWVuc2hvdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc2NyZWVuc2hvdCA9IG1vZHVsZS5fdGFrZVNjcmVlbnNob3RTaWxlbnQobWV0aG9kTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBoZXJlLCB3ZSB3ZXJlIHVuYWJsZSB0byBnZXQgYSBzY3JlZW5zaG90XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byB3YWl0IGZvciBhIG1vbWVudCAoaW4gUGVyZmVjdG8gQ2xvdWQsIHRoZSBzY3JlZW5zaG90IG1pZ2h0IG5vdCBiZSBpbW1pZGlhdGVseSBhdmFpbGFibGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYXN5bmMuc2xlZXAoMTAwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnNjcmVlbnNob3QgPSBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50KG1ldGhvZE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogaW5kaWNhdGUgdG8gdXNlciB0aGF0IGFuIGF0dGVtcHQgdG8gdGFrZSBhIHNjcmVlbnNob3QgaGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdGVwO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9kaXNwb3NlU2VydmljZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2VzIHx8IHR5cGVvZiB0aGlzLnNlcnZpY2VzICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VydmljZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBzZXJ2aWNlIGRpc3Bvc2FsIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkaXNwb3NlIHNlcnZpY2UgJyR7a2V5fSc6YCwgZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMubW9kdWxlcyB8fCB0eXBlb2YgdGhpcy5tb2R1bGVzICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kID0gdGhpcy5tb2R1bGVzW2tleV07XHJcblxyXG4gICAgICAgICAgICBpZiAobW9kLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcG9zZVJlc3VsdCA9IG1vZC5kaXNwb3NlKHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2VSZXN1bHQgJiYgdHlwZW9mIGRpc3Bvc2VSZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBhIHByb21pc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzcG9zZVJlc3VsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG1vZHVsZSBkaXNwb3NhbCBlcnJvciBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRpc3Bvc2UgbW9kdWxlICcke2tleX0nOiBgLCBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qXHJcbiAgICAgKiBTZXJ2aWNlcyBFdmVudCBFbWl0dGVyc1xyXG4gICAgICovXHJcbiAgICBfY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQobW9kdWxlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Nb2R1bGVMb2FkZWQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25Nb2R1bGVMb2FkZWRcIiBtZXRob2Qgb2YgJHtzZXJ2aWNlTmFtZX0gc2VydmljZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSkge1xyXG4gICAgICAgIGZvciAobGV0IHNlcnZpY2VOYW1lIGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2aWNlLm9uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25Nb2R1bGVJbml0aWFsaXplZFwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLm9uTW9kdWxlV2lsbERpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25Nb2R1bGVXaWxsRGlzcG9zZVwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlKGFyZ3MpIHtcclxuICAgICAgICBpZiAoIWFyZ3MgfHwgIUFycmF5LmlzQXJyYXkoYXJncykgfHwgYXJncy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJncztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgX25ld0FyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xyXG4gICAgICAgICAgICBfbmV3QXJncy5wdXNoKHRoaXMuX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50KGFyZykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX25ld0FyZ3M7XHJcbiAgICB9XHJcbiAgICBfcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQoYXJnKSB7XHJcbiAgICAgICAgaWYgKGFyZyAmJiB0eXBlb2YgYXJnLmdldERlY3J5cHRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdFTkNSWVBURUQnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSB1c2VyIHBhcmFtZXRlcnMgd2l0aCB2YWx1ZXNcclxuICAgICAgICAvLyBub3RlOiB1c2VyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIG5hbWUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGVudmlyb25tZW50IHZhcmlhYmxlXHJcbiAgICAgICAgZm9yIChsZXQgcGFyYW1OYW1lIGluIHRoaXMuY3R4LnBhcmFtcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdHgucGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtTmFtZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSB0aGlzLmN0eC5wYXJhbXNbcGFyYW1OYW1lXTtcclxuICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwkeycgKyBwYXJhbU5hbWUgKyAnfScsICdnJyksIHBhcmFtVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlcGxhY2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggdmFsdWVzXHJcbiAgICAgICAgZm9yIChsZXQgZW52TmFtZSBpbiB0aGlzLmN0eC5lbnYpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3R4LmVudi5oYXNPd25Qcm9wZXJ0eShlbnZOYW1lKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW52VmFsdWUgPSB0aGlzLmN0eC5lbnZbZW52TmFtZV07XHJcbiAgICAgICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJHsnICsgZW52TmFtZSArICd9JywgJ2cnKSwgZW52VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcmc7XHJcbiAgICB9XHJcbiAgICBfZ2V0QWxsUHJvcGVydHlOYW1lcyggb2JqICkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gW107XHJcblxyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoIG9iaiApLmZvckVhY2goZnVuY3Rpb24gKCBwcm9wICkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCBwcm9wcy5pbmRleE9mKCBwcm9wICkgPT09IC0xICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goIHByb3AgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxyXG4gICAgICAgIH0gd2hpbGUgKCBvYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoIG9iaiApICk7XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9wcztcclxuICAgIH1cclxuXHJcbiAgICBfY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGlmICh0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1N0ZXBSZXN1bHQocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3dhaXRTdGVwUmVzdWx0KCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkoYXJncywgbW9kdWxlTmFtZSkge1xyXG4gICAgICAgIGlmICghYXJncyB8fCAhQXJyYXkuaXNBcnJheShhcmdzKSB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBfbmV3QXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGFyZyBvZiBhcmdzKSB7XHJcbiAgICAgICAgICAgIF9uZXdBcmdzLnB1c2godGhpcy5fZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudChhcmcsIG1vZHVsZU5hbWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9uZXdBcmdzO1xyXG4gICAgfVxyXG5cclxuICAgIF9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50KGFyZywgbW9kdWxlTmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgJiYgdHlwZW9mIGFyZy5nZXREZWNyeXB0UmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdFTkNSWVBURUQnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZy5nZXREZWNyeXB0UmVzdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcmc7XHJcbiAgICB9XHJcbn1cclxuIl19
1041
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnbG9iYWwiLCJnZXQiLCJvcmlnIiwiRXJyb3IiLCJwcmVwYXJlU3RhY2tUcmFjZSIsIl8iLCJzdGFjayIsImVyciIsImNhcHR1cmVTdGFja1RyYWNlIiwiREVGQVVMVF9USU1FT1VUIiwiREVGQVVMVF9PUFRTIiwiYmFja3RyYWNlIiwiY29tcGlsZXIiLCJmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnMiLCJmYWlsRmFzdCIsImlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zIiwibmFtZSIsInByb2ZpbGUiLCJyZXF1aXJlIiwib3JkZXIiLCJzbmlwcGV0U3ludGF4IiwidW5kZWZpbmVkIiwic25pcHBldHMiLCJzb3VyY2UiLCJzdHJpY3QiLCJ0YWdFeHByZXNzaW9uIiwidGFnc0luVGl0bGUiLCJ0aW1lb3V0IiwiTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgiLCJTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgiLCJET19OT1RfV1JBUF9NRVRIT0RTIiwiREVGQVVMVF9DVFgiLCJwYXJhbXMiLCJ2YXJzIiwiZW52IiwiY2FwcyIsImF0dHJpYnV0ZXMiLCJERUZBVUxUX1JFU1VMVF9TVE9SRSIsInN0ZXBzIiwibG9ncyIsImF0dGFjaG1lbnRzIiwiaGFyIiwiT3h5Z2VuIiwiT3h5Z2VuRXZlbnRzIiwiY29uc3RydWN0b3IiLCJpc0luaXRpYWxpemVkIiwicmVzdWx0U3RvcmUiLCJjdHgiLCJtb2R1bGVzIiwic2VydmljZXMiLCJyZXBvIiwiY2FwYWJpbGl0aWVzIiwib3B0cyIsIm94QmFzZURpciIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwibG9nZ2VyIiwiX3dyYXBMb2dnZXIiLCJfd2FpdFN0ZXBSZXN1bHRMaXN0IiwiaW5pdCIsIm9wdGlvbnMiLCJyZXN1bHRzIiwiYXNzaWduIiwiY3dkIiwicHJvY2VzcyIsImtleXMiLCJsZW5ndGgiLCJtYWtlT3hHbG9iYWwiLCJfbG9hZFNlcnZpY2VzIiwiX2xvYWRNb2R1bGVzIiwiZ2xvYmFsU2NvcGUiLCJtYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwiLCJkaXNwb3NlTW9kdWxlcyIsInN0YXR1cyIsIl9kaXNwb3NlTW9kdWxlcyIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJkaXNwb3NlIiwiX2Rpc3Bvc2VTZXJ2aWNlcyIsImFkanVzdFNjcmlwdExpbmUiLCJpc0luRGVidWdNb2RlIiwib3h1dGlsIiwicmVzdWx0IiwiY29udGV4dCIsIm94IiwicmVwb3NpdG9yeSIsInRyYW5zU3RlcCIsImluY2x1ZGVzIiwidHJhbnNOYW1lIiwidHJhbnNhY3Rpb24iLCJkdXJhdGlvbiIsInN0ZXAiLCJlbmRUaW1lIiwiU1RBVFVTIiwiV0FSTklORyIsImdldE1vZHVsZXNDYXBhYmlsaXRpZXMiLCJtb2RDYXBzIiwibW9kdWxlTmFtZSIsIm1vZHVsZSIsIl9nZXRDYXBhYmlsaXRpZXMiLCJyZXNldFJlc3VsdHMiLCJvbkJlZm9yZUNhc2UiLCJfaXRlcmF0aW9uU3RhcnQiLCJvbkFmdGVyQ2FzZSIsIl9pdGVyYXRpb25FbmQiLCJhZGRBdHRyaWJ1dGUiLCJiaW5kIiwidmFsdWUiLCJsb2FkUGFnZU9iamVjdEZpbGUiLCJwb1BhdGgiLCJwbyIsIl9sb2dnZXIiLCJsb2dnZXJXcmFwIiwiaW5mbyIsImFyZ3MiLCJfbG9nIiwiZGVidWciLCJ3YXJuIiwidXNlckluZm8iLCJJU1NVRVJTIiwiVVNFUiIsInVzZXJEZWJ1ZyIsInVzZXJFcnJvciIsInVzZXJXYXJuIiwibGV2ZWwiLCJzcmMiLCJERUZBVUxUX0xPR0dFUl9JU1NVRVIiLCJhcHBseSIsIm1lc3NhZ2UiLCJzdHJpbmdpZnkiLCJ0aW1lIiwiZ2V0VGltZVN0YW1wIiwicHVzaCIsInRvVXBwZXJDYXNlIiwibXNnIiwic2hpZnQiLCJlbWl0TG9nIiwib3hTZXJ2aWNlc0RpclBhdGgiLCJyZXNvbHZlIiwic2VydmljZUZpbGVzIiwiZ2xvYiIsInN5bmMiLCJpIiwic2VydmljZUZpbGVOYW1lIiwic2VydmljZUZpbGVQYXRoIiwibWF0Y2giLCJzZXJ2aWNlTmFtZSIsIkFycmF5IiwiaXNBcnJheSIsInNlcnZpY2UiLCJfbG9hZFNlcnZpY2UiLCJFT0wiLCJzdGFja3RyYWNlIiwic2VydmljZVBhdGgiLCJTZXJ2aWNlQ2xhc3MiLCJkZWZhdWx0Iiwic2VydmljZUxvZ2dlciIsIl9sb2FkSW50ZXJuYWxNb2R1bGVzIiwiX2xvYWRFeHRlcm5hbE1vZHVsZXMiLCJtb2R1bGVzRm9sZGVyUGF0aCIsIm1vZHVsZXNfZXh0Iiwib3hNb2R1bGVzRGlyUGF0aCIsImZzIiwiZXhpc3RzU3luYyIsIm1vZHVsZUZpbGVzIiwiZm9yRWFjaCIsIm1vZHVsZUZpbGVOYW1lIiwic3RhcnRUaW1lIiwiRGF0ZSIsIm1vZHVsZUxvZ2dlciIsIm1vZCIsImNvcmVVdGlscyIsImxvYWRNb2R1bGVGcm9tRmlsZSIsIl9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZCIsIl93cmFwTW9kdWxlIiwiZXhjbHVkZVVuZGVmaW5lZE1vZHMiLCJNb2R1bGVzIiwiTW9kdWxlQ2xhc3MiLCJnZXRPeE1vZHVsZXNEaXIiLCJsb2FkTW9kdWxlRnJvbUNsYXNzIiwid3JhcHBlciIsIl90aGlzIiwibW9kdWxlTWV0aG9kcyIsInNvbWUiLCJ4IiwiX2dldEFsbFByb3BlcnR5TmFtZXMiLCJtZXRob2ROYW1lIiwibWV0aG9kIiwiRnVuY3Rpb24iLCJPeHlnZW5TdWJNb2R1bGUiLCJpbmRleE9mIiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiZ2V0TWV0aG9kU2lnbmF0dXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRPeHlnZW5FcnJvciIsIl9jb21tYW5kV3JhcHBlciIsIk94RXJyb3IiLCJjbWROYW1lIiwiY21kQXJncyIsInJldHZhbCIsImNtZEZuIiwicHVibGljTWV0aG9kIiwic3RhcnRzV2l0aCIsImRlbGF5IiwiZGVhc3luYyIsInNsZWVwIiwiZXJyb3JDb2RlIiwiTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiIsImRlY3J5cHRlZEFyZ3MiLCJfZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5IiwiX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlIiwiY21kTG9jYXRpb24iLCJfZ2V0Q29tbWFuZExvY2F0aW9uIiwiZW1pdEJlZm9yZUNvbW1hbmQiLCJfd3JhcEFzeW5jIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UiLCJyZXR2YWxQcm9taXNlIiwidGhlbiIsInByb21pc2VEb25lIiwibG9vcFdoaWxlIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlSW5pdGlhbGl6ZWQiLCJzdGVwUmVzdWx0IiwiZG9uZSIsIndhaXRJZCIsIl9nZXRTdGVwUmVzdWx0IiwiaW5kZXgiLCJzcGxpY2UiLCJlbWl0QWZ0ZXJDb21tYW5kIiwiaXNGYXRhbCIsImNvbnRpbnVlT25FcnJvciIsImxvY2F0aW9uIiwiZmFpbHVyZSIsImZuIiwic2VsZiIsIkZpYmVyIiwiY3VycmVudCIsImZpbmFsVmFsIiwiUHJvbWlzZSIsInZhbCIsImNhdGNoIiwiZnV0dXJlIiwiRnV0dXJlIiwicmV0dXJuIiwidGhyb3ciLCJ3YWl0IiwiX19zdGFjayIsImNhbGxlciIsIl9fZmlsZW5hbWUiLCJnZXRGaWxlTmFtZSIsImdldExpbmVOdW1iZXIiLCJnZXRDb2x1bW5OdW1iZXIiLCJTdGVwUmVzdWx0IiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJ0eXBlIiwiQVNTRVJUX1BBU1NFRCIsIlBBU1NFRCIsIkZBSUxFRCIsImFjdGlvbiIsIl9pc0FjdGlvbiIsIl9nZXRTdGF0cyIsInN0YXRzIiwiU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIiwiQVBQSVVNX1NFU1NJT05fVElNRU9VVCIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJfdGFrZVNjcmVlbnNob3RTaWxlbnQiLCJkaXNhYmxlU2NyZWVuc2hvdCIsInNjcmVlbnNob3QiLCJrZXkiLCJkaXNwb3NlUmVzdWx0Iiwib25Nb2R1bGVMb2FkZWQiLCJvbk1vZHVsZUluaXRpYWxpemVkIiwib25Nb2R1bGVXaWxsRGlzcG9zZSIsIl9uZXdBcmdzIiwiYXJnIiwiX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50IiwiZ2V0RGVjcnlwdFJlc3VsdCIsInBhcmFtTmFtZSIsImhhc093blByb3BlcnR5IiwicGFyYW1WYWx1ZSIsInJlcGxhY2UiLCJSZWdFeHAiLCJlbnZOYW1lIiwiZW52VmFsdWUiLCJvYmoiLCJwcm9wcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm9wIiwiZ2V0UHJvdG90eXBlT2YiLCJfY2hlY2tTdGVwUmVzdWx0IiwicmVqZWN0IiwiX3dhaXRTdGVwUmVzdWx0IiwiX2RlY3J5cHRQYXJhbWV0ZXJGb3JBcHBseUluQXJndW1lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOzs7Ozs7OztBQUdBQSxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLEVBQThCLFNBQTlCLEVBQXlDO0FBQ3JDQyxFQUFBQSxHQUFHLEVBQUUsWUFBWTtBQUNiLFFBQUlDLElBQUksR0FBR0MsS0FBSyxDQUFDQyxpQkFBakI7O0FBQ0FELElBQUFBLEtBQUssQ0FBQ0MsaUJBQU4sR0FBMEIsVUFBVUMsQ0FBVixFQUFhQyxLQUFiLEVBQW9CO0FBQUUsYUFBT0EsS0FBUDtBQUFlLEtBQS9EOztBQUNBLFFBQUlDLEdBQUcsR0FBRyxJQUFJSixLQUFKLEVBQVY7QUFDQUEsSUFBQUEsS0FBSyxDQUFDSyxpQkFBTixDQUF3QkQsR0FBeEI7QUFDQSxRQUFJRCxLQUFLLEdBQUdDLEdBQUcsQ0FBQ0QsS0FBaEI7QUFDQUgsSUFBQUEsS0FBSyxDQUFDQyxpQkFBTixHQUEwQkYsSUFBMUI7QUFDQSxXQUFPSSxLQUFQO0FBQ0g7QUFUb0MsQ0FBekM7QUFZQSxNQUFNRyxlQUFlLEdBQUcsS0FBeEI7QUFDQSxNQUFNQyxZQUFZLEdB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LEVBQUFBLGVBQWUsR0FBRztBQUNkLFdBQU8sSUFBSXJELE9BQUosQ0FBWSxDQUFDdEcsT0FBRCxFQUFVMEosTUFBVixLQUFxQjtBQUNwQyxXQUFLRCxnQkFBTCxDQUFzQnpKLE9BQXRCLEVBQStCMEosTUFBL0I7QUFDSCxLQUZNLENBQVA7QUFHSDs7QUFFRGhGLEVBQUFBLHlCQUF5QixDQUFDbEcsSUFBRCxFQUFPakIsVUFBUCxFQUFtQjtBQUN4QyxRQUFJLENBQUNpQixJQUFELElBQVMsQ0FBQ2lDLEtBQUssQ0FBQ0MsT0FBTixDQUFjbEMsSUFBZCxDQUFWLElBQWlDQSxJQUFJLENBQUNqRCxNQUFMLElBQWUsQ0FBcEQsRUFBdUQ7QUFDbkQsYUFBT2lELElBQVA7QUFDSDs7QUFDRCxVQUFNaUssUUFBUSxHQUFHLEVBQWpCOztBQUNBLFNBQUssSUFBSUMsR0FBVCxJQUFnQmxLLElBQWhCLEVBQXNCO0FBQ2xCaUssTUFBQUEsUUFBUSxDQUFDL0ksSUFBVCxDQUFjLEtBQUtrSyxtQ0FBTCxDQUF5Q2xCLEdBQXpDLEVBQThDbkwsVUFBOUMsQ0FBZDtBQUNIOztBQUNELFdBQU9rTCxRQUFQO0FBQ0g7O0FBRURtQixFQUFBQSxtQ0FBbUMsQ0FBQ2xCLEdBQUQsRUFBTW5MLFVBQU4sRUFBa0I7QUFDakQsUUFBSW1MLEdBQUcsSUFBSSxPQUFPQSxHQUFHLENBQUNFLGdCQUFYLEtBQWdDLFVBQTNDLEVBQXVEO0FBQ25ELFVBQUlyTCxVQUFVLEtBQUssS0FBbkIsRUFBMEI7QUFDdEIsZUFBTyxXQUFQO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsZUFBT21MLEdBQUcsQ0FBQ0UsZ0JBQUosRUFBUDtBQUNIO0FBQ0o7O0FBRUQsV0FBT0YsR0FBUDtBQUNIOztBQW43QjRDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXHJcbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InO1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0IGRlYXN5bmMgZnJvbSAnZGVhc3luYyc7XHJcbmltcG9ydCBGdXR1cmUgZnJvbSAnZmliZXJzL2Z1dHVyZSc7XHJcbmltcG9ydCBGaWJlciBmcm9tICdmaWJlcnMnO1xyXG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XHJcbmltcG9ydCBTdGVwUmVzdWx0IGZyb20gJy4uL21vZGVsL3N0ZXAtcmVzdWx0JztcclxuaW1wb3J0IE94eWdlbkV2ZW50cyBmcm9tICcuL094eWdlbkV2ZW50cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgKiBhcyBjb3JlVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFNUQVRVUyBmcm9tICcuLi9tb2RlbC9zdGF0dXMuanMnO1xyXG5pbXBvcnQgKiBhcyBNb2R1bGVzIGZyb20gJy4uL294X21vZHVsZXMvaW5kZXgnO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIsIHsgREVGQVVMVF9MT0dHRVJfSVNTVUVSLCBJU1NVRVJTIH0gZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmltcG9ydCB7IE94eWdlblN1Yk1vZHVsZSB9IGZyb20gJy4vT3h5Z2VuU3ViTW9kdWxlJztcclxuXHJcbi8qZ2xvYmFsIF9fc3RhY2sqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnX19zdGFjaycsIHtcclxuICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBvcmlnID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XHJcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcclxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xyXG4gICAgICAgIHZhciBzdGFjayA9IGVyci5zdGFjaztcclxuICAgICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWc7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xyXG5jb25zdCBERUZBVUxUX09QVFMgPSB7XHJcbiAgICBiYWNrdHJhY2U6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gc2hvdyBmdWxsIGJhY2t0cmFjZSBmb3IgZXJyb3JzXHJcbiAgICBjb21waWxlcjogW10sIC8vIDxzdHJpbmdbXT4gKFwiZXh0ZW5zaW9uOm1vZHVsZVwiKSByZXF1aXJlIGZpbGVzIHdpdGggdGhlIGdpdmVuIEVYVEVOU0lPTiBhZnRlciByZXF1aXJpbmcgTU9EVUxFIChyZXBlYXRhYmxlKVxyXG4gICAgZmFpbEFtYmlndW91c0RlZmluaXRpb25zOiBmYWxzZSwgLy8gPGJvb2xlYW4+IHRyZWF0IGFtYmlndW91cyBkZWZpbml0aW9ucyBhcyBlcnJvcnNcclxuICAgIGZhaWxGYXN0OiBmYWxzZSwgLy8gPGJvb2xlYW4+IGFib3J0IHRoZSBydW4gb24gZmlyc3QgZmFpbHVyZVxyXG4gICAgaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnM6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gdHJlYXQgdW5kZWZpbmVkIGRlZmluaXRpb25zIGFzIHdhcm5pbmdzXHJcbiAgICBuYW1lOiBbXSwgLy8gPFJFR0VYUFtdPiBvbmx5IGV4ZWN1dGUgdGhlIHNjZW5hcmlvcyB3aXRoIG5hbWUgbWF0Y2hpbmcgdGhlIGV4cHJlc3Npb24gKHJlcGVhdGFibGUpXHJcbiAgICBwcm9maWxlOiBbXSwgLy8gPHN0cmluZz4gKG5hbWUpIHNwZWNpZnkgdGhlIHByb2ZpbGUgdG8gdXNlXHJcbiAgICByZXF1aXJlOiBbXSwgLy8gPHN0cmluZz4gKGZpbGUvZGlyL2dsb2IpIHJlcXVpcmUgZmlsZXMgYmVmb3JlIGV4ZWN1dGluZyBmZWF0dXJlc1xyXG4gICAgb3JkZXI6ICdkZWZpbmVkJywgLy8gPHN0cmluZz4gc3dpdGNoIGJldHdlZW4gZGV0ZXJtaW5pc3RpYyAgYW5kIHJhbmRvbSBmZWF0dXJlIGV4ZWN1dGlvbi4gRWl0aGVyIFwiZGVmaW5lZFwiLCBcInJhbmRvbVwiIG9yIFwicmFuZG9tOjQyXCIgd2hlcmVhcyA0MiBpcyB0aGUgc2VlZCBmb3IgcmFuZG9taXphdGlvblxyXG4gICAgc25pcHBldFN5bnRheDogdW5kZWZpbmVkLCAvLyA8c3RyaW5nPiBzcGVjaWZ5IGEgY3VzdG9tIHNuaXBwZXQgc3ludGF4XHJcbiAgICBzbmlwcGV0czogdHJ1ZSwgLy8gPGJvb2xlYW4+IGhpZGUgc3RlcCBkZWZpbml0aW9uIHNuaXBwZXRzIGZvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICBzb3VyY2U6IHRydWUsIC8vIDxib29sZWFuPiBoaWRlIHNvdXJjZSB1cmlzXHJcbiAgICBzdHJpY3Q6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gZmFpbCBpZiB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICB0YWdFeHByZXNzaW9uOiAnJywgLy8gPHN0cmluZz4gKGV4cHJlc3Npb24pIG9ubHkgZXhlY3V0ZSB0aGUgZmVhdHVyZXMgb3Igc2NlbmFyaW9zIHdpdGggdGFncyBtYXRjaGluZyB0aGUgZXhwcmVzc2lvblxyXG4gICAgdGFnc0luVGl0bGU6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gYWRkIGN1Y3VtYmVyIHRhZ3MgdG8gZmVhdHVyZSBvciBzY2VuYXJpbyBuYW1lXHJcbiAgICB0aW1lb3V0OiBERUZBVUxUX1RJTUVPVVQgLy8gPG51bWJlcj4gdGltZW91dCBmb3Igc3RlcCBkZWZpbml0aW9ucyBpbiBtaWxsaXNlY29uZHNcclxufTtcclxuY29uc3QgTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVggPSAvXm1vZHVsZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IFNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCA9IC9ec2VydmljZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IERPX05PVF9XUkFQX01FVEhPRFMgPSBbJ2RyaXZlcicsICdnZXREcml2ZXInXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfQ1RYID0ge1xyXG4gICAgcGFyYW1zOiB7fSxcclxuICAgIHZhcnM6IHt9LFxyXG4gICAgZW52OiB7fSxcclxuICAgIGNhcHM6IHt9LFxyXG4gICAgYXR0cmlidXRlczoge30sXHJcbn07XHJcbmNvbnN0IERFRkFVTFRfUkVTVUxUX1NUT1JFID0ge1xyXG4gICAgc3RlcHM6IFtdLFxyXG4gICAgbG9nczogW10sXHJcbiAgICBhdHRhY2htZW50czogW10sXHJcbiAgICBoYXI6IG51bGwsXHJcbiAgICBhdHRyaWJ1dGVzOiB7fVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3h5Z2VuIGV4dGVuZHMgT3h5Z2VuRXZlbnRzIHtcclxuICAgIGNvbnN0cnVjdG9yICgpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVzdWx0U3RvcmUgPSB7IC4uLkRFRkFVTFRfUkVTVUxUX1NUT1JFIH07XHJcbiAgICAgICAgdGhpcy5jdHggPSB7IC4uLkRFRkFVTFRfQ1RYIH07XHJcbiAgICAgICAgdGhpcy5tb2R1bGVzID0ge307XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMucmVwbyA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm9wdHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMub3hCYXNlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLycpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoJ094eWdlbicpKTtcclxuICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMsIGN0eCA9IHt9LCByZXN1bHRzID0ge30pIHtcclxuICAgICAgICB0aGlzLm9wdHMgPSBPYmplY3QuYXNzaWduKERFRkFVTFRfT1BUUywgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5jd2QgPSB0aGlzLm9wdHMuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICAgICAgdGhpcy5jdHggPSBPYmplY3QuYXNzaWduKERFRkFVTFRfQ1RYLCBjdHggfHwge30pO1xyXG4gICAgICAgIHRoaXMuY3R4LmNhcHMgPSB7IC4uLmN0eC5jYXBzIHx8IHt9LCAuLi5jYXBzLCB9O1xyXG4gICAgICAgIHRoaXMucmVzdWx0U3RvcmUgPSBPYmplY3QuYXNzaWduKERFRkFVTFRfUkVTVUxUX1NUT1JFLCByZXN1bHRzIHx8IHt9KTtcclxuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHRoaXMuY3R4LmNhcHMgPSBjYXBzO1xyXG5cclxuICAgICAgICBpZiAoY3R4LmF0dHJpYnV0ZXMgJiYgKCFyZXN1bHRzLmF0dHJpYnV0ZXMgfHwgIU9iamVjdC5rZXlzKHJlc3VsdHMuYXR0cmlidXRlcykubGVuZ3RoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmF0dHJpYnV0ZXMgPSB7IC4uLmN0eC5hdHRyaWJ1dGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWZpbmUgJ294JyBvYmplY3QgaW4gZ2xvYmFsIEpTIHNjb3BlXHJcbiAgICAgICAgLy8gd2Ugd2lsbCB1c2UgdGhpcyBvYmplY3QgdG8gYWNjZXNzIE94eWdlbiBtb2R1bGVzIGFuZCB0ZXN0IGNvbnRleHQgZnJvbSBtb2R1bGVzIHVzZWQgaW4gdGhlIHRlc3QgKGlmIGFueSkgICAgICAgIFxyXG4gICAgICAgIHRoaXMubWFrZU94R2xvYmFsKCk7XHJcbiAgICAgICAgLy8gbG9hZCBzZXJ2aWNlc1xyXG4gICAgICAgIHRoaXMuX2xvYWRTZXJ2aWNlcygpO1xyXG4gICAgICAgIC8vIGxvYWQgbW9kdWxlc1xyXG4gICAgICAgIHRoaXMuX2xvYWRNb2R1bGVzKCk7XHJcbiAgICAgICAgLy8gaWYgb3B0aW9ucy5tYWtlTW9kdWxlc0dsb2JhbCBpcyB0cnVlIG9yIHVuZGVmaW5lZCB0aGFuIGRlZmluZSAnY3R4JyBjb250ZW50IGFuZCBlYWNoIG1vZHVsZSBpbiBnbG9iYWwgc2NvcGVcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IG9wdGlvbnMuZ2xvYmFsU2NvcGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5tYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGlzcG9zZU1vZHVsZXMoc3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRpc3Bvc2UgbW9kdWxlczogJywgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VTZXJ2aWNlcygpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlOiAnLCBlKTtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGFkanVzdFNjcmlwdExpbmUoKSB7XHJcbiAgICAgICAgY29uc3QgaXNJbkRlYnVnTW9kZSA9IG94dXRpbC5pc0luRGVidWdNb2RlKCk7XHJcbiAgICAgICAgLy8gYWRkIGV4dHJhIGxpbmUgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gZGVidWdnZXIgbW9kZSAoVjggZGVidWdnZXIgYWRkcyBhbiBleHRyYSBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaXNJbkRlYnVnTW9kZSA/IC0xIDogMDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZXh0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmN0eDtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29udGV4dChjdHgpIHtcclxuICAgICAgICB0aGlzLmN0eCA9IGN0eDtcclxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5veC5jdHggPSBjdHg7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBcInBhcmFtc1wiIGFuZCBcImVudlwiIGluIFwib3hcIiBnbG9iYWwgdmFyaWFibGVcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5wYXJhbXMgPSBjdHgucGFyYW1zIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLmVudiA9IGN0eC5lbnYgfHwge307XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuYXR0cmlidXRlcyA9IGN0eC5hdHRyaWJ1dGVzIHx8IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXBvc2l0b3J5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcG87XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHJlcG9zaXRvcnkocmVwbykge1xyXG4gICAgICAgIHRoaXMucmVwbyA9IHJlcG87XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3gucmVwbyA9IHJlcG87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXN1bHRzKCkge1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaXRzZWxmIC0gc3VtbWFyeSBvZiBkdXJhdGlvbnMgZm9yIGFsbCB0aGUgc3RlcHMgaW4gdGhpcyB0cmFuc2FjdGlvblxyXG4gICAgICAgIC8vIGFsc28gYWRqdXN0IHRyYW5zYWN0aW9uIGVuZCB0aW1lIHRvIG11Y2ggZW5kIHRpbWUgZm9yIHRoZSBsYXN0IGV4ZWN1dGVkIHN0ZXAgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24uXHJcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc1N0ZXAgb2YgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcykge1xyXG4gICAgICAgICAgICBpZiAodHJhbnNTdGVwLm5hbWUuaW5jbHVkZXMoJy50cmFuc2FjdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc05hbWUgPSB0cmFuc1N0ZXAudHJhbnNhY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gJiBpcyBub3QgdGhlIHRyYW5zYWN0aW9uIHN0ZXBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC50cmFuc2FjdGlvbiA9PT0gdHJhbnNOYW1lICYmIHN0ZXAgIT09IHRyYW5zU3RlcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gKz0gc3RlcC5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuZW5kVGltZSA+IHRyYW5zU3RlcC5lbmRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZW5kVGltZSA9IHN0ZXAuZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRyYW5zYWN0aW9uIHN0YXR1cyB0byB3YXJuaW5nIGlmIGF0IGxlYXN0IG9uZSBvZiBzdGVwcyBoYXMgd2FybmluZyBzdGF0dXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuc3RhdHVzID09PSBTVEFUVVMuV0FSTklORykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNTdGVwLnN0YXR1cyA9IFNUQVRVUy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdFN0b3JlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1vZHVsZXNDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1vZENhcHMgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgICAgIGlmIChtb2R1bGUubmFtZSAmJiBtb2R1bGUuX2dldENhcGFiaWxpdGllcyAmJiB0eXBlb2YgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhcHMgPSBtb2R1bGUuX2dldENhcGFiaWxpdGllcygpO1xyXG4gICAgICAgICAgICAgICAgLy8gc3RvcmUgb25seSBub24tZW1wdHkgY2FwcyBwZXIgbW9kdWxlIHRoYXQgaGFzIHRoaXMuY2FwcyBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGNhcHMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RDYXBzW21vZHVsZS5uYW1lXSA9IGNhcHM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1vZENhcHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRSZXN1bHRzKCkge1xyXG4gICAgICAgIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMgPSBbXTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmxvZ3MgPSBbXTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmF0dGFjaG1lbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5oYXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQmVmb3JlQ2FzZShjb250ZXh0KSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5vbkJlZm9yZUNhc2UgJiYgYXdhaXQgbW9kdWxlLm9uQmVmb3JlQ2FzZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5faXRlcmF0aW9uU3RhcnQgJiYgYXdhaXQgbW9kdWxlLl9pdGVyYXRpb25TdGFydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbkJlZm9yZUNhc2VcIiBtZXRob2Qgb2YgJHttb2R1bGVOYW1lfSBtb2R1bGUuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlckNhc2UoZXJyb3IgPSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGZvciBhdm9pZCBzdHVjayBvbiAqLmRpc3Bvc2UgY2FsbFxyXG4gICAgICAgICAgICAgICAgbW9kdWxlLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkFmdGVyQ2FzZShlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2l0ZXJhdGlvbkVuZCAmJiBhd2FpdCBtb2R1bGUuX2l0ZXJhdGlvbkVuZChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uQWZ0ZXJDYXNlXCIgbWV0aG9kIG9mICR7bW9kdWxlTmFtZX0gbW9kdWxlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1ha2VPeEdsb2JhbCgpIHtcclxuICAgICAgICBpZiAoIWdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3ggPSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGVzOiB0aGlzLm1vZHVsZXMsXHJcbiAgICAgICAgICAgICAgICBjdHg6IHRoaXMuY3R4LFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRzLFxyXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICByZXN1bHRTdG9yZTogdGhpcy5yZXN1bHRTdG9yZSxcclxuICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZTogdGhpcy5hZGRBdHRyaWJ1dGUuYmluZCh0aGlzKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLnZhcnMgPSB0aGlzLmN0eC52YXJzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwoKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlICdveCcgaXMgYWxyZWFkeSBnbG9iYWxcclxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBtb2R1bGVzIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsW21vZHVsZU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW21vZHVsZU5hbWVdID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBcImN0eFwiLCBcInBhcmFtc1wiIGFuZCBcImVudlwiIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZ2xvYmFsLnBhcmFtcyA9IGdsb2JhbC5veC5jdHgucGFyYW1zO1xyXG4gICAgICAgICAgICBnbG9iYWwuZW52ID0gZ2xvYmFsLm94LmN0eC5lbnY7XHJcbiAgICAgICAgICAgIGdsb2JhbC5jdHggPSBnbG9iYWwub3guY3R4O1xyXG4gICAgICAgICAgICBnbG9iYWwuYXR0cmlidXRlcyA9IGdsb2JhbC5veC5jdHguYXR0cmlidXRlcyB8fCB7fTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGFnZU9iamVjdEZpbGUocG9QYXRoKSB7XHJcbiAgICAgICAgaWYgKCFwb1BhdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBwbyA9IHJlcXVpcmUocG9QYXRoKTtcclxuICAgICAgICAgICAgLy8gc2V0IHBhZ2Ugb2JqZWN0IHJlcG9zaXRvcnkgYXMgdGhlIG1haW4gb25lXHJcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHBvO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSBwbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLnBvID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGUgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBfd3JhcExvZ2dlcihfbG9nZ2VyKSB7XHJcbiAgICAgICAgY29uc3QgbG9nZ2VyV3JhcCA9IHtcclxuICAgICAgICAgICAgaW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MpLFxyXG4gICAgICAgICAgICBkZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzKSxcclxuICAgICAgICAgICAgZXJyb3I6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2Vycm9yJywgYXJncyksXHJcbiAgICAgICAgICAgIHdhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzKSxcclxuICAgICAgICAgICAgdXNlckluZm86ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2luZm8nLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgICAgICB1c2VyRGVidWc6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2RlYnVnJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICAgICAgdXNlckVycm9yOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdlcnJvcicsIGFyZ3MsIElTU1VFUlMuVVNFUiksXHJcbiAgICAgICAgICAgIHVzZXJXYXJuOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICd3YXJuJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBsb2dnZXJXcmFwO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2coX2xvZ2dlciwgbGV2ZWwsIGFyZ3MsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGlmICghX2xvZ2dlcltsZXZlbF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfbG9nZ2VyW2xldmVsXS5hcHBseShfbG9nZ2VyLCBhcmdzKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG94dXRpbC5zdHJpbmdpZnkoYXJncywgMik7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAvLyBhZGQgdGhlIGxvZyBlbnRyeSB0byB0aGUgcmVzdWx0IHN0b3JlXHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5sb2dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUubG9ncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHNyYzogc3JjXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgYXJndW1lbnQsIGlmIGl0J3MgYSBtZXNzYWdlXHJcbiAgICAgICAgYXJncyA9IG1lc3NhZ2UgPyBhcmdzLnNoaWZ0KCkgOiBhcmdzO1xyXG4gICAgICAgIHRoaXMuZW1pdExvZyh0aW1lLCBsZXZlbCwgbWVzc2FnZSwgYXJncywgc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFNlcnZpY2VzKCkge1xyXG4gICAgICAgIGNvbnN0IG94U2VydmljZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3hCYXNlRGlyLCAnLi9veF9zZXJ2aWNlcycpO1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlcyA9IGdsb2Iuc3luYygnc2VydmljZS0qLmpzJywgeyBjd2Q6IG94U2VydmljZXNEaXJQYXRoIH0pO1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIHNlcnZpY2VzXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZXMuLi4nKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlRmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUZpbGVOYW1lID0gc2VydmljZUZpbGVzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZVBhdGggPSBwYXRoLmpvaW4ob3hTZXJ2aWNlc0RpclBhdGgsIHNlcnZpY2VGaWxlTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcnZpY2VGaWxlTmFtZS5tYXRjaChTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHJlc3VsdFsxXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMub3B0cy5zZXJ2aWNlcyA9IHVuZGVmaW5lZCBpbiBzaW5nbGUgZmlsZSBtb2RlXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5zZXJ2aWNlcykgJiYgIXRoaXMub3B0cy5zZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZTogJyArIHNlcnZpY2VOYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLl9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZUZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBzZXJ2aWNlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHNlcnZpY2UgXCInICsgc2VydmljZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZVBhdGgpIHtcclxuICAgICAgICBsZXQgU2VydmljZUNsYXNzID0gcmVxdWlyZShzZXJ2aWNlUGF0aCk7XHJcbiAgICAgICAgLy8gRVM2IGNsYXNzIHdpbGwgYmUgdW5kZXIgJ2RlZmF1bHQnIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKFNlcnZpY2VDbGFzcy5kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIFNlcnZpY2VDbGFzcyA9IFNlcnZpY2VDbGFzcy5kZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZXJ2aWNlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYFNlcnZpY2U6JHtzZXJ2aWNlTmFtZX1gKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2xhc3ModGhpcy5vcHRzLCB0aGlzLmN0eCwgdGhpcy5yZXN1bHRTdG9yZSwgc2VydmljZUxvZ2dlcik7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRNb2R1bGVzKCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIGludGVybmFsIG1vZHVsZXMuLi4nKTtcclxuICAgICAgICB0aGlzLl9sb2FkSW50ZXJuYWxNb2R1bGVzKCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZXh0ZXJuYWwgbW9kdWxlcy4uLicpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRFeHRlcm5hbE1vZHVsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEV4dGVybmFsTW9kdWxlcygpIHtcclxuICAgICAgICBsZXQgbW9kdWxlc0ZvbGRlclBhdGggPSAnLi9tb2R1bGVzJztcclxuICAgICAgICBpZiAodGhpcy5vcHRzLm1vZHVsZXNfZXh0ICYmIHR5cGVvZiB0aGlzLm9wdHMubW9kdWxlc19leHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXNGb2xkZXJQYXRoID0gdGhpcy5vcHRzLm1vZHVsZXNfZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL2NvbnN0IG94TW9kdWxlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X21vZHVsZXMnKTtcclxuICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY3dkLCBtb2R1bGVzRm9sZGVyUGF0aCk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG94TW9kdWxlc0RpclBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1vZHVsZUZpbGVzID0gW107XHJcbiAgICAgICAgLy8gaWYgcGFydGljdWxhciBtb2R1bGUgbmFtZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZywgdGhlbiBsb2FkIG9ubHkgdGhlc2UgbW9kdWxlc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5tb2R1bGVzKSAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tb2R1bGVzLmZvckVhY2gobW9kdWxlTmFtZSA9PiBtb2R1bGVGaWxlcy5wdXNoKGBtb2R1bGUtJHttb2R1bGVOYW1lfS5qc2ApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIGFsbCBhdmFpbGFibGUgbW9kdWxlcyAobWlnaHQgYmUgbW9yZSB0aW1lIGNvbnN1bWluZylcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbW9kdWxlRmlsZXMgPSBnbG9iLnN5bmMoJ21vZHVsZS0qLmpzJywgeyBjd2Q6IG94TW9kdWxlc0RpclBhdGggfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIG1vZHVsZXMgICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZUZpbGVOYW1lIG9mIG1vZHVsZUZpbGVzKSB7XHJcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHRoZSBtb2R1bGUgZmlsZSBuYW1lIGJhc2VkIG9uIG1vZHVsZSBuYW1lIHBhdHRlcm5cclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZHVsZUZpbGVOYW1lLm1hdGNoKE1PRFVMRV9OQU1FX01BVENIX1JFR0VYKVsxXTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBsb2dnZXIgZm9yIHRoZSBtb2R1bGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZUxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKGBNb2R1bGU6JHttb2R1bGVOYW1lfWApKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IG1vZHVsZSBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kID0gY29yZVV0aWxzLmxvYWRNb2R1bGVGcm9tRmlsZShtb2R1bGVOYW1lLCBtb2R1bGVGaWxlTmFtZSwgbW9kdWxlTG9nZ2VyLCBveE1vZHVsZXNEaXJQYXRoLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGwgb25Nb2R1bGVMb2FkZWQgaG9va1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQobW9kKTtcclxuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9kdWxlIHRvIHRoZSBtb2R1bGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdID0gZ2xvYmFsLm94Lm1vZHVsZXNbbW9kdWxlTmFtZV0gPSB0aGlzLl93cmFwTW9kdWxlKG1vZHVsZU5hbWUsIG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyB3cmFwIHVwXHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKGVuZFRpbWUgLSBzdGFydFRpbWUpIC8gMTAwMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIG1vZHVsZTogJyArIG1vZHVsZU5hbWUgKyAnIFsgJyArIGR1cmF0aW9uICsgJyBzZWMgXScpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIG1vZHVsZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiOiAnICsgZS5tZXNzYWdlICsgRU9MICsgKGUuc3RhY2t0cmFjZSA/IGUuc3RhY2t0cmFjZSA6ICcnKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IG1vZHVsZSB0aGF0IGZhaWxlZCB0byBsb2FkLCBleGNlcHQgV2ViIGFuZCBNb2IgbW9kdWxlc1xyXG4gICAgICAgICAgICAgICAgLy8gd2l0aG91dCBNb2IgYW5kIFdlYiBtb2R1bGVzIGxvYWRlZCwgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc2hhbGwgZmFpbFxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT09ICd3ZWInIHx8IG1vZHVsZU5hbWUgPT09ICdtb2InKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRJbnRlcm5hbE1vZHVsZXMoKSB7XHJcbiAgICAgICAgLy8gaWYgYG1vZHVsZXNgIGlzIGVtcHR5IG9yIHVuZGVmaW5lZCBpbiBveHlnZW4uY29uZiB0aGVuIGxvYWQgYWxsIG1vZHVsZXNcclxuICAgICAgICAvLyBvdGhlcndpc2UsIGxvYWQgb25seSB0aG9zZSBpbXBsaWNpdGx5IGRlZmluZWRcclxuICAgICAgICBjb25zdCBleGNsdWRlVW5kZWZpbmVkTW9kcyA9IHRoaXMub3B0cy5tb2R1bGVzICYmIHRoaXMub3B0cy5tb2R1bGVzLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZU5hbWUgb2YgT2JqZWN0LmtleXMoTW9kdWxlcykpIHtcclxuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVVbmRlZmluZWRNb2RzICYmICF0aGlzLm9wdHMubW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgTW9kdWxlQ2xhc3MgPSBNb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gb3h1dGlsLmdldE94TW9kdWxlc0RpcigpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IGxvZ2dlciBmb3IgdGhlIG1vZHVsZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYE1vZHVsZToke21vZHVsZU5hbWV9YCkpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbW9kdWxlIGluc3RhbmNlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2QgPSBjb3JlVXRpbHMubG9hZE1vZHVsZUZyb21DbGFzcyhtb2R1bGVOYW1lLCBNb2R1bGVDbGFzcywgbW9kdWxlTG9nZ2VyLCBveE1vZHVsZXNEaXJQYXRoLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGwgb25Nb2R1bGVMb2FkZWQgaG9va1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQobW9kKTtcclxuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9kdWxlIHRvIHRoZSBtb2R1bGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdID0gZ2xvYmFsLm94Lm1vZHVsZXNbbW9kdWxlTmFtZV0gPSB0aGlzLl93cmFwTW9kdWxlKG1vZHVsZU5hbWUsIG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyB3cmFwIHVwXHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKGVuZFRpbWUgLSBzdGFydFRpbWUpIC8gMTAwMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIG1vZHVsZTogJyArIG1vZHVsZU5hbWUgKyAnIFsgJyArIGR1cmF0aW9uICsgJyBzZWMgXScpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIG1vZHVsZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiOiAnICsgZS5tZXNzYWdlICsgRU9MICsgKGUuc3RhY2t0cmFjZSA/IGUuc3RhY2t0cmFjZSA6ICcnKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IG1vZHVsZSB0aGF0IGZhaWxlZCB0byBsb2FkLCBleGNlcHQgV2ViIGFuZCBNb2IgbW9kdWxlc1xyXG4gICAgICAgICAgICAgICAgLy8gd2l0aG91dCBNb2IgYW5kIFdlYiBtb2R1bGVzIGxvYWRlZCwgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc2hhbGwgZmFpbFxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT09ICd3ZWInIHx8IG1vZHVsZU5hbWUgPT09ICdtb2InKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3dyYXBNb2R1bGUobmFtZSwgbW9kdWxlKSB7XHJcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHtcclxuICAgICAgICAgICAgbmFtZTogbmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBtb2R1bGVNZXRob2RzID0gT2JqZWN0LmtleXMobW9kdWxlKTtcclxuICAgICAgICBpZiAoIW1vZHVsZU1ldGhvZHMuc29tZSh4ID0+IHg9PT0gJ2V4cG9ydHMnKSkge1xyXG4gICAgICAgICAgICBtb2R1bGVNZXRob2RzID0gdGhpcy5fZ2V0QWxsUHJvcGVydHlOYW1lcyhtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBtZXRob2ROYW1lIG9mIG1vZHVsZU1ldGhvZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gbW9kdWxlW21ldGhvZE5hbWVdO1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgYW55IG1vZHVsZSBwcm9wZXJ0eSB0aGF0IGlzIG5vdCBhIGZ1bmN0aW9uIG9yIGEgT3h5Z2VuU3ViTW9kdWxlXHJcbiAgICAgICAgICAgIGlmICgoIShtZXRob2QgaW5zdGFuY2VvZiBGdW5jdGlvbikgJiYgIShtZXRob2QgaW5zdGFuY2VvZiBPeHlnZW5TdWJNb2R1bGUpICYmIHR5cGVvZiBtZXRob2QgIT09ICdmdW5jdGlvbicpIHx8IG1ldGhvZE5hbWUgPT09ICdleHBvcnRzJyB8fCBtZXRob2ROYW1lID09PSAnX2NvbXBpbGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBtYXAgYW5kIHdyYXAgc3ViLW1vZHVsZSBtZXRob2RzIChyZWN1cnNpdmUgY2FsbCB0byBfd3JhcE1vZHVsZSlcclxuICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE94eWdlblN1Yk1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9IHRoaXMuX3dyYXBNb2R1bGUoYCR7bmFtZX0uJHttZXRob2ROYW1lfWAsIG1ldGhvZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZG8gbm90IHdyYXAgbWV0aG9kc1xyXG4gICAgICAgICAgICBlbHNlIGlmIChET19OT1RfV1JBUF9NRVRIT0RTLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyA9PT0gJ2RyaXZlcicgfHwgbWV0aG9kTmFtZSA9PT0gJ2dldERyaXZlcidcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSBtb2R1bGVbbWV0aG9kTmFtZV0uYmluZChtb2R1bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHByaXZhdGUgbWV0aG9kcyBhbmQgZXZlbnQgaGFuZGxlcnNcclxuICAgICAgICAgICAgZWxzZSBpZiAobWV0aG9kTmFtZS5pbmRleE9mKCdfJykgPT09IDAgfHwgbWV0aG9kTmFtZS5pbmRleE9mKCdvbicpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5sb2dnZXIuZGVidWcoJ0V4ZWN1dGluZzogJyArIG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobmFtZSwgbWV0aG9kTmFtZSwgYXJncykpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlW21ldGhvZE5hbWVdLmFwcGx5KG1vZHVsZSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBuYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIGludGVybmFsIF9nZXRDYXBhYmlsaXRpZXMgbWV0aG9kIGZvciBpbnRlcm5hbCBPeHlnZW4gQ29yZSB1c2VcclxuICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgX2dldENhcGFiaWxpdGllcyBtZXRob2Qgd29uJ3QgYmUgdmlzaWJsZSBpbiB0aGUgdGVzdCByZXN1bHRzXHJcbiAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmFtZSA9PT0gJ2dldENhcGFiaWxpdGllcycpIHtcclxuICAgICAgICAgICAgICAgICAgICB3cmFwcGVyWydfZ2V0Q2FwYWJpbGl0aWVzJ10gPSBtZXRob2QuYmluZChtb2R1bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9ICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9jb21tYW5kV3JhcHBlcihtZXRob2ROYW1lLCBhcmdzLCBtb2R1bGUsIG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE94RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ1Rocm93aW5nIGFnYWluOicsIGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9ySGVscGVyLmdldE94eWdlbkVycm9yKGUsIG5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XHJcbiAgICB9XHJcblxyXG4gICAgX2NvbW1hbmRXcmFwcGVyKGNtZE5hbWUsIGNtZEFyZ3MsIG1vZHVsZSwgbW9kdWxlTmFtZSkge1xyXG4gICAgICAgIGlmICghbW9kdWxlIHx8ICFtb2R1bGVbY21kTmFtZV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXR2YWwgPSBudWxsO1xyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgY21kRm4gPSBtb2R1bGVbY21kTmFtZV07XHJcbiAgICAgICAgY29uc3QgcHVibGljTWV0aG9kID0gIWNtZE5hbWUuc3RhcnRzV2l0aCgnXycpICYmIGNtZE5hbWUgIT09ICdkaXNwb3NlJztcclxuXHJcbiAgICAgICAgLy8gZGVsYXkgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIGlmIHJlcXVpcmVkXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZGVsYXkgJiZcclxuICAgICAgICAgICAgcHVibGljTWV0aG9kICYmXHJcbiAgICAgICAgICAgIGNtZE5hbWUgIT09ICdpbml0JyAmJlxyXG4gICAgICAgICAgICBjbWROYW1lICE9PSAndHJhbnNhY3Rpb24nXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGRlYXN5bmMuc2xlZXAodGhpcy5vcHRzLmRlbGF5ICogMTAwMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0aHJvdyBpZiBhIGNvbW1hbmQgZXhlY3V0ZWQgb24gdW5pdGlhbGl6ZWQgbW9kdWxlIChleGNlcHQgaW50ZXJuYWwgbWV0aG9kcyBhbmQgYSBmZXcgb3RoZXIpXHJcbiAgICAgICAgaWYgKCFtb2R1bGUuaXNJbml0aWFsaXplZCAmJiBwdWJsaWNNZXRob2QgJiYgY21kTmFtZSAhPT0gJ2luaXQnICYmIGNtZE5hbWUgIT09ICd0cmFuc2FjdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdNaXNzaW5nICcgKyBtb2R1bGVOYW1lICsgJy5pbml0KCknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRlY3R5cHQgYXJndW1lbnRzXHJcbiAgICAgICAgbGV0IGRlY3J5cHRlZEFyZ3MgPSB0aGlzLl9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkoY21kQXJncywgbW9kdWxlTmFtZSk7XHJcbiAgICAgICAgZGVjcnlwdGVkQXJncyA9IHRoaXMuX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlKGRlY3J5cHRlZEFyZ3MpO1xyXG5cclxuICAgICAgICAvLyByZXBsYWNlIHBhcmFtZXRlcnMgaW4gbWV0aG9kIGFyZ3VtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzXHJcbiAgICAgICAgY21kQXJncyA9IHRoaXMuX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlKGNtZEFyZ3MpO1xyXG4gICAgICAgIC8vIHN0YXJ0IG1lYXN1cmluZyBtZXRob2QgZXhlY3V0aW9uIHRpbWVcclxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBjb21tYW5kIGxvY2F0aW9uIGluZm9ybWF0aW9uIChlLmcuIGZpbGUgbmFtZSBhbmQgY29tbWFuZCBsaW5lKVxyXG4gICAgICAgIGxldCBjbWRMb2NhdGlvbiA9IG51bGw7XHJcbiAgICAgICAgLy8gZG8gbm90IHJlcG9ydCByZXN1bHRzIG9yIGxpbmUgdXBkYXRlcyBvbiBpbnRlcm5hbCBtZXRob2RzIChzdGFydGVkIHdpdGggJ18nKVxyXG4gICAgICAgIGlmIChwdWJsaWNNZXRob2QpIHtcclxuICAgICAgICAgICAgY21kTG9jYXRpb24gPSB0aGlzLl9nZXRDb21tYW5kTG9jYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmVmb3JlQ29tbWFuZChjbWROYW1lLCBtb2R1bGVOYW1lLCBjbWRGbiwgY21kQXJncywgdGhpcy5jdHgsIGNtZExvY2F0aW9uLCBzdGFydFRpbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0V4ZWN1dGluZzogJyArIG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncykpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBlbWl0IGJlZm9yZSBldmVudHNcclxuICAgICAgICAgICAgaWYgKGNtZE5hbWUgPT09ICdkaXNwb3NlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd3JhcEFzeW5jKHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UpLmFwcGx5KHRoaXMsIFttb2R1bGVdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmV0dmFsUHJvbWlzZSA9IHRoaXMuX3dyYXBBc3luYyhtb2R1bGVbY21kTmFtZV0pLmFwcGx5KG1vZHVsZSwgZGVjcnlwdGVkQXJncyk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV0dmFsUHJvbWlzZSAmJiByZXR2YWxQcm9taXNlLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlRG9uZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHZhbFByb21pc2UudGhlbigodmFsdWUpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZURvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZURvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIXByb21pc2VEb25lKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbFByb21pc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjbWROYW1lID09PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dyYXBBc3luYyh0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkKS5hcHBseSh0aGlzLCBbbW9kdWxlXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSAmJiBlLm1lc3NhZ2UgJiYgdHlwZW9mIGUubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkIHNlc3Npb24gaWQnKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGlmIGVycm9yIG9jdXJyZWQgYWZ0ZXIgdGhlIG1vZHVsZSB3YXMgZGlzcG9zZWQgKG9yIGluIGEgcHJvY2VzcyBvZiBiZWluZyBkaXNwb3NlZClcclxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBmb3IgaW5pdCBtZXRob2RzIG9mIGNvdXJzZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgbW9kdWxlLmlzSW5pdGlhbGl6ZWQgPT09ICdib29sZWFuJyAmJiAhbW9kdWxlLmlzSW5pdGlhbGl6ZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgY21kTmFtZSAhPT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnPT09PSBlcnJvciA9PT09JywgZSlcclxuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcblxyXG4gICAgICAgIGxldCBzdGVwUmVzdWx0O1xyXG4gICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChwdWJsaWNNZXRob2QpIHtcclxuICAgICAgICAgICAgY29uc3Qgd2FpdElkID0gK25ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5wdXNoKHdhaXRJZCk7XHJcblxyXG4gICAgICAgICAgICBzdGVwUmVzdWx0ID0gdGhpcy5fZ2V0U3RlcFJlc3VsdChtb2R1bGUsIG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MsIGNtZExvY2F0aW9uLCBzdGFydFRpbWUsIGVuZFRpbWUsIHJldHZhbCwgZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QuaW5kZXhPZih3YWl0SWQpO1xyXG4gICAgICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICAgIC8vc3RlcFJlc3VsdC5sb2NhdGlvbiA9IGNtZExvY2F0aW9uO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcy5wdXNoKHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRBZnRlckNvbW1hbmQoY21kTmFtZSwgbW9kdWxlTmFtZSwgY21kRm4sIGNtZEFyZ3MsIHRoaXMuY3R4LCBjbWRMb2NhdGlvbiwgZW5kVGltZSwgc3RlcFJlc3VsdCk7XHJcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmlzRmF0YWwgJiYgIXRoaXMub3B0cy5jb250aW51ZU9uRXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKCFlcnJvci5sb2NhdGlvbiAmJiBjbWRMb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZXJyb3IubG9jYXRpb24gPSBjbWRMb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQgJiYgc3RlcFJlc3VsdC5mYWlsdXJlICYmIHN0ZXBSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZXJyb3IubG9jYXRpb24gPSBzdGVwUmVzdWx0LmZhaWx1cmUubG9jYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwdWJsaWNNZXRob2QpIHtcclxuICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhZG9uZSAmJiAhZXJyb3IpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgfVxyXG5cclxuICAgIF93cmFwQXN5bmMgKGZuLCBjb250ZXh0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gY29udGV4dCB8fCB0aGlzO1xyXG4gICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBjb2RlIGlzIG5vdCBydW5uaW5nIGluc2lkZSB0aGUgRmliZXIgY29udGV4dCwgdGhlbiBydW4gYXN5bmMgY29kZSBhcyBzeW5jIHVzaW5nIGRlYXN5bmMgbW9kdWxlXHJcbiAgICAgICAgICAgIGlmICghRmliZXIuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dmFsID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxWYWwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgJiYgcmV0dmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmV0dmFsKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxWYWwgPSB2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsID0gcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUubWVzc2FnZSAmJiB0eXBlb2YgZS5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ3JlYWR5U3RhdGUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgZXJyb3IgYXMgaXQgdXN1YWxseSBoYXBwZW5zIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gT3h5Z2VuIGlzIGRpc3Bvc2VkIGFuZCBwcm9jZXNzIGlzIGJlaW5nIGtpbGxlZFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdkZWFzeW5jLmxvb3BXaGlsZSgpIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxWYWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHJldHZhbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaWYgd2UgYXJlIGluc2lkZSB0aGUgRmliZXIgY29udGV4dCwgdGhlbiB1c2UgRmliZXIncyBGdXR1cmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZ1dHVyZSA9IG5ldyBGdXR1cmUoKTtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbCkgPT4gZnV0dXJlLnJldHVybih2YWwpLCAoZXJyKSA9PiBmdXR1cmUudGhyb3coZXJyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1dHVyZS53YWl0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhZG9uZSAmJiAhZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJldHJpZXZlIGN1cnJlbnQgbGluZSBhbmQgZnVuY3Rpb24gbmFtZSBmcm9tIHRoZSBjYWxsIHN0YWNrXHJcbiAgICBfZ2V0Q29tbWFuZExvY2F0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHN0YWNrID0gX19zdGFjaztcclxuICAgICAgICBsZXQgY2FsbGVyID0gbnVsbDtcclxuICAgICAgICBmb3IgKGxldCBjYWxsIG9mIHN0YWNrKSB7XHJcbiAgICAgICAgICAgIGlmIChfX2ZpbGVuYW1lID09PSBjYWxsLmdldEZpbGVOYW1lKCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgY2FsbGVyLCB3aGljaCBpcyBub3QgdGhlIGN1cnJlbnQgZmlsZVxyXG4gICAgICAgICAgICBjYWxsZXIgPSBjYWxsO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhbGxlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7Y2FsbGVyLmdldEZpbGVOYW1lKCl9OiR7Y2FsbGVyLmdldExpbmVOdW1iZXIoKSArIHRoaXMuYWRqdXN0U2NyaXB0TGluZX06JHtjYWxsZXIuZ2V0Q29sdW1uTnVtYmVyKCl9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFN0ZXBSZXN1bHQobW9kdWxlLCBtb2R1bGVOYW1lLCBtZXRob2ROYW1lLCBhcmdzLCBsb2NhdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCByZXR2YWwsIGVycikge1xyXG4gICAgICAgIHZhciBzdGVwID0gbmV3IFN0ZXBSZXN1bHQoKTtcclxuXHJcbiAgICAgICAgc3RlcC5uYW1lID0gb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShtb2R1bGVOYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICAgICAgICBzdGVwLnRyYW5zYWN0aW9uID0gZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lIHx8IG51bGw7ICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3aHkgaXMgdGhpcyBoZXJlIGlmIGl0J3MgYWxyZWFkeSBwb3B1bGF0ZWQgaW4gcnM/XHJcbiAgICAgICAgc3RlcC5sb2NhdGlvbiA9IGxvY2F0aW9uO1xyXG5cclxuICAgICAgICBpZiAoZXJyICYmIGVyci50eXBlICYmIGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX1BBU1NFRCkge1xyXG4gICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5QQVNTRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgc3RlcCBzdGF0dXNcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5pc0ZhdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuV0FSTklORztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtb2R1bGVOYW1lID09PSAnbG9nJyAmJiBtZXRob2ROYW1lID09PSAnd2FybicpIHtcclxuICAgICAgICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU1RBVFVTLldBUk5JTkc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5QQVNTRUQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0ZXAuYWN0aW9uID0gKHR5cGVvZiBtb2R1bGUuX2lzQWN0aW9uID09PSAnZnVuY3Rpb24nID8gbW9kdWxlLl9pc0FjdGlvbihtZXRob2ROYW1lKSA6IGZhbHNlKTtcclxuICAgICAgICBzdGVwLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTtcclxuICAgICAgICBzdGVwLmVuZFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgIHN0ZXAuZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZS5fZ2V0U3RhdHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgc3RlcC5zdGF0cyA9IG1vZHVsZS5fZ2V0U3RhdHMobWV0aG9kTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3RlcC5zdGF0cyA9IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICBpZiAoZXJyICYmIGVyci50eXBlICYmIGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX1BBU1NFRCkge1xyXG4gICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgZXJyLnR5cGUgJiYgKGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIHx8IGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVBQSVVNX1NFU1NJT05fVElNRU9VVCkpIHtcclxuICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGVwLmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICBzdGVwLmZhaWx1cmUubG9jYXRpb24gPSBsb2NhdGlvbjtcclxuICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgbW9kdWxlIGRlY2lkZSB3aGV0aGVyIGEgc2NyZWVuc2hvdCBzaG91bGQgYmUgdGFrZW4gb24gZXJyb3Igb3Igbm90XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50ID09PSAnZnVuY3Rpb24nICYmICF0aGlzLm9wdHMuZGlzYWJsZVNjcmVlbnNob3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnNjcmVlbnNob3QgPSBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50KG1ldGhvZE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgd2Ugd2VyZSB1bmFibGUgdG8gZ2V0IGEgc2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gd2FpdCBmb3IgYSBtb21lbnQgKGluIFBlcmZlY3RvIENsb3VkLCB0aGUgc2NyZWVuc2hvdCBtaWdodCBub3QgYmUgaW1taWRpYXRlbHkgYXZhaWxhYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWFzeW5jLnNsZWVwKDEwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zY3JlZW5zaG90ID0gbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudChtZXRob2ROYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGluZGljYXRlIHRvIHVzZXIgdGhhdCBhbiBhdHRlbXB0IHRvIHRha2UgYSBzY3JlZW5zaG90IGhhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RlcDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZGlzcG9zZVNlcnZpY2VzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZXJ2aWNlcyB8fCB0eXBlb2YgdGhpcy5zZXJ2aWNlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2VydmljZS5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZpY2UuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgc2VydmljZSBkaXNwb3NhbCBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGlzcG9zZSBzZXJ2aWNlICcke2tleX0nOmAsIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9kaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZHVsZXMgfHwgdHlwZW9mIHRoaXMubW9kdWxlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZCA9IHRoaXMubW9kdWxlc1trZXldO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1vZC5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3Bvc2VSZXN1bHQgPSBtb2QuZGlzcG9zZShzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNwb3NlUmVzdWx0ICYmIHR5cGVvZiBkaXNwb3NlUmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgYSBwcm9taXNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc3Bvc2VSZXN1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBtb2R1bGUgZGlzcG9zYWwgZXJyb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZSAnJHtrZXl9JzogYCwgZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvKlxyXG4gICAgICogU2VydmljZXMgRXZlbnQgRW1pdHRlcnNcclxuICAgICAqL1xyXG4gICAgX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZHVsZSkge1xyXG4gICAgICAgIGZvciAobGV0IHNlcnZpY2VOYW1lIGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uTW9kdWxlTG9hZGVkKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uTW9kdWxlTG9hZGVkXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBfY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZChtb2R1bGUpIHtcclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2VydmljZS5vbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uTW9kdWxlSW5pdGlhbGl6ZWRcIiBtZXRob2Qgb2YgJHtzZXJ2aWNlTmFtZX0gc2VydmljZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9jYWxsU2VydmljZXNPbk1vZHVsZVdpbGxEaXNwb3NlKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IHNlcnZpY2VOYW1lIGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5vbk1vZHVsZVdpbGxEaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbk1vZHVsZVdpbGxEaXNwb3NlKG1vZHVsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uTW9kdWxlV2lsbERpc3Bvc2VcIiBtZXRob2Qgb2YgJHtzZXJ2aWNlTmFtZX0gc2VydmljZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShhcmdzKSB7XHJcbiAgICAgICAgaWYgKCFhcmdzIHx8ICFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IF9uZXdBcmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICAgICAgX25ld0FyZ3MucHVzaCh0aGlzLl9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudChhcmcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9uZXdBcmdzO1xyXG4gICAgfVxyXG4gICAgX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50KGFyZykge1xyXG4gICAgICAgIGlmIChhcmcgJiYgdHlwZW9mIGFyZy5nZXREZWNyeXB0UmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnRU5DUllQVEVEJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYXJnIHx8IHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlcGxhY2UgdXNlciBwYXJhbWV0ZXJzIHdpdGggdmFsdWVzXHJcbiAgICAgICAgLy8gbm90ZTogdXNlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBlbnZpcm9ubWVudCB2YXJpYWJsZVxyXG4gICAgICAgIGZvciAobGV0IHBhcmFtTmFtZSBpbiB0aGlzLmN0eC5wYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3R4LnBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbVZhbHVlID0gdGhpcy5jdHgucGFyYW1zW3BhcmFtTmFtZV07XHJcbiAgICAgICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJHsnICsgcGFyYW1OYW1lICsgJ30nLCAnZycpLCBwYXJhbVZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZXBsYWNlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoIHZhbHVlc1xyXG4gICAgICAgIGZvciAobGV0IGVudk5hbWUgaW4gdGhpcy5jdHguZW52KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eC5lbnYuaGFzT3duUHJvcGVydHkoZW52TmFtZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVudlZhbHVlID0gdGhpcy5jdHguZW52W2Vudk5hbWVdO1xyXG4gICAgICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCR7JyArIGVudk5hbWUgKyAnfScsICdnJyksIGVudlZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgfVxyXG4gICAgX2dldEFsbFByb3BlcnR5TmFtZXMoIG9iaiApIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IFtdO1xyXG5cclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKCBvYmogKS5mb3JFYWNoKGZ1bmN0aW9uICggcHJvcCApIHtcclxuICAgICAgICAgICAgICAgIGlmICggcHJvcHMuaW5kZXhPZiggcHJvcCApID09PSAtMSApIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKCBwcm9wICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cclxuICAgICAgICB9IHdoaWxlICggb2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKCBvYmogKSApO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9XHJcblxyXG4gICAgX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBpZiAodGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF93YWl0U3RlcFJlc3VsdCgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1N0ZXBSZXN1bHQocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5KGFyZ3MsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoIWFyZ3MgfHwgIUFycmF5LmlzQXJyYXkoYXJncykgfHwgYXJncy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJncztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgX25ld0FyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xyXG4gICAgICAgICAgICBfbmV3QXJncy5wdXNoKHRoaXMuX2RlY3J5cHRQYXJhbWV0ZXJGb3JBcHBseUluQXJndW1lbnQoYXJnLCBtb2R1bGVOYW1lKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfbmV3QXJncztcclxuICAgIH1cclxuXHJcbiAgICBfZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudChhcmcsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnRU5DUllQVEVEJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==