@microsoft/ocsdk 0.3.0 → 0.3.1-main.6d3947f

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/lib/SDK.js CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof3 = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
@@ -47,6 +49,14 @@ var _axiosRetry = _interopRequireDefault(require("./Utils/axiosRetry"));
47
49
 
48
50
  var _uuid = require("./Utils/uuid");
49
51
 
52
+ var hash = _interopRequireWildcard(require("crypto"));
53
+
54
+ var _CustomContextData = require("./Utils/CustomContextData");
55
+
56
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
57
+
58
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
59
+
50
60
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
51
61
 
52
62
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -801,9 +811,9 @@ var SDK = /*#__PURE__*/function () {
801
811
  */
802
812
 
803
813
  }, {
804
- key: "getQueueAvailability",
814
+ key: "getAgentAvailability",
805
815
  value: function () {
806
- var _getQueueAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(requestId) {
816
+ var _getAgentAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(requestId) {
807
817
  var _this5 = this;
808
818
 
809
819
  var queueAvailabilityOptionalParams,
@@ -815,6 +825,8 @@ var SDK = /*#__PURE__*/function () {
815
825
  getContext,
816
826
  headers,
817
827
  data,
828
+ cachObj,
829
+ tempArr,
818
830
  options,
819
831
  _args11 = arguments;
820
832
  return _regenerator["default"].wrap(function _callee11$(_context11) {
@@ -825,12 +837,12 @@ var SDK = /*#__PURE__*/function () {
825
837
  timer = _Timer.Timer.TIMER();
826
838
 
827
839
  if (this.logger) {
828
- this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETQUEUEAVAILABILITYSTARTED, {
840
+ this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSTARTED, {
829
841
  RequestId: requestId
830
- }, "Get queue availability started");
842
+ }, "Get agent availability started");
831
843
  }
832
844
 
833
- endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].GetQueueAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
845
+ endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].GetAgentAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
834
846
  axiosInstance = _axios["default"].create();
835
847
  (0, _axiosRetry["default"])(axiosInstance, {
836
848
  retries: this.configuration.maxRequestRetriesOnFailure
@@ -843,15 +855,34 @@ var SDK = /*#__PURE__*/function () {
843
855
  }
844
856
 
845
857
  data = initContext || {};
858
+ cachObj = {
859
+ "orgId": this.omnichannelConfiguration.orgId,
860
+ "widgetId": this.omnichannelConfiguration.widgetId
861
+ };
862
+
863
+ if (data && data.customContextData) {
864
+ tempArr = _CustomContextData.CustomContextData.sort(data.customContextData);
865
+ Object.assign(cachObj, {
866
+ "customContext": tempArr
867
+ });
868
+ }
869
+
870
+ if (data.portalcontactid) {
871
+ Object.assign(cachObj, {
872
+ "portalcontactid": data.portalcontactid
873
+ });
874
+ }
875
+
876
+ data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
846
877
 
847
878
  if (!(getContext && !window.document)) {
848
- _context11.next = 12;
879
+ _context11.next = 16;
849
880
  break;
850
881
  }
851
882
 
852
883
  return _context11.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
853
884
 
854
- case 12:
885
+ case 16:
855
886
  if (getContext) {
856
887
  data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
857
888
  data.device = _DeviceInfo.DeviceInfo.getDeviceType();
@@ -865,13 +896,13 @@ var SDK = /*#__PURE__*/function () {
865
896
 
866
897
 
867
898
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
868
- _context11.next = 16;
899
+ _context11.next = 20;
869
900
  break;
870
901
  }
871
902
 
872
903
  return _context11.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
873
904
 
874
- case 16:
905
+ case 20:
875
906
  options = {
876
907
  data: data,
877
908
  headers: headers,
@@ -897,12 +928,12 @@ var SDK = /*#__PURE__*/function () {
897
928
 
898
929
  if (_data) {
899
930
  if (_this5.logger) {
900
- _this5.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETQUEUEAVAILABILITYSUCCEEDED, {
931
+ _this5.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, {
901
932
  RequestId: requestId,
902
933
  Region: response.data.Region,
903
934
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
904
935
  TransactionId: response.headers["transaction-id"]
905
- }, "Get queue availability Succeeded");
936
+ }, "Get agent availability Succeeded");
906
937
  }
907
938
 
908
939
  resolve(_data);
@@ -925,11 +956,11 @@ var SDK = /*#__PURE__*/function () {
925
956
  return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context10.t0);
926
957
 
927
958
  case 15:
928
- _this5.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETQUEUEAVAILABILITYFAILED, {
959
+ _this5.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, {
929
960
  RequestId: requestId,
930
961
  ExceptionDetails: _context10.t0,
931
962
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds5
932
- }, "Get queue availability failed");
963
+ }, "Get agent availability failed");
933
964
 
934
965
  case 16:
935
966
  reject(_context10.t0);
@@ -947,7 +978,7 @@ var SDK = /*#__PURE__*/function () {
947
978
  };
948
979
  }()));
949
980
 
950
- case 18:
981
+ case 22:
951
982
  case "end":
952
983
  return _context11.stop();
953
984
  }
@@ -955,11 +986,11 @@ var SDK = /*#__PURE__*/function () {
955
986
  }, _callee11, this);
956
987
  }));
957
988
 
958
- function getQueueAvailability(_x14) {
959
- return _getQueueAvailability.apply(this, arguments);
989
+ function getAgentAvailability(_x14) {
990
+ return _getAgentAvailability.apply(this, arguments);
960
991
  }
961
992
 
962
- return getQueueAvailability;
993
+ return getAgentAvailability;
963
994
  }()
964
995
  /**
965
996
  * Starts a session to omnichannel.
@@ -2322,4 +2353,4 @@ exports["default"] = SDK;
2322
2353
  getChatTokenTimeBetweenRetriesOnFailure: 10000,
2323
2354
  maxRequestRetriesOnFailure: 3
2324
2355
  });
2325
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUUVVFVUVBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0UXVldWVBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0Iiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJHRVRRVUVVRUFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVFFVRVVFQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwiRXJyb3JDb2RlIiwidG9TdHJpbmciLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJKU09OIiwic3RyaW5naWZ5IiwiU1VCTUlUUE9TVENIQVRTVUNDRUVERUQiLCJTVUJNSVRQT1NUQ0hBVEZBSUxFRCIsInN1cnZleU93bmVySWQiLCJzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSIsImdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJGRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVEIiwiRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7SUFFcUJBLEc7QUFTbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBLFFBQTNGQyxhQUEyRix1RUFBeERGLEdBQUcsQ0FBQ0csb0JBQW9EO0FBQUEsUUFBdEJDLE1BQXNCO0FB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Ly8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNESyBpbXBsZW1lbnRzIElTREsge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMzUsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogM1xuICB9O1xuICBcbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb21uaWNoYW5uZWxDb25maWd1cmF0aW9uOiBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uLCBwcml2YXRlIGNvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uLCBwcml2YXRlIGxvZ2dlcj86IE9DU0RLTG9nZ2VyKSB7XG4gICAgLy8gU2V0cyB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgcGFzc2VkIGNvbmZpZ3VyYXRpb24gaXMgZW1wdHkgb3IgaXMgbm90IGFuIG9iamVjdFxuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5jb25maWd1cmF0aW9uKS5sZW5ndGggfHwgdHlwZW9mIChjb25maWd1cmF0aW9uKSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIFNESyBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBTREtDb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUcsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWR9LFxuICAgICAgICBcIkdldCBDaGF0IENvbmZpZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldChlbmRwb2ludCwge1xuICAgICAgaGVhZGVycyxcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbiAmJiBkYXRhLkxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cbiAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzOyAgXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gU3VjY2VlZGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZSBjYXNlXG4gICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgKyAxID49IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50KSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSByZXRyeSBmb3IgZ2V0Y2hhdHRva2VuIGhhcyBleGNlZWRlZCBpdHMgbWF4IHZhbHVlIG9mICR7dGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnR9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHJpZXMgdW50aWwgaXQgcmVhY2hlcyBpdHMgbGltaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldENoYXRUb2tlbihyZXF1ZXN0SWQsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLCBjdXJyZW50UmV0cnlDb3VudCArIDEpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNvbHZlKHJlc3BvbnNlKSkuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcbiAgICAgIH0sIHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgIHsgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuV0FSTixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFF1ZXVlQXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFFVRVVFQVZBSUxBQklMSVRZU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBxdWV1ZSBhdmFpbGFiaWxpdHkgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRRdWV1ZUF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHthdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHtkYXRhfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRRVUVVRUFWQUlMQUJJTElUWVNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IHF1ZXVlIGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFFVRVVFQVZBSUxBQklMSVRZRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgcXVldWUgYXZhaWxhYmlsaXR5IGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlNlc3Npb24gSW5pdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUmVjb25uZWN0Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCl7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YT8uYXV0aENoYXRFeGlzdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdWNjZWVkZWRcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSwgRXJyb3JDb2RlOiByZXNwb25zZS5zdGF0dXN9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkXCIpO1xuICAgICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdXJ2ZXlJbnZpdGVMaW5rKHN1cnZleU93bmVySWQ6IHN0cmluZywgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHk6IG9iamVjdCwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zOiBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELFxuICAgICAgICB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSxcbiAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuICkge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKXtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gOyAgICAgIFxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICBlbmRwb2ludCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IGRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7ICAgXG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgaGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59Il19
2356
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJFcnJvckNvZGUiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsImRlZmF1bHRDaGFubmVsSWQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJTZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7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NkNDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQXhFO0FBQW1HTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQWxILCtCQUZGLEVBR0UsaUNBSEY7QUFJRDs7QUFDRHdCLDRCQUFBQSxPQUFPO0FBWFE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFhVHBCLDRCQUFBQSw0QkFiUyxHQWFtQnhCLEtBQUssQ0FBQ3lCLG1CQWJ6Qjs7QUFBQSxpQ0FjWCxPQUFJLENBQUM1QyxNQWRNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsbUNBZVBrRSxtQ0FBaUJDLDZCQUFqQixlQWZPOztBQUFBO0FBZ0JiLDRCQUFBLE9BQUksQ0FBQ25FLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTNkMsS0FBekIsRUFDRTNDLDJCQUFvQndMLHlCQUR0QixFQUVFO0FBQUV0TCw4QkFBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCcUQsOEJBQUFBLGdCQUFnQixlQUF4QztBQUFpRHJCLDhCQUFBQSx5QkFBeUIsRUFBRU47QUFBNUUsNkJBRkYsRUFHRSw4QkFIRjs7QUFoQmE7QUFxQmZxQiw0QkFBQUEsTUFBTSxlQUFOOztBQXJCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF0QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7Ozs7OztpQ0E5aENtQnBFLEcsMEJBQ3NDO0FBQ3ZEdUYsRUFBQUEsc0JBQXNCLEVBQUUsRUFEK0I7QUFFdkRLLEVBQUFBLHVDQUF1QyxFQUFFLEtBRmM7QUFHdkRsRCxFQUFBQSwwQkFBMEIsRUFBRTtBQUgyQixDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uIH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCAqIGFzIGhhc2ggZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDM1LFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDNcbiAgfTtcbiAgXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJyR7a2V5fScgaW4gU0RLQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0Q29uZmlnKHJlcXVlc3RJZDogc3RyaW5nLCBieXBhc3NDYWNoZSA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBDb25maWcgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICBoZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5oZWFkZXJzIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQoZW5kcG9pbnQsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24gJiYgZGF0YS5MaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICB9XG4gICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VTUyxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVyczsgIFxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBlbmRwb2ludCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG4gICAgZW5kcG9pbnQgKz0gYD9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsXG4gICAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcmV0cnkgZm9yIGdldGNoYXR0b2tlbiBoYXMgZXhjZWVkZWQgaXRzIG1heCB2YWx1ZSBvZiAke3RoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50fWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLldBUk4sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7YXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHtcImN1c3RvbUNvbnRleHRcIjogdGVtcEFycn0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHtcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZH0pO1xuICAgIH1cblxuICAgIGRhdGEuY2FjaGVLZXkgPSBoYXNoLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkuZGlnZXN0KCdoZXgnKS50b1N0cmluZygpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7ZGF0YX0gPSByZXNwb25zZTtcbiAgICAgICAgaWYoZGF0YSkge1xuICAgICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsXG4gICAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgICBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3VjY2VlZGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBmYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIEluaXQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWR9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGEuY2hhdElkID0gY2hhdElkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgZW5kcG9pbnQgKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpe1xuICAgICAgZW5kcG9pbnQgKz0gYCZpc1BlcnNpc3RlbnRDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3VjY2VlZGVkXCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0sIEVycm9yQ29kZTogcmVzcG9uc2Uuc3RhdHVzfSxcbiAgICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZFwiKTtcbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlKHJlcXVlc3RJZDogc3RyaW5nLCBwb3N0Q2hhdFJlc3BvbnNlOiBvYmplY3QsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCB9ID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zO1xuXG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbiApIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSl7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDsgICAgICBcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYWlsVHJhbnNjcmlwdChyZXF1ZXN0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWxSZXF1ZXN0Qm9keTogb2JqZWN0LCBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtczogSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgZW5kcG9pbnQgKz0gXCI/Y2hhbm5lbElkPVwiICsgQ29uc3RhbnRzLmRlZmF1bHRDaGFubmVsSWQ7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4geyAgIFxuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIGhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSJdfQ==