appium-ios-simulator 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,6 +31,10 @@ var _bluebird = _interopRequireDefault(require("bluebird"));
31
31
 
32
32
  var _events = require("events");
33
33
 
34
+ var _appiumXcode = require("appium-xcode");
35
+
36
+ var _teen_process = require("teen_process");
37
+
34
38
  const SIMULATOR_SHUTDOWN_TIMEOUT = 15 * 1000;
35
39
  const startupLock = new _asyncLock.default();
36
40
  const preferencesPlistGuard = new _asyncLock.default();
@@ -56,7 +60,10 @@ class SimulatorXcode9 extends _simulatorXcode.default {
56
60
  }
57
61
 
58
62
  const commonPreferences = {
59
- RotateWindowWhenSignaledByGuest: true
63
+ RotateWindowWhenSignaledByGuest: true,
64
+ StartLastDeviceOnLaunch: false,
65
+ DetachOnWindowClose: false,
66
+ AttachBootedOnStart: true
60
67
  };
61
68
 
62
69
  if (_lodash.default.isBoolean(opts.connectHardwareKeyboard) || _lodash.default.isNil(opts.connectHardwareKeyboard)) {
@@ -156,6 +163,28 @@ class SimulatorXcode9 extends _simulatorXcode.default {
156
163
  await this.disableKeyboardIntroduction();
157
164
  }
158
165
 
166
+ async startUIClient(opts = {}) {
167
+ opts = _lodash.default.cloneDeep(opts);
168
+
169
+ _lodash.default.defaultsDeep(opts, {
170
+ startupTimeout: this.startupTimeout
171
+ });
172
+
173
+ const simulatorApp = _path.default.resolve(await (0, _appiumXcode.getPath)(), 'Applications', this.simulatorApp);
174
+
175
+ const args = ['-Fn', simulatorApp];
176
+
177
+ _logger.default.info(`Starting Simulator UI: ${_support.util.quote(['open', ...args])}`);
178
+
179
+ try {
180
+ await (0, _teen_process.exec)('open', args, {
181
+ timeout: opts.startupTimeout
182
+ });
183
+ } catch (err) {
184
+ throw new Error(`Got an unexpected error while opening Simulator UI: ` + err.stderr || err.stdout || err.message);
185
+ }
186
+ }
187
+
159
188
  async disableKeyboardIntroduction() {
160
189
  const argChunks = (0, _defaultsUtils.generateDefaultsCommandArgs)({
161
190
  DidShowContinuousPathIntroduction: 1
@@ -466,4 +495,4 @@ var _default = SimulatorXcode9;
466
495
  exports.default = _default;require('source-map-support').install();
467
496
 
468
497
 
469
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtOS5qcyJdLCJuYW1lcyI6WyJTSU1VTEFUT1JfU0hVVERPV05fVElNRU9VVCIsInN0YXJ0dXBMb2NrIiwiQXN5bmNMb2NrIiwicHJlZmVyZW5jZXNQbGlzdEd1YXJkIiwiRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIiLCJET01BSU5fS0VZQk9BUkRfUFJFRkVSRU5DRVMiLCJTaW11bGF0b3JYY29kZTkiLCJTaW11bGF0b3JYY29kZTgiLCJjb25zdHJ1Y3RvciIsInVkaWQiLCJ4Y29kZVZlcnNpb24iLCJydW4iLCJvcHRzIiwiXyIsImNsb25lRGVlcCIsImRlZmF1bHRzRGVlcCIsImRldmljZVByZWZlcmVuY2VzIiwiaXNIZWFkbGVzcyIsInN0YXJ0dXBUaW1lb3V0Iiwic2NhbGVGYWN0b3IiLCJTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUiLCJwYXJzZUZsb2F0IiwiY29tbW9uUHJlZmVyZW5jZXMiLCJSb3RhdGVXaW5kb3dXaGVuU2lnbmFsZWRCeUd1ZXN0IiwiaXNCb29sZWFuIiwiY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQiLCJpc05pbCIsIkNvbm5lY3RIYXJkd2FyZUtleWJvYXJkIiwidHJhY2VQb2ludGVyIiwiU2hvd1NpbmdsZVRvdWNoZXMiLCJTaG93UGluY2hlcyIsIlNob3dQaW5jaFBpdm90UG9pbnQiLCJIaWdobGlnaHRFZGdlR2VzdHVyZXMiLCJsb3dlckNhc2UiLCJwYXN0ZWJvYXJkQXV0b21hdGljU3luYyIsIlBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jIiwibG9nIiwiaW5mbyIsInVwZGF0ZVByZWZlcmVuY2VzIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0Iiwic2hvdWxkV2FpdEZvckJvb3QiLCJhY3F1aXJlIiwidWlDbGllbnRCdW5kbGVJZCIsImlzU2VydmVyUnVubmluZyIsImlzUnVubmluZyIsInVpQ2xpZW50UGlkIiwiZ2V0VUlDbGllbnRQaWQiLCJraWxsVUlDbGllbnQiLCJwaWQiLCJpc1NodXRkb3duIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImUiLCJFcnJvciIsImJvb3QiLCJzaHV0ZG93biIsInRpbWVvdXQiLCJsYXVuY2hXaW5kb3ciLCJ3YWl0Rm9yQm9vdCIsImdldER1cmF0aW9uIiwiYXNTZWNvbmRzIiwidG9GaXhlZCIsImRpc2FibGVLZXlib2FyZEludHJvZHVjdGlvbiIsImFyZ0NodW5rcyIsIkRpZFNob3dDb250aW51b3VzUGF0aEludHJvZHVjdGlvbiIsIkIiLCJhbGwiLCJtYXAiLCJhcmdzIiwic2ltY3RsIiwic3Bhd25Qcm9jZXNzIiwiaXNVaUNsaWVudFJ1bm5pbmciLCJzdGFydFVJQ2xpZW50IiwiYm9vdEV2ZW50c0VtaXR0ZXIiLCJFdmVudEVtaXR0ZXIiLCJzdGFydEJvb3RNb25pdG9yIiwib25FcnJvciIsImVyciIsImVtaXQiLCJvbkZpbmlzaGVkIiwic2hvdWxkUHJlYm9vdCIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0Iiwib25jZSIsImluY2x1ZGVzIiwibWVzc2FnZSIsInJlbW92ZUFsbExpc3RlbmVycyIsInZlcmlmeURldmljZVByZWZlcmVuY2VzIiwicHJlZnMiLCJpc0VtcHR5IiwiaXNVbmRlZmluZWQiLCJpc051bWJlciIsImVycm9yQW5kVGhyb3ciLCJTaW11bGF0b3JXaW5kb3dDZW50ZXIiLCJ2ZXJpZmljYXRpb25QYXR0ZXJuIiwiaXNTdHJpbmciLCJ0ZXN0IiwiU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb24iLCJhY2NlcHRhYmxlVmFsdWVzIiwiaW5kZXhPZiIsIlNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUiLCJkZXZpY2VQcmVmcyIsImNvbW1vblByZWZzIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwiaG9tZUZvbGRlclBhdGgiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsIndhcm4iLCJwbGlzdFBhdGgiLCJwYXRoIiwibmFtZSIsImRlZmF1bHRzIiwiTlNVc2VyRGVmYXVsdHMiLCJwcmVmc1RvVXBkYXRlIiwiY2xvbmUiLCJleGlzdGluZ0RldmljZVByZWZzIiwidWRpZEtleSIsInRvVXBwZXJDYXNlIiwiZnMiLCJleGlzdHMiLCJjdXJyZW50UGxpc3RDb250ZW50IiwiYXNKc29uIiwiaXNQbGFpbk9iamVjdCIsIkRldmljZVByZWZlcmVuY2VzIiwiT2JqZWN0IiwiYXNzaWduIiwidXBkYXRlIiwiY2xlYW4iLCJlcmFzZURldmljZSIsIl9hY3RpdmF0ZVdpbmRvdyIsInNlbGZOYW1lIiwic2VsZlNkayIsImJvb3RlZERldmljZXNDb3VudCIsInNkayIsImRldmljZUFyciIsInRvUGFpcnMiLCJnZXREZXZpY2VzIiwic3RhdGUiLCJpc0Jpb21ldHJpY0Vucm9sbGVkIiwic3Rkb3V0IiwibWF0Y2giLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJleGVjIiwiZW5yb2xsQmlvbWV0cmljIiwiaXNFbmFibGVkIiwic2VuZEJpb21ldHJpY01hdGNoIiwic2hvdWxkTWF0Y2giLCJiaW9tZXRyaWNOYW1lIiwiZG9tYWluQ29tcG9uZW50IiwiZG9tYWluIiwiZ2V0TGF1bmNoRGFlbW9uc1Jvb3QiLCJkZXZSb290IiwiY29uZmlndXJlTG9jYWxpemF0aW9uIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJrZXlib2FyZCIsImdsb2JhbFByZWZzIiwia2V5Ym9hcmRJZCIsImxheW91dCIsImhhcmR3YXJlIiwiQXBwbGVLZXlib2FyZHMiLCJBcHBsZUxhbmd1YWdlcyIsImNhbGVuZGFyIiwibG9jYWxlSWQiLCJBcHBsZUxvY2FsZSIsIktleWJvYXJkc0N1cnJlbnRBbmROZXh0IiwiS2V5Ym9hcmRMYXN0VXNlZCIsIktleWJvYXJkTGFzdFVzZWRGb3JMYW5ndWFnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSwwQkFBMEIsR0FBRyxLQUFLLElBQXhDO0FBQ0EsTUFBTUMsV0FBVyxHQUFHLElBQUlDLGtCQUFKLEVBQXBCO0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsSUFBSUQsa0JBQUosRUFBOUI7QUFDQSxNQUFNRSxnQ0FBZ0MsR0FBRywwQ0FBekM7QUFDQSxNQUFNQywyQkFBMkIsR0FBRyxnQ0FBcEM7O0FBRUEsTUFBTUMsZUFBTixTQUE4QkMsdUJBQTlCLENBQThDO0FBQzVDQyxFQUFBQSxXQUFXLENBQUVDLElBQUYsRUFBUUMsWUFBUixFQUFzQjtBQUMvQixVQUFNRCxJQUFOLEVBQVlDLFlBQVo7QUFDRDs7QUFzRFEsUUFBSEMsR0FBRyxDQUFFQyxJQUFJLEdBQUcsRUFBVCxFQUFhO0FBQ3BCQSxJQUFBQSxJQUFJLEdBQUdDLGdCQUFFQyxTQUFGLENBQVlGLElBQVosQ0FBUDs7QUFDQUMsb0JBQUVFLFlBQUYsQ0FBZUgsSUFBZixFQUFxQjtBQUNuQkksTUFBQUEsaUJBQWlCLEVBQUUsRUFEQTtBQUVuQkMsTUFBQUEsVUFBVSxFQUFFLEtBRk87QUFHbkJDLE1BQUFBLGNBQWMsRUFBRSxLQUFLQTtBQUhGLEtBQXJCOztBQU1BLFFBQUlOLElBQUksQ0FBQ08sV0FBVCxFQUFzQjtBQUNwQlAsTUFBQUEsSUFBSSxDQUFDSSxpQkFBTCxDQUF1Qkksd0JBQXZCLEdBQWtEQyxVQUFVLENBQUNULElBQUksQ0FBQ08sV0FBTixDQUE1RDtBQUNEOztBQUdELFVBQU1HLGlCQUFpQixHQUFHO0FBQ3hCQyxNQUFBQSwrQkFBK0IsRUFBRTtBQURULEtBQTFCOztBQUdBLFFBQUlWLGdCQUFFVyxTQUFGLENBQVlaLElBQUksQ0FBQ2EsdUJBQWpCLEtBQTZDWixnQkFBRWEsS0FBRixDQUFRZCxJQUFJLENBQUNhLHVCQUFiLENBQWpELEVBQXdGO0FBQUE7O0FBQ3RGYixNQUFBQSxJQUFJLENBQUNJLGlCQUFMLENBQXVCVyx1QkFBdkIsNEJBQWlEZixJQUFJLENBQUNhLHVCQUF0RCx5RUFBaUYsS0FBakY7QUFDQUgsTUFBQUEsaUJBQWlCLENBQUNLLHVCQUFsQiw2QkFBNENmLElBQUksQ0FBQ2EsdUJBQWpELDJFQUE0RSxLQUE1RTtBQUNEOztBQUNELFFBQUlaLGdCQUFFVyxTQUFGLENBQVlaLElBQUksQ0FBQ2dCLFlBQWpCLENBQUosRUFBb0M7QUFDbENOLE1BQUFBLGlCQUFpQixDQUFDTyxpQkFBbEIsR0FBc0NqQixJQUFJLENBQUNnQixZQUEzQztBQUNBTixNQUFBQSxpQkFBaUIsQ0FBQ1EsV0FBbEIsR0FBZ0NsQixJQUFJLENBQUNnQixZQUFyQztBQUNBTixNQUFBQSxpQkFBaUIsQ0FBQ1MsbUJBQWxCLEdBQXdDbkIsSUFBSSxDQUFDZ0IsWUFBN0M7QUFDQU4sTUFBQUEsaUJBQWlCLENBQUNVLHFCQUFsQixHQUEwQ3BCLElBQUksQ0FBQ2dCLFlBQS9DO0FBQ0Q7O0FBQ0QsWUFBUWYsZ0JBQUVvQixTQUFGLENBQVlyQixJQUFJLENBQUNzQix1QkFBakIsQ0FBUjtBQUNFLFdBQUssSUFBTDtBQUNFWixRQUFBQSxpQkFBaUIsQ0FBQ2EsdUJBQWxCLEdBQTRDLElBQTVDO0FBQ0E7O0FBQ0YsV0FBSyxLQUFMO0FBR0ViLFFBQUFBLGlCQUFpQixDQUFDYSx1QkFBbEIsR0FBNEMsS0FBNUM7QUFDQTs7QUFDRixXQUFLLFFBQUw7QUFFRTs7QUFDRjtBQUNFQyx3QkFBSUMsSUFBSixDQUFVLHNHQUFWOztBQUNBZixRQUFBQSxpQkFBaUIsQ0FBQ2EsdUJBQWxCLEdBQTRDLEtBQTVDO0FBZEo7O0FBZ0JBLFVBQU0sS0FBS0csaUJBQUwsQ0FBdUIxQixJQUFJLENBQUNJLGlCQUE1QixFQUErQ00saUJBQS9DLENBQU47QUFFQSxVQUFNaUIsS0FBSyxHQUFHLElBQUlDLGdCQUFPQyxLQUFYLEdBQW1CQyxLQUFuQixFQUFkO0FBQ0EsVUFBTUMsaUJBQWlCLEdBQUcsTUFBTTFDLFdBQVcsQ0FBQzJDLE9BQVosQ0FBb0IsS0FBS0MsZ0JBQXpCLEVBQTJDLFlBQVk7QUFDckYsWUFBTUMsZUFBZSxHQUFHLE1BQU0sS0FBS0MsU0FBTCxFQUE5QjtBQUNBLFlBQU1DLFdBQVcsR0FBRyxNQUFNLEtBQUtDLGNBQUwsRUFBMUI7O0FBQ0EsVUFBSXJDLElBQUksQ0FBQ0ssVUFBVCxFQUFxQjtBQUNuQixZQUFJNkIsZUFBZSxJQUFJLENBQUNFLFdBQXhCLEVBQXFDO0FBQ25DWiwwQkFBSUMsSUFBSixDQUFVLHdCQUF1QixLQUFLNUIsSUFBSyx1Q0FBM0M7O0FBQ0EsaUJBQU8sS0FBUDtBQUNEOztBQUNELFlBQUksTUFBTSxLQUFLeUMsWUFBTCxDQUFrQjtBQUFDQyxVQUFBQSxHQUFHLEVBQUVIO0FBQU4sU0FBbEIsQ0FBVixFQUFpRDtBQUMvQ1osMEJBQUlDLElBQUosQ0FBVSxtR0FBVjtBQUNEOztBQUNELFlBQUk7QUFFRixnQkFBTSxnQ0FBaUIsWUFBWSxNQUFNLEtBQUtlLFVBQUwsRUFBbkMsRUFBc0Q7QUFDMURDLFlBQUFBLE1BQU0sRUFBRSxJQURrRDtBQUUxREMsWUFBQUEsVUFBVSxFQUFFO0FBRjhDLFdBQXRELENBQU47QUFJRCxTQU5ELENBTUUsT0FBT0MsQ0FBUCxFQUFVO0FBQ1YsY0FBSSxFQUFDLE1BQU0sS0FBS1IsU0FBTCxFQUFQLENBQUosRUFBNkI7QUFDM0Isa0JBQU0sSUFBSVMsS0FBSixDQUFXLHdCQUF1QixLQUFLL0MsSUFBSywyQ0FBNUMsQ0FBTjtBQUNEOztBQUNELGlCQUFPLEtBQVA7QUFDRDs7QUFDRDJCLHdCQUFJQyxJQUFKLENBQVUsZ0NBQStCLEtBQUs1QixJQUFLLHNCQUExQyxHQUNOLHFEQURIOztBQUVBLGNBQU0sS0FBS2dELElBQUwsRUFBTjtBQUNELE9BdkJELE1BdUJPO0FBQ0wsWUFBSVgsZUFBZSxJQUFJRSxXQUF2QixFQUFvQztBQUNsQ1osMEJBQUlDLElBQUosQ0FBVSw2QkFBNEIsS0FBSzVCLElBQUssMkNBQWhEOztBQUNBLGlCQUFPLEtBQVA7QUFDRDs7QUFDRCxZQUFJcUMsZUFBSixFQUFxQjtBQUNuQlYsMEJBQUlDLElBQUosQ0FBVSxjQUFhLEtBQUs1QixJQUFLLDJDQUF4QixHQUNOLHdEQURIOztBQUVBLGdCQUFNLEtBQUtpRCxRQUFMLENBQWM7QUFBQ0MsWUFBQUEsT0FBTyxFQUFFM0Q7QUFBVixXQUFkLENBQU47QUFDRDs7QUFDRCxjQUFNLEtBQUs0RCxZQUFMLENBQWtCWixXQUFsQixFQUErQnBDLElBQS9CLENBQU47QUFDRDs7QUFDRCxhQUFPLElBQVA7QUFDRCxLQXZDK0IsQ0FBaEM7O0FBeUNBLFFBQUkrQixpQkFBSixFQUF1QjtBQUNyQixZQUFNLEtBQUtrQixXQUFMLENBQWlCakQsSUFBSSxDQUFDTSxjQUF0QixDQUFOOztBQUNBa0Isc0JBQUlDLElBQUosQ0FBVSx1QkFBc0IsS0FBSzVCLElBQUssY0FBYThCLEtBQUssQ0FBQ3VCLFdBQU4sR0FBb0JDLFNBQXBCLENBQThCQyxPQUE5QixDQUFzQyxDQUF0QyxDQUF5QyxHQUFoRztBQUNEOztBQUVELFVBQU0sS0FBS0MsMkJBQUwsRUFBTjtBQUNEOztBQUtnQyxRQUEzQkEsMkJBQTJCLEdBQUk7QUFDbkMsVUFBTUMsU0FBUyxHQUFHLGdEQUE0QjtBQUc1Q0MsTUFBQUEsaUNBQWlDLEVBQUU7QUFIUyxLQUE1QixFQUlmLElBSmUsQ0FBbEI7QUFLQSxVQUFNQyxrQkFBRUMsR0FBRixDQUFNSCxTQUFTLENBQUNJLEdBQVYsQ0FBZUMsSUFBRCxJQUFVLEtBQUtDLE1BQUwsQ0FBWUMsWUFBWixDQUF5QixDQUMzRCxVQUQyRCxFQUMvQyxPQUQrQyxFQUN0Q3BFLDJCQURzQyxFQUNULEdBQUdrRSxJQURNLENBQXpCLENBQXhCLENBQU4sQ0FBTjtBQUdEOztBQVFpQixRQUFaWCxZQUFZLENBQUVjLGlCQUFGLEVBQXFCOUQsSUFBSSxHQUFHLEVBQTVCLEVBQWdDO0FBQ2hELFVBQU0sS0FBSzZDLElBQUwsRUFBTjs7QUFDQSxRQUFJLENBQUNpQixpQkFBTCxFQUF3QjtBQUN0QixZQUFNLEtBQUtDLGFBQUwsQ0FBbUIvRCxJQUFuQixDQUFOO0FBQ0Q7QUFDRjs7QUFTUyxRQUFKNkMsSUFBSSxHQUFJO0FBQ1osVUFBTW1CLGlCQUFpQixHQUFHLElBQUlDLG9CQUFKLEVBQTFCO0FBQ0EsVUFBTSxLQUFLTCxNQUFMLENBQVlNLGdCQUFaLENBQTZCO0FBQ2pDQyxNQUFBQSxPQUFPLEVBQUdDLEdBQUQsSUFBU0osaUJBQWlCLENBQUNLLElBQWxCLENBQXVCLFNBQXZCLEVBQWtDRCxHQUFsQyxDQURlO0FBRWpDRSxNQUFBQSxVQUFVLEVBQUUsTUFBTU4saUJBQWlCLENBQUNLLElBQWxCLENBQXVCLFFBQXZCLENBRmU7QUFHakNFLE1BQUFBLGFBQWEsRUFBRTtBQUhrQixLQUE3QixDQUFOOztBQUtBLFFBQUk7QUFDRixZQUFNLElBQUlmLGlCQUFKLENBQU0sQ0FBQ2dCLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtBQUsvQkMsUUFBQUEsVUFBVSxDQUFDRixPQUFELEVBQVUsSUFBVixDQUFWO0FBQ0FSLFFBQUFBLGlCQUFpQixDQUFDVyxJQUFsQixDQUF1QixTQUF2QixFQUFtQ1AsR0FBRCxJQUFTO0FBQ3pDLGNBQUluRSxnQkFBRTJFLFFBQUYsQ0FBV1IsR0FBWCxhQUFXQSxHQUFYLHVCQUFXQSxHQUFHLENBQUVTLE9BQWhCLEVBQXlCLGVBQXpCLENBQUosRUFBK0M7QUFDN0NMLFlBQUFBLE9BQU87QUFDUixXQUZELE1BRU87QUFDTEMsWUFBQUEsTUFBTSxDQUFDTCxHQUFELENBQU47QUFDRDtBQUNGLFNBTkQ7QUFPQUosUUFBQUEsaUJBQWlCLENBQUNXLElBQWxCLENBQXVCLFFBQXZCLEVBQWlDSCxPQUFqQztBQUNELE9BZEssQ0FBTjtBQWVELEtBaEJELFNBZ0JVO0FBQ1JSLE1BQUFBLGlCQUFpQixDQUFDYyxrQkFBbEI7QUFDRDtBQUNGOztBQVNEQyxFQUFBQSx1QkFBdUIsQ0FBRUMsS0FBSyxHQUFHLEVBQVYsRUFBYztBQUNuQyxRQUFJL0UsZ0JBQUVnRixPQUFGLENBQVVELEtBQVYsQ0FBSixFQUFzQjtBQUNwQjtBQUNEOztBQUVELFFBQUksQ0FBQy9FLGdCQUFFaUYsV0FBRixDQUFjRixLQUFLLENBQUN4RSx3QkFBcEIsQ0FBTCxFQUFvRDtBQUNsRCxVQUFJLENBQUNQLGdCQUFFa0YsUUFBRixDQUFXSCxLQUFLLENBQUN4RSx3QkFBakIsQ0FBRCxJQUErQ3dFLEtBQUssQ0FBQ3hFLHdCQUFOLElBQWtDLENBQXJGLEVBQXdGO0FBQ3RGZ0Isd0JBQUk0RCxhQUFKLENBQW1CLHFFQUFELEdBQ2YsSUFBR0osS0FBSyxDQUFDeEUsd0JBQXlCLHdCQURyQztBQUVEO0FBQ0Y7O0FBRUQsUUFBSSxDQUFDUCxnQkFBRWlGLFdBQUYsQ0FBY0YsS0FBSyxDQUFDSyxxQkFBcEIsQ0FBTCxFQUFpRDtBQUUvQyxZQUFNQyxtQkFBbUIsR0FBRywrQkFBNUI7O0FBQ0EsVUFBSSxDQUFDckYsZ0JBQUVzRixRQUFGLENBQVdQLEtBQUssQ0FBQ0sscUJBQWpCLENBQUQsSUFBNEMsQ0FBQ0MsbUJBQW1CLENBQUNFLElBQXBCLENBQXlCUixLQUFLLENBQUNLLHFCQUEvQixDQUFqRCxFQUF3RztBQUN0RzdELHdCQUFJNEQsYUFBSixDQUFtQix3R0FBRCxHQUNmLElBQUdKLEtBQUssQ0FBQ0sscUJBQXNCLHdCQURsQztBQUVEO0FBQ0Y7O0FBRUQsUUFBSSxDQUFDcEYsZ0JBQUVpRixXQUFGLENBQWNGLEtBQUssQ0FBQ1MsMEJBQXBCLENBQUwsRUFBc0Q7QUFDcEQsWUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQyxVQUFELEVBQWEsZUFBYixFQUE4QixvQkFBOUIsRUFBb0QsZ0JBQXBELENBQXpCOztBQUNBLFVBQUlBLGdCQUFnQixDQUFDQyxPQUFqQixDQUF5QlgsS0FBSyxDQUFDUywwQkFBL0IsTUFBK0QsQ0FBQyxDQUFwRSxFQUF1RTtBQUNyRWpFLHdCQUFJNEQsYUFBSixDQUFtQix1REFBc0RNLGdCQUFpQixJQUF4RSxHQUNmLElBQUdWLEtBQUssQ0FBQ1MsMEJBQTJCLHdCQUR2QztBQUVEO0FBQ0Y7O0FBRUQsUUFBSSxDQUFDeEYsZ0JBQUVpRixXQUFGLENBQWNGLEtBQUssQ0FBQ1ksNEJBQXBCLENBQUwsRUFBd0Q7QUFDdEQsVUFBSSxDQUFDM0YsZ0JBQUVrRixRQUFGLENBQVdILEtBQUssQ0FBQ1ksNEJBQWpCLENBQUwsRUFBcUQ7QUFDbkRwRSx3QkFBSTRELGFBQUosQ0FBbUIsaUVBQUQsR0FDZixJQUFHSixLQUFLLENBQUNZLDRCQUE2Qix3QkFEekM7QUFFRDtBQUNGO0FBQ0Y7O0FBYXNCLFFBQWpCbEUsaUJBQWlCLENBQUVtRSxXQUFXLEdBQUcsRUFBaEIsRUFBb0JDLFdBQVcsR0FBRyxFQUFsQyxFQUFzQztBQUMzRCxRQUFJLENBQUM3RixnQkFBRWdGLE9BQUYsQ0FBVVksV0FBVixDQUFMLEVBQTZCO0FBQzNCckUsc0JBQUl1RSxLQUFKLENBQVcsMEJBQXlCLEtBQUtsRyxJQUFLLGlCQUFnQm1HLElBQUksQ0FBQ0MsU0FBTCxDQUFlSixXQUFmLENBQTRCLEVBQTFGO0FBQ0Q7O0FBQ0QsUUFBSSxDQUFDNUYsZ0JBQUVnRixPQUFGLENBQVVhLFdBQVYsQ0FBTCxFQUE2QjtBQUMzQnRFLHNCQUFJdUUsS0FBSixDQUFXLDJDQUEwQ0MsSUFBSSxDQUFDQyxTQUFMLENBQWVILFdBQWYsQ0FBNEIsRUFBakY7QUFDRDs7QUFDRCxVQUFNSSxjQUFjLEdBQUdDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxJQUFuQzs7QUFDQSxRQUFJLENBQUNILGNBQUwsRUFBcUI7QUFDbkIxRSxzQkFBSThFLElBQUosQ0FBVSxtRUFBRCxHQUNOLHdDQURIOztBQUVBLGFBQU8sS0FBUDtBQUNEOztBQUNELFNBQUt2Qix1QkFBTCxDQUE2QmMsV0FBN0I7O0FBQ0EsVUFBTVUsU0FBUyxHQUFHQyxjQUFLaEMsT0FBTCxDQUFhMEIsY0FBYixFQUE2QixTQUE3QixFQUF3QyxhQUF4QyxFQUF1RCxpQ0FBdkQsQ0FBbEI7O0FBQ0EsV0FBTyxNQUFNM0cscUJBQXFCLENBQUN5QyxPQUF0QixDQUE4QnRDLGVBQWUsQ0FBQytHLElBQTlDLEVBQW9ELFlBQVk7QUFDM0UsWUFBTUMsUUFBUSxHQUFHLElBQUlDLDZCQUFKLENBQW1CSixTQUFuQixDQUFqQjs7QUFDQSxZQUFNSyxhQUFhLEdBQUczRyxnQkFBRTRHLEtBQUYsQ0FBUWYsV0FBUixDQUF0Qjs7QUFDQSxVQUFJO0FBQ0YsWUFBSSxDQUFDN0YsZ0JBQUVnRixPQUFGLENBQVVZLFdBQVYsQ0FBTCxFQUE2QjtBQUMzQixjQUFJaUIsbUJBQUo7QUFDQSxnQkFBTUMsT0FBTyxHQUFHLEtBQUtsSCxJQUFMLENBQVVtSCxXQUFWLEVBQWhCOztBQUNBLGNBQUksTUFBTUMsWUFBR0MsTUFBSCxDQUFVWCxTQUFWLENBQVYsRUFBZ0M7QUFDOUIsa0JBQU1ZLG1CQUFtQixHQUFHLE1BQU1ULFFBQVEsQ0FBQ1UsTUFBVCxFQUFsQzs7QUFDQSxnQkFBSW5ILGdCQUFFb0gsYUFBRixDQUFnQkYsbUJBQW1CLENBQUNHLGlCQUFwQyxLQUNHckgsZ0JBQUVvSCxhQUFGLENBQWdCRixtQkFBbUIsQ0FBQ0csaUJBQXBCLENBQXNDUCxPQUF0QyxDQUFoQixDQURQLEVBQ3dFO0FBQ3RFRCxjQUFBQSxtQkFBbUIsR0FBR0ssbUJBQW1CLENBQUNHLGlCQUFwQixDQUFzQ1AsT0FBdEMsQ0FBdEI7QUFDRDtBQUNGOztBQUNEUSxVQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBY1osYUFBZCxFQUE2QjtBQUMzQlUsWUFBQUEsaUJBQWlCLEVBQUU7QUFDakIsZUFBQ1AsT0FBRCxHQUFXUSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCVixtQkFBbUIsSUFBSSxFQUF6QyxFQUE2Q2pCLFdBQTdDO0FBRE07QUFEUSxXQUE3QjtBQUtEOztBQUNELGNBQU1hLFFBQVEsQ0FBQ2UsTUFBVCxDQUFnQmIsYUFBaEIsQ0FBTjs7QUFDQXBGLHdCQUFJdUUsS0FBSixDQUFXLFdBQVUsS0FBS2xHLElBQUssOEJBQTZCMEcsU0FBVSxTQUE1RCxHQUNSUCxJQUFJLENBQUNDLFNBQUwsQ0FBZVcsYUFBZixDQURGOztBQUVBLGVBQU8sSUFBUDtBQUNELE9BckJELENBcUJFLE9BQU9qRSxDQUFQLEVBQVU7QUFDVm5CLHdCQUFJOEUsSUFBSixDQUFVLGlCQUFnQixLQUFLekcsSUFBSyw4QkFBNkIwRyxTQUFVLEtBQWxFLEdBQ04seUVBQXdFNUQsQ0FBQyxDQUFDa0MsT0FBUSxFQURyRjs7QUFFQSxlQUFPLEtBQVA7QUFDRDtBQUNGLEtBN0JZLENBQWI7QUE4QkQ7O0FBTVUsUUFBTDZDLEtBQUssR0FBSTtBQUNibEcsb0JBQUlDLElBQUosQ0FBVSxzQkFBcUIsS0FBSzVCLElBQUssRUFBekM7O0FBQ0EsVUFBTSxLQUFLK0QsTUFBTCxDQUFZK0QsV0FBWixDQUF3QixLQUF4QixDQUFOO0FBQ0Q7O0FBT29CLFFBQWZDLGVBQWUsR0FBSTtBQUN2QixRQUFJQyxRQUFKO0FBQ0EsUUFBSUMsT0FBSjtBQUNBLFFBQUlDLGtCQUFrQixHQUFHLENBQXpCOztBQUNBLFNBQUssTUFBTSxDQUFDQyxHQUFELEVBQU1DLFNBQU4sQ0FBWCxJQUErQmhJLGdCQUFFaUksT0FBRixDQUFVLE1BQU0sS0FBS3RFLE1BQUwsQ0FBWXVFLFVBQVosRUFBaEIsQ0FBL0IsRUFBMEU7QUFDeEUsV0FBSyxNQUFNO0FBQUNDLFFBQUFBLEtBQUQ7QUFBUXZJLFFBQUFBLElBQVI7QUFBYzRHLFFBQUFBO0FBQWQsT0FBWCxJQUFrQ3dCLFNBQWxDLEVBQTZDO0FBQzNDLFlBQUlHLEtBQUssS0FBSyxRQUFkLEVBQXdCO0FBQ3RCTCxVQUFBQSxrQkFBa0I7QUFDbkI7O0FBQ0QsWUFBSSxDQUFDRixRQUFELElBQWFoSSxJQUFJLEtBQUssS0FBS0EsSUFBL0IsRUFBcUM7QUFDbkNpSSxVQUFBQSxPQUFPLEdBQUdFLEdBQVY7QUFDQUgsVUFBQUEsUUFBUSxHQUFHcEIsSUFBWDtBQUNEO0FBQ0Y7QUFDRjs7QUFDRCxRQUFJc0Isa0JBQWtCLEdBQUcsQ0FBekIsRUFBNEI7QUFDMUIsYUFBTyxNQUFNLE1BQU1ILGVBQU4sRUFBYjtBQUNEOztBQUdELFdBQVE7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5REMsUUFBUyw2QkFBNEJDLE9BQVE7QUFDdEc7QUFDQTtBQUNBLEtBUkk7QUFTRDs7QUFNd0IsUUFBbkJPLG1CQUFtQixHQUFJO0FBQzNCLFVBQU07QUFBQ0MsTUFBQUE7QUFBRCxRQUFXLE1BQU0sS0FBSzFFLE1BQUwsQ0FBWUMsWUFBWixDQUF5QixDQUM5QyxZQUQ4QyxFQUU5QyxJQUY4QyxFQUV4Q3JFLGdDQUZ3QyxDQUF6QixDQUF2QjtBQUlBLFVBQU0rSSxLQUFLLEdBQUksSUFBSUMsTUFBSixDQUFZLEdBQUV2SSxnQkFBRXdJLFlBQUYsQ0FBZWpKLGdDQUFmLENBQWlELFlBQS9ELENBQUQsQ0FDWGtKLElBRFcsQ0FDTkosTUFETSxDQUFkOztBQUVBLFFBQUksQ0FBQ0MsS0FBTCxFQUFZO0FBQ1YsWUFBTSxJQUFJM0YsS0FBSixDQUFXLGlEQUFnRDBGLE1BQU8sR0FBbEUsQ0FBTjtBQUNEOztBQUNEOUcsb0JBQUlDLElBQUosQ0FBVSx3Q0FBdUMsS0FBSzVCLElBQUssZUFBYzBJLEtBQUssQ0FBQyxDQUFELENBQUksRUFBbEY7O0FBQ0EsV0FBT0EsS0FBSyxDQUFDLENBQUQsQ0FBTCxLQUFhLEdBQXBCO0FBQ0Q7O0FBTW9CLFFBQWZJLGVBQWUsQ0FBRUMsU0FBUyxHQUFHLElBQWQsRUFBb0I7QUFDdkNwSCxvQkFBSXVFLEtBQUosQ0FBVyx3Q0FBdUMsS0FBS2xHLElBQUssa0JBQWlCK0ksU0FBUyxHQUFHLFNBQUgsR0FBZSxVQUFXLEdBQWhIOztBQUNBLFVBQU0sS0FBS2hGLE1BQUwsQ0FBWUMsWUFBWixDQUF5QixDQUM3QixZQUQ2QixFQUU3QixJQUY2QixFQUV2QnJFLGdDQUZ1QixFQUVXb0osU0FBUyxHQUFHLEdBQUgsR0FBUyxHQUY3QixDQUF6QixDQUFOO0FBSUEsVUFBTSxLQUFLaEYsTUFBTCxDQUFZQyxZQUFaLENBQXlCLENBQzdCLFlBRDZCLEVBRTdCLElBRjZCLEVBRXZCckUsZ0NBRnVCLENBQXpCLENBQU47O0FBSUEsUUFBSSxPQUFNLEtBQUs2SSxtQkFBTCxFQUFOLE1BQXFDTyxTQUF6QyxFQUFvRDtBQUNsRCxZQUFNLElBQUloRyxLQUFKLENBQVcsMkNBQTBDLEtBQUsvQyxJQUFLLGtCQUFpQitJLFNBQVMsR0FBRyxTQUFILEdBQWUsVUFBVyxHQUFuSCxDQUFOO0FBQ0Q7QUFDRjs7QUFVdUIsUUFBbEJDLGtCQUFrQixDQUFFQyxXQUFXLEdBQUcsSUFBaEIsRUFBc0JDLGFBQWEsR0FBRyxTQUF0QyxFQUFpRDtBQUN2RSxVQUFNQyxlQUFlLEdBQUcsdUNBQTJCRCxhQUEzQixDQUF4QjtBQUNBLFVBQU1FLE1BQU0sR0FBSSw4QkFBNkJELGVBQWdCLElBQUdGLFdBQVcsR0FBRyxFQUFILEdBQVEsSUFBSyxPQUF4RjtBQUNBLFVBQU0sS0FBS2xGLE1BQUwsQ0FBWUMsWUFBWixDQUF5QixDQUM3QixZQUQ2QixFQUU3QixJQUY2QixFQUV2Qm9GLE1BRnVCLENBQXpCLENBQU47O0FBSUF6SCxvQkFBSUMsSUFBSixDQUFVLHFCQUFvQndILE1BQU8sT0FBTUgsV0FBVyxHQUFHLE9BQUgsR0FBYSxXQUFZLElBQUdDLGFBQWMsYUFBdkYsR0FDTixPQUFNLEtBQUtsSixJQUFLLFlBRG5CO0FBRUQ7O0FBS3lCLFFBQXBCcUosb0JBQW9CLEdBQUk7QUFDNUIsVUFBTUMsT0FBTyxHQUFHLE1BQU0sOEJBQXRCO0FBQ0EsV0FBTzNDLGNBQUtoQyxPQUFMLENBQWEyRSxPQUFiLEVBQ0wsMEpBREssQ0FBUDtBQUVEOztBQWtDMEIsUUFBckJDLHFCQUFxQixDQUFFcEosSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QyxRQUFJQyxnQkFBRWdGLE9BQUYsQ0FBVWpGLElBQVYsQ0FBSixFQUFxQjtBQUNuQixhQUFPLEtBQVA7QUFDRDs7QUFFRCxVQUFNO0FBQUVxSixNQUFBQSxRQUFGO0FBQVlDLE1BQUFBLE1BQVo7QUFBb0JDLE1BQUFBO0FBQXBCLFFBQWlDdkosSUFBdkM7QUFDQSxVQUFNd0osV0FBVyxHQUFHLEVBQXBCO0FBQ0EsUUFBSUMsVUFBVSxHQUFHLElBQWpCOztBQUNBLFFBQUl4SixnQkFBRW9ILGFBQUYsQ0FBZ0JrQyxRQUFoQixDQUFKLEVBQStCO0FBQzdCLFlBQU07QUFBRTlDLFFBQUFBLElBQUY7QUFBUWlELFFBQUFBLE1BQVI7QUFBZ0JDLFFBQUFBO0FBQWhCLFVBQTZCSixRQUFuQzs7QUFDQSxVQUFJLENBQUM5QyxJQUFMLEVBQVc7QUFDVCxjQUFNLElBQUk3RCxLQUFKLENBQVcsaURBQVgsQ0FBTjtBQUNEOztBQUNELFVBQUksQ0FBQzhHLE1BQUwsRUFBYTtBQUNYLGNBQU0sSUFBSTlHLEtBQUosQ0FBVyxtREFBWCxDQUFOO0FBQ0Q7O0FBQ0Q2RyxNQUFBQSxVQUFVLEdBQUksR0FBRWhELElBQUssT0FBTWlELE1BQU8sRUFBbEM7O0FBQ0EsVUFBSUMsUUFBSixFQUFjO0FBQ1pGLFFBQUFBLFVBQVUsSUFBSyxRQUFPRSxRQUFTLEVBQS9CO0FBQ0Q7O0FBQ0RILE1BQUFBLFdBQVcsQ0FBQ0ksY0FBWixHQUE2QixDQUFDSCxVQUFELENBQTdCO0FBQ0Q7O0FBQ0QsUUFBSXhKLGdCQUFFb0gsYUFBRixDQUFnQmdDLFFBQWhCLENBQUosRUFBK0I7QUFDN0IsWUFBTTtBQUFFNUMsUUFBQUE7QUFBRixVQUFXNEMsUUFBakI7O0FBQ0EsVUFBSSxDQUFDNUMsSUFBTCxFQUFXO0FBQ1QsY0FBTSxJQUFJN0QsS0FBSixDQUFXLGlEQUFYLENBQU47QUFDRDs7QUFDRDRHLE1BQUFBLFdBQVcsQ0FBQ0ssY0FBWixHQUE2QixDQUFDcEQsSUFBRCxDQUE3QjtBQUNEOztBQUNELFFBQUl4RyxnQkFBRW9ILGFBQUYsQ0FBZ0JpQyxNQUFoQixDQUFKLEVBQTZCO0FBQzNCLFlBQU07QUFBRTdDLFFBQUFBLElBQUY7QUFBUXFELFFBQUFBO0FBQVIsVUFBcUJSLE1BQTNCOztBQUNBLFVBQUksQ0FBQzdDLElBQUwsRUFBVztBQUNULGNBQU0sSUFBSTdELEtBQUosQ0FBVywrQ0FBWCxDQUFOO0FBQ0Q7O0FBQ0QsVUFBSW1ILFFBQVEsR0FBR3RELElBQWY7O0FBQ0EsVUFBSXFELFFBQUosRUFBYztBQUNaQyxRQUFBQSxRQUFRLElBQUssYUFBWUQsUUFBUyxFQUFsQztBQUNEOztBQUNETixNQUFBQSxXQUFXLENBQUNRLFdBQVosR0FBMEJELFFBQTFCO0FBQ0Q7O0FBQ0QsUUFBSTlKLGdCQUFFZ0YsT0FBRixDQUFVdUUsV0FBVixDQUFKLEVBQTRCO0FBQzFCLGFBQU8sS0FBUDtBQUNEOztBQUVELFVBQU1sRyxTQUFTLEdBQUcsZ0RBQTRCa0csV0FBNUIsRUFBeUMsSUFBekMsQ0FBbEI7QUFDQSxVQUFNaEcsa0JBQUVDLEdBQUYsQ0FBTUgsU0FBUyxDQUFDSSxHQUFWLENBQWVDLElBQUQsSUFBVSxLQUFLQyxNQUFMLENBQVlDLFlBQVosQ0FBeUIsQ0FDM0QsVUFEMkQsRUFDL0MsT0FEK0MsRUFDdEMsMEJBRHNDLEVBQ1YsR0FBR0YsSUFETyxDQUF6QixDQUF4QixDQUFOLENBQU47O0FBSUEsUUFBSThGLFVBQUosRUFBZ0I7QUFDZCxZQUFNbkcsU0FBUyxHQUFHLGdEQUE0QjtBQUM1QzJHLFFBQUFBLHVCQUF1QixFQUFFLENBQUNSLFVBQUQsQ0FEbUI7QUFFNUNTLFFBQUFBLGdCQUFnQixFQUFFVCxVQUYwQjtBQUc1Q1UsUUFBQUEsMkJBQTJCLEVBQUU7QUFBRSxXQUFDWixRQUFRLENBQUM5QyxJQUFWLEdBQWlCZ0Q7QUFBbkI7QUFIZSxPQUE1QixFQUlmLElBSmUsQ0FBbEI7QUFLQSxZQUFNakcsa0JBQUVDLEdBQUYsQ0FBTUgsU0FBUyxDQUFDSSxHQUFWLENBQWVDLElBQUQsSUFBVSxLQUFLQyxNQUFMLENBQVlDLFlBQVosQ0FBeUIsQ0FDM0QsVUFEMkQsRUFDL0MsT0FEK0MsRUFDdEMsdUJBRHNDLEVBQ2IsR0FBR0YsSUFEVSxDQUF6QixDQUF4QixDQUFOLENBQU47QUFHRDs7QUFFRCxXQUFPLElBQVA7QUFDRDs7QUF0Z0IyQzs7ZUEwZ0IvQmpFLGUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2ltdWxhdG9yWGNvZGU4IGZyb20gJy4vc2ltdWxhdG9yLXhjb2RlLTgnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdG9CaW9tZXRyaWNEb21haW5Db21wb25lbnQsIGdldERldmVsb3BlclJvb3QgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IE5TVXNlckRlZmF1bHRzLCBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3MgfSBmcm9tICcuL2RlZmF1bHRzLXV0aWxzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5cbmNvbnN0IFNJTVVMQVRPUl9TSFVURE9XTl9USU1FT1VUID0gMTUgKiAxMDAwO1xuY29uc3Qgc3RhcnR1cExvY2sgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBwcmVmZXJlbmNlc1BsaXN0R3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUiA9ICdjb20uYXBwbGUuQmlvbWV0cmljS2l0LmVucm9sbG1lbnRDaGFuZ2VkJztcbmNvbnN0IERPTUFJTl9LRVlCT0FSRF9QUkVGRVJFTkNFUyA9ICdjb20uYXBwbGUua2V5Ym9hcmQucHJlZmVyZW5jZXMnO1xuXG5jbGFzcyBTaW11bGF0b3JYY29kZTkgZXh0ZW5kcyBTaW11bGF0b3JYY29kZTgge1xuICBjb25zdHJ1Y3RvciAodWRpZCwgeGNvZGVWZXJzaW9uKSB7XG4gICAgc3VwZXIodWRpZCwgeGNvZGVWZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VQcmVmZXJlbmNlc1xuICAgKiBAcHJvcGVydHkgez9udW1iZXJ9IFNpbXVsYXRvckV4dGVybmFsRGlzcGxheSAtIFRCRC4gRXhhbXBsZSB2YWx1ZTogMi4xMTRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBDaHJvbWVUaW50IC0gVEJELiBFeGFtcGxlIHZhbHVlOiAnJ1xuICAgKiBAcHJvcGVydHkgez9udW1iZXJ9IFNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSAtIFNjYWxlIHZhbHVlIGZvciB0aGUgcGFydGljdWxhciBTaW11bGF0b3Igd2luZG93LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCBtZWFucyAxMDAlIHNjYWxlLlxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IFNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uIC0gU2ltdWxhdG9yIHdpbmRvdyBvcmllbnRhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQb3J0cmFpdCcsICdMYW5kc2NhcGVMZWZ0JywgJ1BvcnRyYWl0VXBzaWRlRG93bicgYW5kICdMYW5kc2NhcGVSaWdodCcuXG4gICAqIEBwcm9wZXJ0eSB7P251bWJlcn0gU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZSAtIFdpbmRvdyByb3RhdGlvbiBhbmdsZS4gVGhpcyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBpbiBzeW5jXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggX1NpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uXy4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGFyZTpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgOTAsIDE4MCBhbmQgMjcwLlxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IFNpbXVsYXRvcldpbmRvd0NlbnRlciAtIFRoZSBjb29yZGluYXRlcyBvZiBTaW11bGF0b3IncyB3aW5kb3cgY2VudGVyIGluIHBpeGVscyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSAney0xMjk0LjUsIDc3NS41fScuXG4gICAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IENvbm5lY3RIYXJkd2FyZUtleWJvYXJkIC0gRXF1YWxzIHRvIDEgaWYgaGFyZHdhcmUga2V5Ym9hcmQgc2hvdWxkIGJlIGNvbm5lY3RlZC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgMC5cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENvbW1vblByZWZlcmVuY2VzXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gQ29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgLSBXaGV0aGVyIHRvIGNvbm5lY3QgaGFyZHdhcmUga2V5Ym9hcmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFJ1bk9wdGlvbnNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHNjYWxlRmFjdG9yOiBBbnkgcG9zaXRpdmUgZmxvYXQgdmFsdWUuIDEuMCBtZWFucyAxOjEgc2NhbGUuXG4gICAqIERlZmluZXMgdGhlIHdpbmRvdyBzY2FsZSB2YWx1ZSBmb3IgdGhlIFVJIGNsaWVudCB3aW5kb3cgZm9yIHRoZSBjdXJyZW50IFNpbXVsYXRvci5cbiAgICogRXF1YWxzIHRvIGBudWxsYCBieSBkZWZhdWx0LCB3aGljaCBrZWVwcyB0aGUgY3VycmVudCBzY2FsZSB1bmNoYW5nZWQuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQ6IHdoZXRoZXIgdG8gY29ubmVjdCB0aGUgaGFyZHdhcmUga2V5Ym9hcmQgdG8gdGhlXG4gICAqIFNpbXVsYXRvciBVSSBjbGllbnQuIEVxdWFscyB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzdGFydHVwVGltZW91dDogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIFNpbXVsYXRvciBib290aW5nXG4gICAqIHByb2Nlc3MgaXMgY29tcGxldGVkLiBUaGUgZGVmYXVsdCB0aW1lb3V0IHdpbGwgYmUgdXNlZCBpZiBub3Qgc2V0IGV4cGxpY2l0bHkuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNIZWFkbGVzczogd2hldGhlciB0byBzdGFydCB0aGUgU2ltdWxhdG9yIGluIGhlYWRsZXNzIG1vZGUgKHdpdGggVUlcbiAgICogY2xpZW50IGludmlzaWJsZSkuIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAgICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gdHJhY2VQb2ludGVyIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGhpZ2hsaWdodCB0b3VjaGVzIG9uIFNpbXVsYXRvclxuICAgKiBzY3JlZW4uIFRoaXMgaXMgaGVscGZ1bCB3aGlsZSBkZWJ1Z2dpbmcgYXV0b21hdGVkIHRlc3RzIG9yIHdoaWxlIG9ic2VydmluZyB0aGUgYXV0b21hdGlvblxuICAgKiByZWNvcmRpbmdzLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcGFzdGVib2FyZEF1dG9tYXRpY1N5bmMgWydvZmYnXSAtIFdoZXRoZXIgdG8gZGlzYWJsZSBwYXN0ZWJvYXJkIHN5bmMgd2l0aCB0aGVcbiAgICogU2ltdWxhdG9yIFVJIGNsaWVudCBvciByZXNwZWN0IHRoZSBzeXN0ZW0gd2lkZSBwcmVmZXJlbmNlLiAnb24nLCAnb2ZmJywgb3IgJ3N5c3RlbScgaXMgYXZhaWxhYmxlLlxuICAgKiBUaGUgc3luYyBpbmNyZWFzZXMgbGF1bmNoaW5nIHNpbXVsYXRvciBwcm9jZXNzIHRpbWUsIGJ1dCBpdCBhbGxvd3Mgc3lzdGVtIHRvIHN5bmMgcGFzdGVib2FyZFxuICAgKiB3aXRoIHNpbXVsYXRvcnMuIEZvbGxvd3Mgc3lzdGVtLXdpZGUgcHJlZmVyZW5jZSBpZiB0aGUgdmFsdWUgaXMgJ3N5c3RlbScuXG4gICAqIERlZmF1bHRzIHRvICdvZmYnLlxuICAgKiBAcHJvcGVydHkge0RldmljZVByZWZlcmVuY2VzfSBkZXZpY2VQcmVmZXJlbmNlczogcHJlZmVyZW5jZXMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgU2ltdWxhdG9yXG4gICAqIGRldmljZVxuICAgKi9cblxuICAvKipcbiAgICogRXhlY3V0ZXMgZ2l2ZW4gU2ltdWxhdG9yIHdpdGggb3B0aW9ucy4gVGhlIFNpbXVsYXRvciB3aWxsIG5vdCBiZSByZXN0YXJ0ZWQgaWZcbiAgICogaXQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCB0aGUgY3VycmVudCBVSSBzdGF0ZSBtYXRjaGVzIHRvIGBpc0hlYWRsZXNzYCBvcHRpb24uXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHMgLSBPbmUgb3IgbW9yZSBvZiBhdmFpbGFibGUgU2ltdWxhdG9yIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIHJ1biAob3B0cyA9IHt9KSB7XG4gICAgb3B0cyA9IF8uY2xvbmVEZWVwKG9wdHMpO1xuICAgIF8uZGVmYXVsdHNEZWVwKG9wdHMsIHtcbiAgICAgIGRldmljZVByZWZlcmVuY2VzOiB7fSxcbiAgICAgIGlzSGVhZGxlc3M6IGZhbHNlLFxuICAgICAgc3RhcnR1cFRpbWVvdXQ6IHRoaXMuc3RhcnR1cFRpbWVvdXQsXG4gICAgfSk7XG5cbiAgICBpZiAob3B0cy5zY2FsZUZhY3Rvcikge1xuICAgICAgb3B0cy5kZXZpY2VQcmVmZXJlbmNlcy5TaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUgPSBwYXJzZUZsb2F0KG9wdHMuc2NhbGVGYWN0b3IpO1xuICAgIH1cbiAgICAvLyBUaGlzIG9wdGlvbiBpcyBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgU2ltdWxhdG9yIHdpbmRvdyBmb2xsb3dcbiAgICAvLyB0aGUgYWN0dWFsIFhDVUlEZXZpY2Ugb3JpZW50YXRpb25cbiAgICBjb25zdCBjb21tb25QcmVmZXJlbmNlcyA9IHtcbiAgICAgIFJvdGF0ZVdpbmRvd1doZW5TaWduYWxlZEJ5R3Vlc3Q6IHRydWVcbiAgICB9O1xuICAgIGlmIChfLmlzQm9vbGVhbihvcHRzLmNvbm5lY3RIYXJkd2FyZUtleWJvYXJkKSB8fCBfLmlzTmlsKG9wdHMuY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQpKSB7XG4gICAgICBvcHRzLmRldmljZVByZWZlcmVuY2VzLkNvbm5lY3RIYXJkd2FyZUtleWJvYXJkID0gb3B0cy5jb25uZWN0SGFyZHdhcmVLZXlib2FyZCA/PyBmYWxzZTtcbiAgICAgIGNvbW1vblByZWZlcmVuY2VzLkNvbm5lY3RIYXJkd2FyZUtleWJvYXJkID0gb3B0cy5jb25uZWN0SGFyZHdhcmVLZXlib2FyZCA/PyBmYWxzZTtcbiAgICB9XG4gICAgaWYgKF8uaXNCb29sZWFuKG9wdHMudHJhY2VQb2ludGVyKSkge1xuICAgICAgY29tbW9uUHJlZmVyZW5jZXMuU2hvd1NpbmdsZVRvdWNoZXMgPSBvcHRzLnRyYWNlUG9pbnRlcjtcbiAgICAgIGNvbW1vblByZWZlcmVuY2VzLlNob3dQaW5jaGVzID0gb3B0cy50cmFjZVBvaW50ZXI7XG4gICAgICBjb21tb25QcmVmZXJlbmNlcy5TaG93UGluY2hQaXZvdFBvaW50ID0gb3B0cy50cmFjZVBvaW50ZXI7XG4gICAgICBjb21tb25QcmVmZXJlbmNlcy5IaWdobGlnaHRFZGdlR2VzdHVyZXMgPSBvcHRzLnRyYWNlUG9pbnRlcjtcbiAgICB9XG4gICAgc3dpdGNoIChfLmxvd2VyQ2FzZShvcHRzLnBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jKSkge1xuICAgICAgY2FzZSAnb24nOlxuICAgICAgICBjb21tb25QcmVmZXJlbmNlcy5QYXN0ZWJvYXJkQXV0b21hdGljU3luYyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgLy8gSW1wcm92ZSBsYXVuY2hpbmcgc2ltdWxhdG9yIHBlcmZvcm1hbmNlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJLaXQvd2Via2l0L2Jsb2IvbWFzdGVyL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkveGNvZGUvc2ltdWxhdGVkX2RldmljZS5weSNMNDEzXG4gICAgICAgIGNvbW1vblByZWZlcmVuY2VzLlBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3lzdGVtJzpcbiAgICAgICAgLy8gRG8gbm90IGFkZCAtUGFzdGVib2FyZEF1dG9tYXRpY1N5bmNcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cuaW5mbyhgWydvbicsICdvZmYnIG9yICdzeXN0ZW0nXSBhcmUgYXZhaWxhYmxlIGFzIHRoZSBwYXN0ZWJvYXJkIGF1dG9tYXRpYyBzeW5jIG9wdGlvbi4gRGVmYXVsdGluZyB0byAnb2ZmJ2ApO1xuICAgICAgICBjb21tb25QcmVmZXJlbmNlcy5QYXN0ZWJvYXJkQXV0b21hdGljU3luYyA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVByZWZlcmVuY2VzKG9wdHMuZGV2aWNlUHJlZmVyZW5jZXMsIGNvbW1vblByZWZlcmVuY2VzKTtcblxuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgY29uc3Qgc2hvdWxkV2FpdEZvckJvb3QgPSBhd2FpdCBzdGFydHVwTG9jay5hY3F1aXJlKHRoaXMudWlDbGllbnRCdW5kbGVJZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaXNTZXJ2ZXJSdW5uaW5nID0gYXdhaXQgdGhpcy5pc1J1bm5pbmcoKTtcbiAgICAgIGNvbnN0IHVpQ2xpZW50UGlkID0gYXdhaXQgdGhpcy5nZXRVSUNsaWVudFBpZCgpO1xuICAgICAgaWYgKG9wdHMuaXNIZWFkbGVzcykge1xuICAgICAgICBpZiAoaXNTZXJ2ZXJSdW5uaW5nICYmICF1aUNsaWVudFBpZCkge1xuICAgICAgICAgIGxvZy5pbmZvKGBTaW11bGF0b3Igd2l0aCBVRElEICcke3RoaXMudWRpZH0nIGlzIGFscmVhZHkgYm9vdGVkIGluIGhlYWRsZXNzIG1vZGUuYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmtpbGxVSUNsaWVudCh7cGlkOiB1aUNsaWVudFBpZH0pKSB7XG4gICAgICAgICAgbG9nLmluZm8oYERldGVjdGVkIHRoZSBTaW11bGF0b3IgVUkgY2xpZW50IHdhcyBydW5uaW5nIGFuZCBraWxsZWQgaXQuIFZlcmlmeWluZyB0aGUgY3VycmVudCBTaW11bGF0b3Igc3RhdGVgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFN0b3BwaW5nIHRoZSBVSSBjbGllbnQga2lsbHMgYWxsIHJ1bm5pbmcgc2VydmVycyBmb3Igc29tZSBlYXJseSBYQ29kZSB2ZXJzaW9ucy4gVGhpcyBpcyBhIGtub3duIGJ1Z1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1NodXRkb3duKCksIHtcbiAgICAgICAgICAgIHdhaXRNczogNTAwMCxcbiAgICAgICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaW11bGF0b3Igd2l0aCBVRElEICcke3RoaXMudWRpZH0nIGNhbm5vdCBiZSB0cmFuc2l0aW9uZWQgdG8gaGVhZGxlc3MgbW9kZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oYEJvb3RpbmcgU2ltdWxhdG9yIHdpdGggVURJRCAnJHt0aGlzLnVkaWR9JyBpbiBoZWFkbGVzcyBtb2RlLiBgICtcbiAgICAgICAgICBgQWxsIFVJLXJlbGF0ZWQgY2FwYWJpbGl0aWVzIGFyZSBnb2luZyB0byBiZSBpZ25vcmVkYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYm9vdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzU2VydmVyUnVubmluZyAmJiB1aUNsaWVudFBpZCkge1xuICAgICAgICAgIGxvZy5pbmZvKGBCb3RoIFNpbXVsYXRvciB3aXRoIFVESUQgJyR7dGhpcy51ZGlkfScgYW5kIHRoZSBVSSBjbGllbnQgYXJlIGN1cnJlbnRseSBydW5uaW5nYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NlcnZlclJ1bm5pbmcpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgU2ltdWxhdG9yICcke3RoaXMudWRpZH0nIGlzIGJvb3RlZCB3aGlsZSBpdHMgVUkgaXMgbm90IHZpc2libGUuIGAgK1xuICAgICAgICAgICAgYFRyeWluZyB0byByZXN0YXJ0IGl0IHdpdGggdGhlIFNpbXVsYXRvciB3aW5kb3cgdmlzaWJsZWApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2h1dGRvd24oe3RpbWVvdXQ6IFNJTVVMQVRPUl9TSFVURE9XTl9USU1FT1VUfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5sYXVuY2hXaW5kb3codWlDbGllbnRQaWQsIG9wdHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBpZiAoc2hvdWxkV2FpdEZvckJvb3QpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3Qob3B0cy5zdGFydHVwVGltZW91dCk7XG4gICAgICBsb2cuaW5mbyhgU2ltdWxhdG9yIHdpdGggVURJRCAke3RoaXMudWRpZH0gYm9vdGVkIGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc1NlY29uZHMudG9GaXhlZCgzKX1zYCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kaXNhYmxlS2V5Ym9hcmRJbnRyb2R1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGtleWJvYXJkIHR1dG9yaWFsIGFzICdjb20uYXBwbGUua2V5Ym9hcmQucHJlZmVyZW5jZXMnIGRvbWFpbiB2aWEgJ2RlZmF1bHRzJyBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgZGlzYWJsZUtleWJvYXJkSW50cm9kdWN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdDaHVua3MgPSBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3Moe1xuICAgIC8vIFRvIGRpc2FibGUgJ0RpZFNob3dDb250aW51b3VzUGF0aEludHJvZHVjdGlvbicgZm9yIGlPUyAxNSsgc2ltdWxhdG9ycyBzaW5jZSBjaGFuZ2luZyB0aGUgcHJlZmVyZW5jZSB2aWEgV0RBXG4gICAgLy8gZG9lcyBub3Qgd29yayBvbiB0aGVtLiBMb3dlciB0aGFuIHRoZSB2ZXJzaW9ucyBhbHNvIGNhbiBoYXZlIHRoaXMgcHJlZmVyZW5jZSwgYnV0IG5vdGhpbmcgaGFwcGVuLlxuICAgICAgRGlkU2hvd0NvbnRpbnVvdXNQYXRoSW50cm9kdWN0aW9uOiAxXG4gICAgfSwgdHJ1ZSk7XG4gICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdkZWZhdWx0cycsICd3cml0ZScsIERPTUFJTl9LRVlCT0FSRF9QUkVGRVJFTkNFUywgLi4uYXJnc1xuICAgIF0pKSk7XG4gIH1cblxuICAvKioqXG4gICAqIEJvb3RzIHNpbXVsYXRvciBhbmQgb3BlbnMgc2ltdWxhdG9ycyBVSSBDbGllbnQgaWYgbm90IGFscmVhZHkgb3BlbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVWlDbGllbnRSdW5uaW5nIC0gcHJvY2VzcyBpZCBvZiBzaW11bGF0b3IgVUkgY2xpZW50LlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHMgLSBhcmd1bWVudHMgdG8gc3RhcnQgc2ltdWxhdG9yIFVJIGNsaWVudCB3aXRoLlxuICAgKi9cbiAgYXN5bmMgbGF1bmNoV2luZG93IChpc1VpQ2xpZW50UnVubmluZywgb3B0cyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5ib290KCk7XG4gICAgaWYgKCFpc1VpQ2xpZW50UnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFVJQ2xpZW50KG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCb290cyBTaW11bGF0b3IgaWYgbm90IGFscmVhZHkgYm9vdGVkLlxuICAgKiBEb2VzIG5vdGhpbmcgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLlxuICAgKiBUaGlzIEFQSSBkb2VzIE5PVCB3YWl0IHVudGlsIFNpbXVsYXRvciBpcyBmdWxseSBib290ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGJvb3RpbmcgdGhlIFNpbXVsYXRvci5cbiAgICovXG4gIGFzeW5jIGJvb3QgKCkge1xuICAgIGNvbnN0IGJvb3RFdmVudHNFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnN0YXJ0Qm9vdE1vbml0b3Ioe1xuICAgICAgb25FcnJvcjogKGVycikgPT4gYm9vdEV2ZW50c0VtaXR0ZXIuZW1pdCgnZmFpbHVyZScsIGVyciksXG4gICAgICBvbkZpbmlzaGVkOiAoKSA9PiBib290RXZlbnRzRW1pdHRlci5lbWl0KCdmaW5pc2gnKSxcbiAgICAgIHNob3VsZFByZWJvb3Q6IHRydWUsXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gSGlzdG9yaWNhbGx5IHRoaXMgY2FsbCB3YXMgYWx3YXlzIGFzeW5jaHJvbm91cyxcbiAgICAgICAgLy8gZS5nLiBpdCB3YXMgbm90IHdhaXRpbmcgdW50aWwgU2ltdWxhdG9yIGlzIGZ1bGx5IGJvb3RlZC5cbiAgICAgICAgLy8gU28gd2UgcHJlc2VydmUgdGhhdCBiZWhhdmlvciwgYW5kIGlmIG5vIGVycm9ycyBhcmUgcmVjZWl2ZWQgZm9yIGEgd2hpbGVcbiAgICAgICAgLy8gdGhlbiB3ZSBhc3N1bWUgdGhlIFNpbXVsYXRvciBib290aW5nIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMDApO1xuICAgICAgICBib290RXZlbnRzRW1pdHRlci5vbmNlKCdmYWlsdXJlJywgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChfLmluY2x1ZGVzKGVycj8ubWVzc2FnZSwgJ3N0YXRlOiBCb290ZWQnKSkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBib290RXZlbnRzRW1pdHRlci5vbmNlKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBib290RXZlbnRzRW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB2ZXJpZmljYXRpb24gb2YgZGV2aWNlIHByZWZlcmVuY2VzIGNvcnJlY3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge0RldmljZVByZWZlcmVuY2VzfSBwcmVmcyBbe31dIC0gVGhlIHByZWZlcmVuY2VzIHRvIGJlIHZlcmlmaWVkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhbnkgb2YgdGhlIGdpdmVuIHByZWZlcmVuY2UgdmFsdWVzIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZFxuICAgKiBmb3JtYXQuXG4gICAqL1xuICB2ZXJpZnlEZXZpY2VQcmVmZXJlbmNlcyAocHJlZnMgPSB7fSkge1xuICAgIGlmIChfLmlzRW1wdHkocHJlZnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwcmVmcy5TaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUpIHx8IHByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSA8PSAwKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3NpdGl2ZSBmbG9hdCB2YWx1ZS4gYCArXG4gICAgICAgICAgYCcke3ByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZX0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcikpIHtcbiAgICAgIC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvMlpYT2lqLzJcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblBhdHRlcm4gPSAvey0/XFxkKyhcXC5cXGQrKT8sLT9cXGQrKFxcLlxcZCspP30vO1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcikgfHwgIXZlcmlmaWNhdGlvblBhdHRlcm4udGVzdChwcmVmcy5TaW11bGF0b3JXaW5kb3dDZW50ZXIpKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dDZW50ZXIgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggXCJ7ZmxvYXRYUG9zaXRpb24sZmxvYXRZUG9zaXRpb259XCIgZm9ybWF0ICh3aXRob3V0IHNwYWNlcykuIGAgK1xuICAgICAgICAgIGAnJHtwcmVmcy5TaW11bGF0b3JXaW5kb3dDZW50ZXJ9JyBpcyBhc3NpZ25lZCBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwcmVmcy5TaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbikpIHtcbiAgICAgIGNvbnN0IGFjY2VwdGFibGVWYWx1ZXMgPSBbJ1BvcnRyYWl0JywgJ0xhbmRzY2FwZUxlZnQnLCAnUG9ydHJhaXRVcHNpZGVEb3duJywgJ0xhbmRzY2FwZVJpZ2h0J107XG4gICAgICBpZiAoYWNjZXB0YWJsZVZhbHVlcy5pbmRleE9mKHByZWZzLlNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uKSA9PT0gLTEpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIG9uZSBvZiAke2FjY2VwdGFibGVWYWx1ZXN9LiBgICtcbiAgICAgICAgICBgJyR7cHJlZnMuU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb259JyBpcyBhc3NpZ25lZCBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwcmVmcy5TaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHByZWZzLlNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUpKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlIGlzIGV4cGVjdGVkIHRvIGJlIGEgdmFsaWQgbnVtYmVyLiBgICtcbiAgICAgICAgICBgJyR7cHJlZnMuU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZX0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY29tbW9uIGlPUyBTaW11bGF0b3IgcHJlZmVyZW5jZXMgZmlsZSB3aXRoIG5ldyB2YWx1ZXMuXG4gICAqIEl0IGlzIG5lY2Vzc2FyeSB0byByZXN0YXJ0IHRoZSBjb3JyZXNwb25kaW5nIFNpbXVsYXRvciBiZWZvcmVcbiAgICogdGhlc2UgY2hhbmdlcyBhcmUgYXBwbGllZC5cbiAgICpcbiAgICogQHBhcmFtIHtEZXZpY2VQcmVmZXJlbmNlc30gZGV2aWNlUHJlZnMgW3t9XSAtIFRoZSBtYXBwaW5nLCB3aGljaCByZXByZXNlbnRzIG5ldyBkZXZpY2UgcHJlZmVyZW5jZSB2YWx1ZXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZ2l2ZW4gU2ltdWxhdG9yLlxuICAgKiBAcGFyYW0ge0NvbW1vblByZWZlcmVuY2VzfSBjb21tb25QcmVmcyBbe31dIC0gVGhlIG1hcHBpbmcsIHdoaWNoIHJlcHJlc2VudHMgbmV3IGNvbW1vbiBwcmVmZXJlbmNlIHZhbHVlc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCBTaW11bGF0b3JzLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcmVmZXJlbmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJlZmVyZW5jZXMgKGRldmljZVByZWZzID0ge30sIGNvbW1vblByZWZzID0ge30pIHtcbiAgICBpZiAoIV8uaXNFbXB0eShkZXZpY2VQcmVmcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBwcmVmZXJlbmNlcyBvZiAke3RoaXMudWRpZH0gU2ltdWxhdG9yIHRvICR7SlNPTi5zdHJpbmdpZnkoZGV2aWNlUHJlZnMpfWApO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShjb21tb25QcmVmcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBjb21tb24gU2ltdWxhdG9yIHByZWZlcmVuY2VzIHRvICR7SlNPTi5zdHJpbmdpZnkoY29tbW9uUHJlZnMpfWApO1xuICAgIH1cbiAgICBjb25zdCBob21lRm9sZGVyUGF0aCA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyUGF0aCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCBnZXQgdGhlIHBhdGggdG8gSE9NRSBmb2xkZXIgZnJvbSB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudC4gYCArXG4gICAgICAgIGBJZ25vcmluZyBTaW11bGF0b3IgcHJlZmVyZW5jZXMgdXBkYXRlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeURldmljZVByZWZlcmVuY2VzKGRldmljZVByZWZzKTtcbiAgICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlclBhdGgsICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5pcGhvbmVzaW11bGF0b3IucGxpc3QnKTtcbiAgICByZXR1cm4gYXdhaXQgcHJlZmVyZW5jZXNQbGlzdEd1YXJkLmFjcXVpcmUoU2ltdWxhdG9yWGNvZGU5Lm5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRzID0gbmV3IE5TVXNlckRlZmF1bHRzKHBsaXN0UGF0aCk7XG4gICAgICBjb25zdCBwcmVmc1RvVXBkYXRlID0gXy5jbG9uZShjb21tb25QcmVmcyk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV8uaXNFbXB0eShkZXZpY2VQcmVmcykpIHtcbiAgICAgICAgICBsZXQgZXhpc3RpbmdEZXZpY2VQcmVmcztcbiAgICAgICAgICBjb25zdCB1ZGlkS2V5ID0gdGhpcy51ZGlkLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhwbGlzdFBhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGxpc3RDb250ZW50ID0gYXdhaXQgZGVmYXVsdHMuYXNKc29uKCk7XG4gICAgICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGN1cnJlbnRQbGlzdENvbnRlbnQuRGV2aWNlUHJlZmVyZW5jZXMpXG4gICAgICAgICAgICAgICAgJiYgXy5pc1BsYWluT2JqZWN0KGN1cnJlbnRQbGlzdENvbnRlbnQuRGV2aWNlUHJlZmVyZW5jZXNbdWRpZEtleV0pKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nRGV2aWNlUHJlZnMgPSBjdXJyZW50UGxpc3RDb250ZW50LkRldmljZVByZWZlcmVuY2VzW3VkaWRLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHByZWZzVG9VcGRhdGUsIHtcbiAgICAgICAgICAgIERldmljZVByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgICAgIFt1ZGlkS2V5XTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmdEZXZpY2VQcmVmcyB8fCB7fSwgZGV2aWNlUHJlZnMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZGVmYXVsdHMudXBkYXRlKHByZWZzVG9VcGRhdGUpO1xuICAgICAgICBsb2cuZGVidWcoYFVwZGF0ZWQgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciBwcmVmZXJlbmNlcyBhdCAnJHtwbGlzdFBhdGh9JyB3aXRoIGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHByZWZzVG9VcGRhdGUpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgdXBkYXRlICR7dGhpcy51ZGlkfSBTaW11bGF0b3IgcHJlZmVyZW5jZXMgYXQgJyR7cGxpc3RQYXRofScuIGAgK1xuICAgICAgICAgIGBUcnkgdG8gZGVsZXRlIHRoZSBmaWxlIG1hbnVhbGx5IGluIG9yZGVyIHRvIHJlc2V0IGl0LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY3VycmVudCBTaW11bGF0b3IgdG8gdGhlIGNsZWFuIHN0YXRlLlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGNsZWFuICgpIHtcbiAgICBsb2cuaW5mbyhgQ2xlYW5pbmcgc2ltdWxhdG9yICR7dGhpcy51ZGlkfWApO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLmVyYXNlRGV2aWNlKDEwMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9hY3RpdmF0ZVdpbmRvdyAoKSB7XG4gICAgbGV0IHNlbGZOYW1lO1xuICAgIGxldCBzZWxmU2RrO1xuICAgIGxldCBib290ZWREZXZpY2VzQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW3NkaywgZGV2aWNlQXJyXSBvZiBfLnRvUGFpcnMoYXdhaXQgdGhpcy5zaW1jdGwuZ2V0RGV2aWNlcygpKSkge1xuICAgICAgZm9yIChjb25zdCB7c3RhdGUsIHVkaWQsIG5hbWV9IG9mIGRldmljZUFycikge1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdCb290ZWQnKSB7XG4gICAgICAgICAgYm9vdGVkRGV2aWNlc0NvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmTmFtZSAmJiB1ZGlkID09PSB0aGlzLnVkaWQpIHtcbiAgICAgICAgICBzZWxmU2RrID0gc2RrO1xuICAgICAgICAgIHNlbGZOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYm9vdGVkRGV2aWNlc0NvdW50IDwgMikge1xuICAgICAgcmV0dXJuIGF3YWl0IHN1cGVyLl9hY3RpdmF0ZVdpbmRvdygpO1xuICAgIH1cblxuICAgIC8vIFRoZXJlIGFyZSBwb3RlbnRpYWxseSBtb3JlIHRoYXQgb25lIFNpbXVsYXRvciB3aW5kb3dcbiAgICByZXR1cm4gYFxuICAgICAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIlxuICAgICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICAgIHNldCBmcm9udG1vc3QgdG8gZmFsc2VcbiAgICAgICAgICBzZXQgZnJvbnRtb3N0IHRvIHRydWVcbiAgICAgICAgICBjbGljayAobWVudSBpdGVtIDEgd2hlcmUgKGl0cyBuYW1lIGNvbnRhaW5zIFwiJHtzZWxmTmFtZX0gXCIgYW5kIGl0cyBuYW1lIGNvbnRhaW5zIFwiJHtzZWxmU2RrfVwiKSkgb2YgbWVudSAxIG9mIG1lbnUgYmFyIGl0ZW0gXCJXaW5kb3dcIiBvZiBtZW51IGJhciAxXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBpc0Jpb21ldHJpY0Vucm9sbGVkICgpIHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLWcnLCBFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUlxuICAgIF0pO1xuICAgIGNvbnN0IG1hdGNoID0gKG5ldyBSZWdFeHAoYCR7Xy5lc2NhcGVSZWdFeHAoRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIpfVxcXFxzKyhbMDFdKWApKVxuICAgICAgLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBiaW9tZXRyaWMgZW5yb2xsbWVudCBzdGF0ZSBmcm9tICcke3N0ZG91dH0nYCk7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDdXJyZW50IGJpb21ldHJpYyBlbnJvbGxlZCBzdGF0ZSBmb3IgJHt0aGlzLnVkaWR9IFNpbXVsYXRvcjogJHttYXRjaFsxXX1gKTtcbiAgICByZXR1cm4gbWF0Y2hbMV0gPT09ICcxJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGVucm9sbEJpb21ldHJpYyAoaXNFbmFibGVkID0gdHJ1ZSkge1xuICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBiaW9tZXRyaWMgZW5yb2xsZWQgc3RhdGUgZm9yICR7dGhpcy51ZGlkfSBTaW11bGF0b3IgdG8gJyR7aXNFbmFibGVkID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ30nYCk7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdub3RpZnl1dGlsJyxcbiAgICAgICctcycsIEVOUk9MTE1FTlRfTk9USUZJQ0FUSU9OX1JFQ0VJVkVSLCBpc0VuYWJsZWQgPyAnMScgOiAnMCdcbiAgICBdKTtcbiAgICBhd2FpdCB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoW1xuICAgICAgJ25vdGlmeXV0aWwnLFxuICAgICAgJy1wJywgRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVJcbiAgICBdKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc0Jpb21ldHJpY0Vucm9sbGVkKCkgIT09IGlzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IGJpb21ldHJpYyBlbnJvbGxlZCBzdGF0ZSBmb3IgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciB0byAnJHtpc0VuYWJsZWQgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfSdgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBub3RpZmljYXRpb24gdG8gbWF0Y2gvbm90IG1hdGNoIHRoZSBwYXJ0aWN1bGFyIGJpb21ldHJpYy5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IHNob3VsZE1hdGNoIFt0cnVlXSAtIFNldCBpdCB0byB0cnVlIG9yIGZhbHNlIGluIG9yZGVyIHRvIGVtdWxhdGVcbiAgICogbWF0Y2hpbmcvbm90IG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpb21ldHJpY1xuICAgKiBAcGFyYW0gez9zdHJpbmd9IGJpb21ldHJpY05hbWUgW3RvdWNoSWRdIC0gRWl0aGVyIHRvdWNoSWQgb3IgZmFjZUlkIChmYWNlSWQgaXMgb25seSBhdmFpbGFibGUgc2luY2UgaU9TIDExKVxuICAgKi9cbiAgYXN5bmMgc2VuZEJpb21ldHJpY01hdGNoIChzaG91bGRNYXRjaCA9IHRydWUsIGJpb21ldHJpY05hbWUgPSAndG91Y2hJZCcpIHtcbiAgICBjb25zdCBkb21haW5Db21wb25lbnQgPSB0b0Jpb21ldHJpY0RvbWFpbkNvbXBvbmVudChiaW9tZXRyaWNOYW1lKTtcbiAgICBjb25zdCBkb21haW4gPSBgY29tLmFwcGxlLkJpb21ldHJpY0tpdF9TaW0uJHtkb21haW5Db21wb25lbnR9LiR7c2hvdWxkTWF0Y2ggPyAnJyA6ICdubyd9bWF0Y2hgO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLXAnLCBkb21haW5cbiAgICBdKTtcbiAgICBsb2cuaW5mbyhgU2VudCBub3RpZmljYXRpb24gJHtkb21haW59IHRvICR7c2hvdWxkTWF0Y2ggPyAnbWF0Y2gnIDogJ25vdCBtYXRjaCd9ICR7YmlvbWV0cmljTmFtZX0gYmlvbWV0cmljIGAgK1xuICAgICAgYGZvciAke3RoaXMudWRpZH0gU2ltdWxhdG9yYCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBnZXRMYXVuY2hEYWVtb25zUm9vdCAoKSB7XG4gICAgY29uc3QgZGV2Um9vdCA9IGF3YWl0IGdldERldmVsb3BlclJvb3QoKTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGRldlJvb3QsXG4gICAgICAnUGxhdGZvcm1zL2lQaG9uZU9TLnBsYXRmb3JtL0RldmVsb3Blci9MaWJyYXJ5L0NvcmVTaW11bGF0b3IvUHJvZmlsZXMvUnVudGltZXMvaU9TLnNpbXJ1bnRpbWUvQ29udGVudHMvUmVzb3VyY2VzL1J1bnRpbWVSb290L1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBLZXlib2FyZE9wdGlvbnNcbiAgICogQHByb3BlcnR5IHshc3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXlib2FyZCBsb2NhbGUsIGZvciBleGFtcGxlIGBlbl9VU2Agb3IgYGRlX0NIYFxuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IGxheW91dCBUaGUga2V5Ym9hcmQgbGF5b3V0LCBmb3IgZXhhbXBsZSBgUVVFUlRZYCBvciBgVWtyYWluaWFuYFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGhhcmR3YXJlIENvdWxkIGVpdGhlciBiZSBgQXV0b21hdGljYCBvciBgbnVsbGBcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExhbmd1YWdlT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlLCBmb3IgZXhhbXBsZSBgZGVgIG9yIGB6aC1IYW50LUNOYFxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTG9jYWxlT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBsb2NhbGUsIGZvciBleGFtcGxlIGBkZV9DSGAgb3IgYHpoX0NOYFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGNhbGVuZGFyIE9wdGlvbmFsIGNhbGVuZGFyIGZvcm1hdCwgZm9yIGV4YW1wbGUgYGdyZWdvcmlhbmAgb3IgYHBlcnNpYW5gXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2NhbGl6YXRpb25PcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7P0tleWJvYXJkT3B0aW9uc30ga2V5Ym9hcmRcbiAgICogQHByb3BlcnR5IHs/TGFuZ3VhZ2VPcHRpb25zfSBsYW5ndWFnZVxuICAgKiBAcHJvcGVydHkgez9Mb2NhbGVPcHRpb25zfSBsb2NhbGVcbiAgICovXG5cbiAgLyoqXG4gICAqIENoYW5nZSBsb2NhbGl6YXRpb24gc2V0dGluZ3Mgb24gdGhlIGN1cnJlbnRseSBib290ZWQgc2ltdWxhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7P0xvY2FsaXphdGlvbk9wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc2V0dGluZyB0aGUgcHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBhbnkgb2Ygc2V0dGluZ3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNoYW5nZWRcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUxvY2FsaXphdGlvbiAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eShvcHRzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbGFuZ3VhZ2UsIGxvY2FsZSwga2V5Ym9hcmQgfSA9IG9wdHM7XG4gICAgY29uc3QgZ2xvYmFsUHJlZnMgPSB7fTtcbiAgICBsZXQga2V5Ym9hcmRJZCA9IG51bGw7XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChrZXlib2FyZCkpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbGF5b3V0LCBoYXJkd2FyZSB9ID0ga2V5Ym9hcmQ7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2tleWJvYXJkJyBmaWVsZCBtdXN0IGhhdmUgYSB2YWxpZCBuYW1lIHNldGApO1xuICAgICAgfVxuICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2tleWJvYXJkJyBmaWVsZCBtdXN0IGhhdmUgYSB2YWxpZCBsYXlvdXQgc2V0YCk7XG4gICAgICB9XG4gICAgICBrZXlib2FyZElkID0gYCR7bmFtZX1Ac3c9JHtsYXlvdXR9YDtcbiAgICAgIGlmIChoYXJkd2FyZSkge1xuICAgICAgICBrZXlib2FyZElkICs9IGA7QGh3PSR7aGFyZHdhcmV9YDtcbiAgICAgIH1cbiAgICAgIGdsb2JhbFByZWZzLkFwcGxlS2V5Ym9hcmRzID0gW2tleWJvYXJkSWRdO1xuICAgIH1cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGxhbmd1YWdlKSkge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBsYW5ndWFnZTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnbGFuZ3VhZ2UnIGZpZWxkIG11c3QgaGF2ZSBhIHZhbGlkIG5hbWUgc2V0YCk7XG4gICAgICB9XG4gICAgICBnbG9iYWxQcmVmcy5BcHBsZUxhbmd1YWdlcyA9IFtuYW1lXTtcbiAgICB9XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChsb2NhbGUpKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNhbGVuZGFyIH0gPSBsb2NhbGU7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2xvY2FsZScgZmllbGQgbXVzdCBoYXZlIGEgdmFsaWQgbmFtZSBzZXRgKTtcbiAgICAgIH1cbiAgICAgIGxldCBsb2NhbGVJZCA9IG5hbWU7XG4gICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgbG9jYWxlSWQgKz0gYEBjYWxlbmRhcj0ke2NhbGVuZGFyfWA7XG4gICAgICB9XG4gICAgICBnbG9iYWxQcmVmcy5BcHBsZUxvY2FsZSA9IGxvY2FsZUlkO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGdsb2JhbFByZWZzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ0NodW5rcyA9IGdlbmVyYXRlRGVmYXVsdHNDb21tYW5kQXJncyhnbG9iYWxQcmVmcywgdHJ1ZSk7XG4gICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdkZWZhdWx0cycsICd3cml0ZScsICcuR2xvYmFsUHJlZmVyZW5jZXMucGxpc3QnLCAuLi5hcmdzXG4gICAgXSkpKTtcblxuICAgIGlmIChrZXlib2FyZElkKSB7XG4gICAgICBjb25zdCBhcmdDaHVua3MgPSBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3Moe1xuICAgICAgICBLZXlib2FyZHNDdXJyZW50QW5kTmV4dDogW2tleWJvYXJkSWRdLFxuICAgICAgICBLZXlib2FyZExhc3RVc2VkOiBrZXlib2FyZElkLFxuICAgICAgICBLZXlib2FyZExhc3RVc2VkRm9yTGFuZ3VhZ2U6IHsgW2tleWJvYXJkLm5hbWVdOiBrZXlib2FyZElkIH1cbiAgICAgIH0sIHRydWUpO1xuICAgICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICAgJ2RlZmF1bHRzJywgJ3dyaXRlJywgJ2NvbS5hcHBsZS5QcmVmZXJlbmNlcycsIC4uLmFyZ3NcbiAgICAgIF0pKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW11bGF0b3JYY29kZTk7XG4iXSwiZmlsZSI6ImxpYi9zaW11bGF0b3IteGNvZGUtOS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
498
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zaW11bGF0b3IteGNvZGUtOS5qcyJdLCJuYW1lcyI6WyJTSU1VTEFUT1JfU0hVVERPV05fVElNRU9VVCIsInN0YXJ0dXBMb2NrIiwiQXN5bmNMb2NrIiwicHJlZmVyZW5jZXNQbGlzdEd1YXJkIiwiRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIiLCJET01BSU5fS0VZQk9BUkRfUFJFRkVSRU5DRVMiLCJTaW11bGF0b3JYY29kZTkiLCJTaW11bGF0b3JYY29kZTgiLCJjb25zdHJ1Y3RvciIsInVkaWQiLCJ4Y29kZVZlcnNpb24iLCJydW4iLCJvcHRzIiwiXyIsImNsb25lRGVlcCIsImRlZmF1bHRzRGVlcCIsImRldmljZVByZWZlcmVuY2VzIiwiaXNIZWFkbGVzcyIsInN0YXJ0dXBUaW1lb3V0Iiwic2NhbGVGYWN0b3IiLCJTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUiLCJwYXJzZUZsb2F0IiwiY29tbW9uUHJlZmVyZW5jZXMiLCJSb3RhdGVXaW5kb3dXaGVuU2lnbmFsZWRCeUd1ZXN0IiwiU3RhcnRMYXN0RGV2aWNlT25MYXVuY2giLCJEZXRhY2hPbldpbmRvd0Nsb3NlIiwiQXR0YWNoQm9vdGVkT25TdGFydCIsImlzQm9vbGVhbiIsImNvbm5lY3RIYXJkd2FyZUtleWJvYXJkIiwiaXNOaWwiLCJDb25uZWN0SGFyZHdhcmVLZXlib2FyZCIsInRyYWNlUG9pbnRlciIsIlNob3dTaW5nbGVUb3VjaGVzIiwiU2hvd1BpbmNoZXMiLCJTaG93UGluY2hQaXZvdFBvaW50IiwiSGlnaGxpZ2h0RWRnZUdlc3R1cmVzIiwibG93ZXJDYXNlIiwicGFzdGVib2FyZEF1dG9tYXRpY1N5bmMiLCJQYXN0ZWJvYXJkQXV0b21hdGljU3luYyIsImxvZyIsImluZm8iLCJ1cGRhdGVQcmVmZXJlbmNlcyIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInNob3VsZFdhaXRGb3JCb290IiwiYWNxdWlyZSIsInVpQ2xpZW50QnVuZGxlSWQiLCJpc1NlcnZlclJ1bm5pbmciLCJpc1J1bm5pbmciLCJ1aUNsaWVudFBpZCIsImdldFVJQ2xpZW50UGlkIiwia2lsbFVJQ2xpZW50IiwicGlkIiwiaXNTaHV0ZG93biIsIndhaXRNcyIsImludGVydmFsTXMiLCJlIiwiRXJyb3IiLCJib290Iiwic2h1dGRvd24iLCJ0aW1lb3V0IiwibGF1bmNoV2luZG93Iiwid2FpdEZvckJvb3QiLCJnZXREdXJhdGlvbiIsImFzU2Vjb25kcyIsInRvRml4ZWQiLCJkaXNhYmxlS2V5Ym9hcmRJbnRyb2R1Y3Rpb24iLCJzdGFydFVJQ2xpZW50Iiwic2ltdWxhdG9yQXBwIiwicGF0aCIsInJlc29sdmUiLCJhcmdzIiwidXRpbCIsInF1b3RlIiwiZXJyIiwic3RkZXJyIiwic3Rkb3V0IiwibWVzc2FnZSIsImFyZ0NodW5rcyIsIkRpZFNob3dDb250aW51b3VzUGF0aEludHJvZHVjdGlvbiIsIkIiLCJhbGwiLCJtYXAiLCJzaW1jdGwiLCJzcGF3blByb2Nlc3MiLCJpc1VpQ2xpZW50UnVubmluZyIsImJvb3RFdmVudHNFbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwic3RhcnRCb290TW9uaXRvciIsIm9uRXJyb3IiLCJlbWl0Iiwib25GaW5pc2hlZCIsInNob3VsZFByZWJvb3QiLCJyZWplY3QiLCJzZXRUaW1lb3V0Iiwib25jZSIsImluY2x1ZGVzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwidmVyaWZ5RGV2aWNlUHJlZmVyZW5jZXMiLCJwcmVmcyIsImlzRW1wdHkiLCJpc1VuZGVmaW5lZCIsImlzTnVtYmVyIiwiZXJyb3JBbmRUaHJvdyIsIlNpbXVsYXRvcldpbmRvd0NlbnRlciIsInZlcmlmaWNhdGlvblBhdHRlcm4iLCJpc1N0cmluZyIsInRlc3QiLCJTaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbiIsImFjY2VwdGFibGVWYWx1ZXMiLCJpbmRleE9mIiwiU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZSIsImRldmljZVByZWZzIiwiY29tbW9uUHJlZnMiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJob21lRm9sZGVyUGF0aCIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwid2FybiIsInBsaXN0UGF0aCIsIm5hbWUiLCJkZWZhdWx0cyIsIk5TVXNlckRlZmF1bHRzIiwicHJlZnNUb1VwZGF0ZSIsImNsb25lIiwiZXhpc3RpbmdEZXZpY2VQcmVmcyIsInVkaWRLZXkiLCJ0b1VwcGVyQ2FzZSIsImZzIiwiZXhpc3RzIiwiY3VycmVudFBsaXN0Q29udGVudCIsImFzSnNvbiIsImlzUGxhaW5PYmplY3QiLCJEZXZpY2VQcmVmZXJlbmNlcyIsIk9iamVjdCIsImFzc2lnbiIsInVwZGF0ZSIsImNsZWFuIiwiZXJhc2VEZXZpY2UiLCJfYWN0aXZhdGVXaW5kb3ciLCJzZWxmTmFtZSIsInNlbGZTZGsiLCJib290ZWREZXZpY2VzQ291bnQiLCJzZGsiLCJkZXZpY2VBcnIiLCJ0b1BhaXJzIiwiZ2V0RGV2aWNlcyIsInN0YXRlIiwiaXNCaW9tZXRyaWNFbnJvbGxlZCIsIm1hdGNoIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwiZXhlYyIsImVucm9sbEJpb21ldHJpYyIsImlzRW5hYmxlZCIsInNlbmRCaW9tZXRyaWNNYXRjaCIsInNob3VsZE1hdGNoIiwiYmlvbWV0cmljTmFtZSIsImRvbWFpbkNvbXBvbmVudCIsImRvbWFpbiIsImdldExhdW5jaERhZW1vbnNSb290IiwiZGV2Um9vdCIsImNvbmZpZ3VyZUxvY2FsaXphdGlvbiIsImxhbmd1YWdlIiwibG9jYWxlIiwia2V5Ym9hcmQiLCJnbG9iYWxQcmVmcyIsImtleWJvYXJkSWQiLCJsYXlvdXQiLCJoYXJkd2FyZSIsIkFwcGxlS2V5Ym9hcmRzIiwiQXBwbGVMYW5ndWFnZXMiLCJjYWxlbmRhciIsImxvY2FsZUlkIiwiQXBwbGVMb2NhbGUiLCJLZXlib2FyZHNDdXJyZW50QW5kTmV4dCIsIktleWJvYXJkTGFzdFVzZWQiLCJLZXlib2FyZExhc3RVc2VkRm9yTGFuZ3VhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7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U0FBUyxHQUFHLGdEQUE0QjJGLFdBQTVCLEVBQXlDLElBQXpDLENBQWxCO0FBQ0EsVUFBTXpGLGtCQUFFQyxHQUFGLENBQU1ILFNBQVMsQ0FBQ0ksR0FBVixDQUFlWCxJQUFELElBQVUsS0FBS1ksTUFBTCxDQUFZQyxZQUFaLENBQXlCLENBQzNELFVBRDJELEVBQy9DLE9BRCtDLEVBQ3RDLDBCQURzQyxFQUNWLEdBQUdiLElBRE8sQ0FBekIsQ0FBeEIsQ0FBTixDQUFOOztBQUlBLFFBQUltRyxVQUFKLEVBQWdCO0FBQ2QsWUFBTTVGLFNBQVMsR0FBRyxnREFBNEI7QUFDNUNvRyxRQUFBQSx1QkFBdUIsRUFBRSxDQUFDUixVQUFELENBRG1CO0FBRTVDUyxRQUFBQSxnQkFBZ0IsRUFBRVQsVUFGMEI7QUFHNUNVLFFBQUFBLDJCQUEyQixFQUFFO0FBQUUsV0FBQ1osUUFBUSxDQUFDN0MsSUFBVixHQUFpQitDO0FBQW5CO0FBSGUsT0FBNUIsRUFJZixJQUplLENBQWxCO0FBS0EsWUFBTTFGLGtCQUFFQyxHQUFGLENBQU1ILFNBQVMsQ0FBQ0ksR0FBVixDQUFlWCxJQUFELElBQVUsS0FBS1ksTUFBTCxDQUFZQyxZQUFaLENBQXlCLENBQzNELFVBRDJELEVBQy9DLE9BRCtDLEVBQ3RDLHVCQURzQyxFQUNiLEdBQUdiLElBRFUsQ0FBekIsQ0FBeEIsQ0FBTixDQUFOO0FBR0Q7O0FBRUQsV0FBTyxJQUFQO0FBQ0Q7O0FBOWhCMkM7O2VBa2lCL0JuRSxlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNpbXVsYXRvclhjb2RlOCBmcm9tICcuL3NpbXVsYXRvci14Y29kZS04JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZzLCB0aW1pbmcsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHRvQmlvbWV0cmljRG9tYWluQ29tcG9uZW50LCBnZXREZXZlbG9wZXJSb290IH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBOU1VzZXJEZWZhdWx0cywgZ2VuZXJhdGVEZWZhdWx0c0NvbW1hbmRBcmdzIH0gZnJvbSAnLi9kZWZhdWx0cy11dGlscyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgZ2V0UGF0aCBhcyBnZXRYY29kZVBhdGggfSBmcm9tICdhcHBpdW0teGNvZGUnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5cbmNvbnN0IFNJTVVMQVRPUl9TSFVURE9XTl9USU1FT1VUID0gMTUgKiAxMDAwO1xuY29uc3Qgc3RhcnR1cExvY2sgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBwcmVmZXJlbmNlc1BsaXN0R3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUiA9ICdjb20uYXBwbGUuQmlvbWV0cmljS2l0LmVucm9sbG1lbnRDaGFuZ2VkJztcbmNvbnN0IERPTUFJTl9LRVlCT0FSRF9QUkVGRVJFTkNFUyA9ICdjb20uYXBwbGUua2V5Ym9hcmQucHJlZmVyZW5jZXMnO1xuXG5jbGFzcyBTaW11bGF0b3JYY29kZTkgZXh0ZW5kcyBTaW11bGF0b3JYY29kZTgge1xuICBjb25zdHJ1Y3RvciAodWRpZCwgeGNvZGVWZXJzaW9uKSB7XG4gICAgc3VwZXIodWRpZCwgeGNvZGVWZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VQcmVmZXJlbmNlc1xuICAgKiBAcHJvcGVydHkgez9udW1iZXJ9IFNpbXVsYXRvckV4dGVybmFsRGlzcGxheSAtIFRCRC4gRXhhbXBsZSB2YWx1ZTogMi4xMTRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBDaHJvbWVUaW50IC0gVEJELiBFeGFtcGxlIHZhbHVlOiAnJ1xuICAgKiBAcHJvcGVydHkgez9udW1iZXJ9IFNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSAtIFNjYWxlIHZhbHVlIGZvciB0aGUgcGFydGljdWxhciBTaW11bGF0b3Igd2luZG93LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMCBtZWFucyAxMDAlIHNjYWxlLlxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IFNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uIC0gU2ltdWxhdG9yIHdpbmRvdyBvcmllbnRhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQb3J0cmFpdCcsICdMYW5kc2NhcGVMZWZ0JywgJ1BvcnRyYWl0VXBzaWRlRG93bicgYW5kICdMYW5kc2NhcGVSaWdodCcuXG4gICAqIEBwcm9wZXJ0eSB7P251bWJlcn0gU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZSAtIFdpbmRvdyByb3RhdGlvbiBhbmdsZS4gVGhpcyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBpbiBzeW5jXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggX1NpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uXy4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGFyZTpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgOTAsIDE4MCBhbmQgMjcwLlxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IFNpbXVsYXRvcldpbmRvd0NlbnRlciAtIFRoZSBjb29yZGluYXRlcyBvZiBTaW11bGF0b3IncyB3aW5kb3cgY2VudGVyIGluIHBpeGVscyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSAney0xMjk0LjUsIDc3NS41fScuXG4gICAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IENvbm5lY3RIYXJkd2FyZUtleWJvYXJkIC0gRXF1YWxzIHRvIDEgaWYgaGFyZHdhcmUga2V5Ym9hcmQgc2hvdWxkIGJlIGNvbm5lY3RlZC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgMC5cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENvbW1vblByZWZlcmVuY2VzXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gQ29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgLSBXaGV0aGVyIHRvIGNvbm5lY3QgaGFyZHdhcmUga2V5Ym9hcmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFJ1bk9wdGlvbnNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHNjYWxlRmFjdG9yOiBBbnkgcG9zaXRpdmUgZmxvYXQgdmFsdWUuIDEuMCBtZWFucyAxOjEgc2NhbGUuXG4gICAqIERlZmluZXMgdGhlIHdpbmRvdyBzY2FsZSB2YWx1ZSBmb3IgdGhlIFVJIGNsaWVudCB3aW5kb3cgZm9yIHRoZSBjdXJyZW50IFNpbXVsYXRvci5cbiAgICogRXF1YWxzIHRvIGBudWxsYCBieSBkZWZhdWx0LCB3aGljaCBrZWVwcyB0aGUgY3VycmVudCBzY2FsZSB1bmNoYW5nZWQuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQ6IHdoZXRoZXIgdG8gY29ubmVjdCB0aGUgaGFyZHdhcmUga2V5Ym9hcmQgdG8gdGhlXG4gICAqIFNpbXVsYXRvciBVSSBjbGllbnQuIEVxdWFscyB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzdGFydHVwVGltZW91dDogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIFNpbXVsYXRvciBib290aW5nXG4gICAqIHByb2Nlc3MgaXMgY29tcGxldGVkLiBUaGUgZGVmYXVsdCB0aW1lb3V0IHdpbGwgYmUgdXNlZCBpZiBub3Qgc2V0IGV4cGxpY2l0bHkuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNIZWFkbGVzczogd2hldGhlciB0byBzdGFydCB0aGUgU2ltdWxhdG9yIGluIGhlYWRsZXNzIG1vZGUgKHdpdGggVUlcbiAgICogY2xpZW50IGludmlzaWJsZSkuIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAgICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gdHJhY2VQb2ludGVyIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGhpZ2hsaWdodCB0b3VjaGVzIG9uIFNpbXVsYXRvclxuICAgKiBzY3JlZW4uIFRoaXMgaXMgaGVscGZ1bCB3aGlsZSBkZWJ1Z2dpbmcgYXV0b21hdGVkIHRlc3RzIG9yIHdoaWxlIG9ic2VydmluZyB0aGUgYXV0b21hdGlvblxuICAgKiByZWNvcmRpbmdzLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcGFzdGVib2FyZEF1dG9tYXRpY1N5bmMgWydvZmYnXSAtIFdoZXRoZXIgdG8gZGlzYWJsZSBwYXN0ZWJvYXJkIHN5bmMgd2l0aCB0aGVcbiAgICogU2ltdWxhdG9yIFVJIGNsaWVudCBvciByZXNwZWN0IHRoZSBzeXN0ZW0gd2lkZSBwcmVmZXJlbmNlLiAnb24nLCAnb2ZmJywgb3IgJ3N5c3RlbScgaXMgYXZhaWxhYmxlLlxuICAgKiBUaGUgc3luYyBpbmNyZWFzZXMgbGF1bmNoaW5nIHNpbXVsYXRvciBwcm9jZXNzIHRpbWUsIGJ1dCBpdCBhbGxvd3Mgc3lzdGVtIHRvIHN5bmMgcGFzdGVib2FyZFxuICAgKiB3aXRoIHNpbXVsYXRvcnMuIEZvbGxvd3Mgc3lzdGVtLXdpZGUgcHJlZmVyZW5jZSBpZiB0aGUgdmFsdWUgaXMgJ3N5c3RlbScuXG4gICAqIERlZmF1bHRzIHRvICdvZmYnLlxuICAgKiBAcHJvcGVydHkge0RldmljZVByZWZlcmVuY2VzfSBkZXZpY2VQcmVmZXJlbmNlczogcHJlZmVyZW5jZXMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgU2ltdWxhdG9yXG4gICAqIGRldmljZVxuICAgKi9cblxuICAvKipcbiAgICogRXhlY3V0ZXMgZ2l2ZW4gU2ltdWxhdG9yIHdpdGggb3B0aW9ucy4gVGhlIFNpbXVsYXRvciB3aWxsIG5vdCBiZSByZXN0YXJ0ZWQgaWZcbiAgICogaXQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCB0aGUgY3VycmVudCBVSSBzdGF0ZSBtYXRjaGVzIHRvIGBpc0hlYWRsZXNzYCBvcHRpb24uXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHMgLSBPbmUgb3IgbW9yZSBvZiBhdmFpbGFibGUgU2ltdWxhdG9yIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIHJ1biAob3B0cyA9IHt9KSB7XG4gICAgb3B0cyA9IF8uY2xvbmVEZWVwKG9wdHMpO1xuICAgIF8uZGVmYXVsdHNEZWVwKG9wdHMsIHtcbiAgICAgIGRldmljZVByZWZlcmVuY2VzOiB7fSxcbiAgICAgIGlzSGVhZGxlc3M6IGZhbHNlLFxuICAgICAgc3RhcnR1cFRpbWVvdXQ6IHRoaXMuc3RhcnR1cFRpbWVvdXQsXG4gICAgfSk7XG5cbiAgICBpZiAob3B0cy5zY2FsZUZhY3Rvcikge1xuICAgICAgb3B0cy5kZXZpY2VQcmVmZXJlbmNlcy5TaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUgPSBwYXJzZUZsb2F0KG9wdHMuc2NhbGVGYWN0b3IpO1xuICAgIH1cbiAgICBjb25zdCBjb21tb25QcmVmZXJlbmNlcyA9IHtcbiAgICAgIC8vIFRoaXMgb3B0aW9uIGlzIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBTaW11bGF0b3Igd2luZG93IGZvbGxvd1xuICAgICAgLy8gdGhlIGFjdHVhbCBYQ1VJRGV2aWNlIG9yaWVudGF0aW9uXG4gICAgICBSb3RhdGVXaW5kb3dXaGVuU2lnbmFsZWRCeUd1ZXN0OiB0cnVlLFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE2NDE4XG4gICAgICBTdGFydExhc3REZXZpY2VPbkxhdW5jaDogZmFsc2UsXG4gICAgICBEZXRhY2hPbldpbmRvd0Nsb3NlOiBmYWxzZSxcbiAgICAgIEF0dGFjaEJvb3RlZE9uU3RhcnQ6IHRydWUsXG4gICAgfTtcbiAgICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jb25uZWN0SGFyZHdhcmVLZXlib2FyZCkgfHwgXy5pc05pbChvcHRzLmNvbm5lY3RIYXJkd2FyZUtleWJvYXJkKSkge1xuICAgICAgb3B0cy5kZXZpY2VQcmVmZXJlbmNlcy5Db25uZWN0SGFyZHdhcmVLZXlib2FyZCA9IG9wdHMuY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgPz8gZmFsc2U7XG4gICAgICBjb21tb25QcmVmZXJlbmNlcy5Db25uZWN0SGFyZHdhcmVLZXlib2FyZCA9IG9wdHMuY29ubmVjdEhhcmR3YXJlS2V5Ym9hcmQgPz8gZmFsc2U7XG4gICAgfVxuICAgIGlmIChfLmlzQm9vbGVhbihvcHRzLnRyYWNlUG9pbnRlcikpIHtcbiAgICAgIGNvbW1vblByZWZlcmVuY2VzLlNob3dTaW5nbGVUb3VjaGVzID0gb3B0cy50cmFjZVBvaW50ZXI7XG4gICAgICBjb21tb25QcmVmZXJlbmNlcy5TaG93UGluY2hlcyA9IG9wdHMudHJhY2VQb2ludGVyO1xuICAgICAgY29tbW9uUHJlZmVyZW5jZXMuU2hvd1BpbmNoUGl2b3RQb2ludCA9IG9wdHMudHJhY2VQb2ludGVyO1xuICAgICAgY29tbW9uUHJlZmVyZW5jZXMuSGlnaGxpZ2h0RWRnZUdlc3R1cmVzID0gb3B0cy50cmFjZVBvaW50ZXI7XG4gICAgfVxuICAgIHN3aXRjaCAoXy5sb3dlckNhc2Uob3B0cy5wYXN0ZWJvYXJkQXV0b21hdGljU3luYykpIHtcbiAgICAgIGNhc2UgJ29uJzpcbiAgICAgICAgY29tbW9uUHJlZmVyZW5jZXMuUGFzdGVib2FyZEF1dG9tYXRpY1N5bmMgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29mZic6XG4gICAgICAgIC8vIEltcHJvdmUgbGF1bmNoaW5nIHNpbXVsYXRvciBwZXJmb3JtYW5jZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vV2ViS2l0L3dlYmtpdC9ibG9iL21hc3Rlci9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3hjb2RlL3NpbXVsYXRlZF9kZXZpY2UucHkjTDQxM1xuICAgICAgICBjb21tb25QcmVmZXJlbmNlcy5QYXN0ZWJvYXJkQXV0b21hdGljU3luYyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N5c3RlbSc6XG4gICAgICAgIC8vIERvIG5vdCBhZGQgLVBhc3RlYm9hcmRBdXRvbWF0aWNTeW5jXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLmluZm8oYFsnb24nLCAnb2ZmJyBvciAnc3lzdGVtJ10gYXJlIGF2YWlsYWJsZSBhcyB0aGUgcGFzdGVib2FyZCBhdXRvbWF0aWMgc3luYyBvcHRpb24uIERlZmF1bHRpbmcgdG8gJ29mZidgKTtcbiAgICAgICAgY29tbW9uUHJlZmVyZW5jZXMuUGFzdGVib2FyZEF1dG9tYXRpY1N5bmMgPSBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy51cGRhdGVQcmVmZXJlbmNlcyhvcHRzLmRldmljZVByZWZlcmVuY2VzLCBjb21tb25QcmVmZXJlbmNlcyk7XG5cbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGNvbnN0IHNob3VsZFdhaXRGb3JCb290ID0gYXdhaXQgc3RhcnR1cExvY2suYWNxdWlyZSh0aGlzLnVpQ2xpZW50QnVuZGxlSWQsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGlzU2VydmVyUnVubmluZyA9IGF3YWl0IHRoaXMuaXNSdW5uaW5nKCk7XG4gICAgICBjb25zdCB1aUNsaWVudFBpZCA9IGF3YWl0IHRoaXMuZ2V0VUlDbGllbnRQaWQoKTtcbiAgICAgIGlmIChvcHRzLmlzSGVhZGxlc3MpIHtcbiAgICAgICAgaWYgKGlzU2VydmVyUnVubmluZyAmJiAhdWlDbGllbnRQaWQpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgU2ltdWxhdG9yIHdpdGggVURJRCAnJHt0aGlzLnVkaWR9JyBpcyBhbHJlYWR5IGJvb3RlZCBpbiBoZWFkbGVzcyBtb2RlLmApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5raWxsVUlDbGllbnQoe3BpZDogdWlDbGllbnRQaWR9KSkge1xuICAgICAgICAgIGxvZy5pbmZvKGBEZXRlY3RlZCB0aGUgU2ltdWxhdG9yIFVJIGNsaWVudCB3YXMgcnVubmluZyBhbmQga2lsbGVkIGl0LiBWZXJpZnlpbmcgdGhlIGN1cnJlbnQgU2ltdWxhdG9yIHN0YXRlYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTdG9wcGluZyB0aGUgVUkgY2xpZW50IGtpbGxzIGFsbCBydW5uaW5nIHNlcnZlcnMgZm9yIHNvbWUgZWFybHkgWENvZGUgdmVyc2lvbnMuIFRoaXMgaXMgYSBrbm93biBidWdcbiAgICAgICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTaHV0ZG93bigpLCB7XG4gICAgICAgICAgICB3YWl0TXM6IDUwMDAsXG4gICAgICAgICAgICBpbnRlcnZhbE1zOiAxMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2ltdWxhdG9yIHdpdGggVURJRCAnJHt0aGlzLnVkaWR9JyBjYW5ub3QgYmUgdHJhbnNpdGlvbmVkIHRvIGhlYWRsZXNzIG1vZGVgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKGBCb290aW5nIFNpbXVsYXRvciB3aXRoIFVESUQgJyR7dGhpcy51ZGlkfScgaW4gaGVhZGxlc3MgbW9kZS4gYCArXG4gICAgICAgICAgYEFsbCBVSS1yZWxhdGVkIGNhcGFiaWxpdGllcyBhcmUgZ29pbmcgdG8gYmUgaWdub3JlZGApO1xuICAgICAgICBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1NlcnZlclJ1bm5pbmcgJiYgdWlDbGllbnRQaWQpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgQm90aCBTaW11bGF0b3Igd2l0aCBVRElEICcke3RoaXMudWRpZH0nIGFuZCB0aGUgVUkgY2xpZW50IGFyZSBjdXJyZW50bHkgcnVubmluZ2ApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTZXJ2ZXJSdW5uaW5nKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNpbXVsYXRvciAnJHt0aGlzLnVkaWR9JyBpcyBib290ZWQgd2hpbGUgaXRzIFVJIGlzIG5vdCB2aXNpYmxlLiBgICtcbiAgICAgICAgICAgIGBUcnlpbmcgdG8gcmVzdGFydCBpdCB3aXRoIHRoZSBTaW11bGF0b3Igd2luZG93IHZpc2libGVgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNodXRkb3duKHt0aW1lb3V0OiBTSU1VTEFUT1JfU0hVVERPV05fVElNRU9VVH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMubGF1bmNoV2luZG93KHVpQ2xpZW50UGlkLCBvcHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKHNob3VsZFdhaXRGb3JCb290KSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KG9wdHMuc3RhcnR1cFRpbWVvdXQpO1xuICAgICAgbG9nLmluZm8oYFNpbXVsYXRvciB3aXRoIFVESUQgJHt0aGlzLnVkaWR9IGJvb3RlZCBpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNTZWNvbmRzLnRvRml4ZWQoMyl9c2ApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZGlzYWJsZUtleWJvYXJkSW50cm9kdWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBzdGFydFVJQ2xpZW50IChvcHRzID0ge30pIHtcbiAgICBvcHRzID0gXy5jbG9uZURlZXAob3B0cyk7XG4gICAgXy5kZWZhdWx0c0RlZXAob3B0cywge1xuICAgICAgc3RhcnR1cFRpbWVvdXQ6IHRoaXMuc3RhcnR1cFRpbWVvdXQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaW11bGF0b3JBcHAgPSBwYXRoLnJlc29sdmUoYXdhaXQgZ2V0WGNvZGVQYXRoKCksICdBcHBsaWNhdGlvbnMnLCB0aGlzLnNpbXVsYXRvckFwcCk7XG4gICAgY29uc3QgYXJncyA9IFsnLUZuJywgc2ltdWxhdG9yQXBwXTtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgU2ltdWxhdG9yIFVJOiAke3V0aWwucXVvdGUoWydvcGVuJywgLi4uYXJnc10pfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdvcGVuJywgYXJncywge3RpbWVvdXQ6IG9wdHMuc3RhcnR1cFRpbWVvdXR9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR290IGFuIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgb3BlbmluZyBTaW11bGF0b3IgVUk6IGAgK1xuICAgICAgICBlcnIuc3RkZXJyIHx8IGVyci5zdGRvdXQgfHwgZXJyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGtleWJvYXJkIHR1dG9yaWFsIGFzICdjb20uYXBwbGUua2V5Ym9hcmQucHJlZmVyZW5jZXMnIGRvbWFpbiB2aWEgJ2RlZmF1bHRzJyBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgZGlzYWJsZUtleWJvYXJkSW50cm9kdWN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdDaHVua3MgPSBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3Moe1xuICAgIC8vIFRvIGRpc2FibGUgJ0RpZFNob3dDb250aW51b3VzUGF0aEludHJvZHVjdGlvbicgZm9yIGlPUyAxNSsgc2ltdWxhdG9ycyBzaW5jZSBjaGFuZ2luZyB0aGUgcHJlZmVyZW5jZSB2aWEgV0RBXG4gICAgLy8gZG9lcyBub3Qgd29yayBvbiB0aGVtLiBMb3dlciB0aGFuIHRoZSB2ZXJzaW9ucyBhbHNvIGNhbiBoYXZlIHRoaXMgcHJlZmVyZW5jZSwgYnV0IG5vdGhpbmcgaGFwcGVuLlxuICAgICAgRGlkU2hvd0NvbnRpbnVvdXNQYXRoSW50cm9kdWN0aW9uOiAxXG4gICAgfSwgdHJ1ZSk7XG4gICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdkZWZhdWx0cycsICd3cml0ZScsIERPTUFJTl9LRVlCT0FSRF9QUkVGRVJFTkNFUywgLi4uYXJnc1xuICAgIF0pKSk7XG4gIH1cblxuICAvKioqXG4gICAqIEJvb3RzIHNpbXVsYXRvciBhbmQgb3BlbnMgc2ltdWxhdG9ycyBVSSBDbGllbnQgaWYgbm90IGFscmVhZHkgb3BlbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVWlDbGllbnRSdW5uaW5nIC0gcHJvY2VzcyBpZCBvZiBzaW11bGF0b3IgVUkgY2xpZW50LlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHMgLSBhcmd1bWVudHMgdG8gc3RhcnQgc2ltdWxhdG9yIFVJIGNsaWVudCB3aXRoLlxuICAgKi9cbiAgYXN5bmMgbGF1bmNoV2luZG93IChpc1VpQ2xpZW50UnVubmluZywgb3B0cyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5ib290KCk7XG4gICAgaWYgKCFpc1VpQ2xpZW50UnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFVJQ2xpZW50KG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCb290cyBTaW11bGF0b3IgaWYgbm90IGFscmVhZHkgYm9vdGVkLlxuICAgKiBEb2VzIG5vdGhpbmcgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLlxuICAgKiBUaGlzIEFQSSBkb2VzIE5PVCB3YWl0IHVudGlsIFNpbXVsYXRvciBpcyBmdWxseSBib290ZWQuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGJvb3RpbmcgdGhlIFNpbXVsYXRvci5cbiAgICovXG4gIGFzeW5jIGJvb3QgKCkge1xuICAgIGNvbnN0IGJvb3RFdmVudHNFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnN0YXJ0Qm9vdE1vbml0b3Ioe1xuICAgICAgb25FcnJvcjogKGVycikgPT4gYm9vdEV2ZW50c0VtaXR0ZXIuZW1pdCgnZmFpbHVyZScsIGVyciksXG4gICAgICBvbkZpbmlzaGVkOiAoKSA9PiBib290RXZlbnRzRW1pdHRlci5lbWl0KCdmaW5pc2gnKSxcbiAgICAgIHNob3VsZFByZWJvb3Q6IHRydWUsXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gSGlzdG9yaWNhbGx5IHRoaXMgY2FsbCB3YXMgYWx3YXlzIGFzeW5jaHJvbm91cyxcbiAgICAgICAgLy8gZS5nLiBpdCB3YXMgbm90IHdhaXRpbmcgdW50aWwgU2ltdWxhdG9yIGlzIGZ1bGx5IGJvb3RlZC5cbiAgICAgICAgLy8gU28gd2UgcHJlc2VydmUgdGhhdCBiZWhhdmlvciwgYW5kIGlmIG5vIGVycm9ycyBhcmUgcmVjZWl2ZWQgZm9yIGEgd2hpbGVcbiAgICAgICAgLy8gdGhlbiB3ZSBhc3N1bWUgdGhlIFNpbXVsYXRvciBib290aW5nIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMDApO1xuICAgICAgICBib290RXZlbnRzRW1pdHRlci5vbmNlKCdmYWlsdXJlJywgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChfLmluY2x1ZGVzKGVycj8ubWVzc2FnZSwgJ3N0YXRlOiBCb290ZWQnKSkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBib290RXZlbnRzRW1pdHRlci5vbmNlKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBib290RXZlbnRzRW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB2ZXJpZmljYXRpb24gb2YgZGV2aWNlIHByZWZlcmVuY2VzIGNvcnJlY3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge0RldmljZVByZWZlcmVuY2VzfSBwcmVmcyBbe31dIC0gVGhlIHByZWZlcmVuY2VzIHRvIGJlIHZlcmlmaWVkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhbnkgb2YgdGhlIGdpdmVuIHByZWZlcmVuY2UgdmFsdWVzIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZFxuICAgKiBmb3JtYXQuXG4gICAqL1xuICB2ZXJpZnlEZXZpY2VQcmVmZXJlbmNlcyAocHJlZnMgPSB7fSkge1xuICAgIGlmIChfLmlzRW1wdHkocHJlZnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwcmVmcy5TaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUpIHx8IHByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZSA8PSAwKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dMYXN0U2NhbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3NpdGl2ZSBmbG9hdCB2YWx1ZS4gYCArXG4gICAgICAgICAgYCcke3ByZWZzLlNpbXVsYXRvcldpbmRvd0xhc3RTY2FsZX0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcikpIHtcbiAgICAgIC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvMlpYT2lqLzJcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblBhdHRlcm4gPSAvey0/XFxkKyhcXC5cXGQrKT8sLT9cXGQrKFxcLlxcZCspP30vO1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHByZWZzLlNpbXVsYXRvcldpbmRvd0NlbnRlcikgfHwgIXZlcmlmaWNhdGlvblBhdHRlcm4udGVzdChwcmVmcy5TaW11bGF0b3JXaW5kb3dDZW50ZXIpKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dDZW50ZXIgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggXCJ7ZmxvYXRYUG9zaXRpb24sZmxvYXRZUG9zaXRpb259XCIgZm9ybWF0ICh3aXRob3V0IHNwYWNlcykuIGAgK1xuICAgICAgICAgIGAnJHtwcmVmcy5TaW11bGF0b3JXaW5kb3dDZW50ZXJ9JyBpcyBhc3NpZ25lZCBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwcmVmcy5TaW11bGF0b3JXaW5kb3dPcmllbnRhdGlvbikpIHtcbiAgICAgIGNvbnN0IGFjY2VwdGFibGVWYWx1ZXMgPSBbJ1BvcnRyYWl0JywgJ0xhbmRzY2FwZUxlZnQnLCAnUG9ydHJhaXRVcHNpZGVEb3duJywgJ0xhbmRzY2FwZVJpZ2h0J107XG4gICAgICBpZiAoYWNjZXB0YWJsZVZhbHVlcy5pbmRleE9mKHByZWZzLlNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uKSA9PT0gLTEpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFNpbXVsYXRvcldpbmRvd09yaWVudGF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIG9uZSBvZiAke2FjY2VwdGFibGVWYWx1ZXN9LiBgICtcbiAgICAgICAgICBgJyR7cHJlZnMuU2ltdWxhdG9yV2luZG93T3JpZW50YXRpb259JyBpcyBhc3NpZ25lZCBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwcmVmcy5TaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHByZWZzLlNpbXVsYXRvcldpbmRvd1JvdGF0aW9uQW5nbGUpKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBTaW11bGF0b3JXaW5kb3dSb3RhdGlvbkFuZ2xlIGlzIGV4cGVjdGVkIHRvIGJlIGEgdmFsaWQgbnVtYmVyLiBgICtcbiAgICAgICAgICBgJyR7cHJlZnMuU2ltdWxhdG9yV2luZG93Um90YXRpb25BbmdsZX0nIGlzIGFzc2lnbmVkIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY29tbW9uIGlPUyBTaW11bGF0b3IgcHJlZmVyZW5jZXMgZmlsZSB3aXRoIG5ldyB2YWx1ZXMuXG4gICAqIEl0IGlzIG5lY2Vzc2FyeSB0byByZXN0YXJ0IHRoZSBjb3JyZXNwb25kaW5nIFNpbXVsYXRvciBiZWZvcmVcbiAgICogdGhlc2UgY2hhbmdlcyBhcmUgYXBwbGllZC5cbiAgICpcbiAgICogQHBhcmFtIHtEZXZpY2VQcmVmZXJlbmNlc30gZGV2aWNlUHJlZnMgW3t9XSAtIFRoZSBtYXBwaW5nLCB3aGljaCByZXByZXNlbnRzIG5ldyBkZXZpY2UgcHJlZmVyZW5jZSB2YWx1ZXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZ2l2ZW4gU2ltdWxhdG9yLlxuICAgKiBAcGFyYW0ge0NvbW1vblByZWZlcmVuY2VzfSBjb21tb25QcmVmcyBbe31dIC0gVGhlIG1hcHBpbmcsIHdoaWNoIHJlcHJlc2VudHMgbmV3IGNvbW1vbiBwcmVmZXJlbmNlIHZhbHVlc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCBTaW11bGF0b3JzLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcmVmZXJlbmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJlZmVyZW5jZXMgKGRldmljZVByZWZzID0ge30sIGNvbW1vblByZWZzID0ge30pIHtcbiAgICBpZiAoIV8uaXNFbXB0eShkZXZpY2VQcmVmcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBwcmVmZXJlbmNlcyBvZiAke3RoaXMudWRpZH0gU2ltdWxhdG9yIHRvICR7SlNPTi5zdHJpbmdpZnkoZGV2aWNlUHJlZnMpfWApO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShjb21tb25QcmVmcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBjb21tb24gU2ltdWxhdG9yIHByZWZlcmVuY2VzIHRvICR7SlNPTi5zdHJpbmdpZnkoY29tbW9uUHJlZnMpfWApO1xuICAgIH1cbiAgICBjb25zdCBob21lRm9sZGVyUGF0aCA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyUGF0aCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCBnZXQgdGhlIHBhdGggdG8gSE9NRSBmb2xkZXIgZnJvbSB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudC4gYCArXG4gICAgICAgIGBJZ25vcmluZyBTaW11bGF0b3IgcHJlZmVyZW5jZXMgdXBkYXRlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeURldmljZVByZWZlcmVuY2VzKGRldmljZVByZWZzKTtcbiAgICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaG9tZUZvbGRlclBhdGgsICdMaWJyYXJ5JywgJ1ByZWZlcmVuY2VzJywgJ2NvbS5hcHBsZS5pcGhvbmVzaW11bGF0b3IucGxpc3QnKTtcbiAgICByZXR1cm4gYXdhaXQgcHJlZmVyZW5jZXNQbGlzdEd1YXJkLmFjcXVpcmUoU2ltdWxhdG9yWGNvZGU5Lm5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRzID0gbmV3IE5TVXNlckRlZmF1bHRzKHBsaXN0UGF0aCk7XG4gICAgICBjb25zdCBwcmVmc1RvVXBkYXRlID0gXy5jbG9uZShjb21tb25QcmVmcyk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV8uaXNFbXB0eShkZXZpY2VQcmVmcykpIHtcbiAgICAgICAgICBsZXQgZXhpc3RpbmdEZXZpY2VQcmVmcztcbiAgICAgICAgICBjb25zdCB1ZGlkS2V5ID0gdGhpcy51ZGlkLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhwbGlzdFBhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGxpc3RDb250ZW50ID0gYXdhaXQgZGVmYXVsdHMuYXNKc29uKCk7XG4gICAgICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGN1cnJlbnRQbGlzdENvbnRlbnQuRGV2aWNlUHJlZmVyZW5jZXMpXG4gICAgICAgICAgICAgICAgJiYgXy5pc1BsYWluT2JqZWN0KGN1cnJlbnRQbGlzdENvbnRlbnQuRGV2aWNlUHJlZmVyZW5jZXNbdWRpZEtleV0pKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nRGV2aWNlUHJlZnMgPSBjdXJyZW50UGxpc3RDb250ZW50LkRldmljZVByZWZlcmVuY2VzW3VkaWRLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHByZWZzVG9VcGRhdGUsIHtcbiAgICAgICAgICAgIERldmljZVByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgICAgIFt1ZGlkS2V5XTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmdEZXZpY2VQcmVmcyB8fCB7fSwgZGV2aWNlUHJlZnMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZGVmYXVsdHMudXBkYXRlKHByZWZzVG9VcGRhdGUpO1xuICAgICAgICBsb2cuZGVidWcoYFVwZGF0ZWQgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciBwcmVmZXJlbmNlcyBhdCAnJHtwbGlzdFBhdGh9JyB3aXRoIGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHByZWZzVG9VcGRhdGUpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgdXBkYXRlICR7dGhpcy51ZGlkfSBTaW11bGF0b3IgcHJlZmVyZW5jZXMgYXQgJyR7cGxpc3RQYXRofScuIGAgK1xuICAgICAgICAgIGBUcnkgdG8gZGVsZXRlIHRoZSBmaWxlIG1hbnVhbGx5IGluIG9yZGVyIHRvIHJlc2V0IGl0LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY3VycmVudCBTaW11bGF0b3IgdG8gdGhlIGNsZWFuIHN0YXRlLlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGNsZWFuICgpIHtcbiAgICBsb2cuaW5mbyhgQ2xlYW5pbmcgc2ltdWxhdG9yICR7dGhpcy51ZGlkfWApO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLmVyYXNlRGV2aWNlKDEwMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIF9hY3RpdmF0ZVdpbmRvdyAoKSB7XG4gICAgbGV0IHNlbGZOYW1lO1xuICAgIGxldCBzZWxmU2RrO1xuICAgIGxldCBib290ZWREZXZpY2VzQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW3NkaywgZGV2aWNlQXJyXSBvZiBfLnRvUGFpcnMoYXdhaXQgdGhpcy5zaW1jdGwuZ2V0RGV2aWNlcygpKSkge1xuICAgICAgZm9yIChjb25zdCB7c3RhdGUsIHVkaWQsIG5hbWV9IG9mIGRldmljZUFycikge1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdCb290ZWQnKSB7XG4gICAgICAgICAgYm9vdGVkRGV2aWNlc0NvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmTmFtZSAmJiB1ZGlkID09PSB0aGlzLnVkaWQpIHtcbiAgICAgICAgICBzZWxmU2RrID0gc2RrO1xuICAgICAgICAgIHNlbGZOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYm9vdGVkRGV2aWNlc0NvdW50IDwgMikge1xuICAgICAgcmV0dXJuIGF3YWl0IHN1cGVyLl9hY3RpdmF0ZVdpbmRvdygpO1xuICAgIH1cblxuICAgIC8vIFRoZXJlIGFyZSBwb3RlbnRpYWxseSBtb3JlIHRoYXQgb25lIFNpbXVsYXRvciB3aW5kb3dcbiAgICByZXR1cm4gYFxuICAgICAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIlxuICAgICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICAgIHNldCBmcm9udG1vc3QgdG8gZmFsc2VcbiAgICAgICAgICBzZXQgZnJvbnRtb3N0IHRvIHRydWVcbiAgICAgICAgICBjbGljayAobWVudSBpdGVtIDEgd2hlcmUgKGl0cyBuYW1lIGNvbnRhaW5zIFwiJHtzZWxmTmFtZX0gXCIgYW5kIGl0cyBuYW1lIGNvbnRhaW5zIFwiJHtzZWxmU2RrfVwiKSkgb2YgbWVudSAxIG9mIG1lbnUgYmFyIGl0ZW0gXCJXaW5kb3dcIiBvZiBtZW51IGJhciAxXG4gICAgICAgIGVuZCB0ZWxsXG4gICAgICBlbmQgdGVsbFxuICAgIGA7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBpc0Jpb21ldHJpY0Vucm9sbGVkICgpIHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLWcnLCBFTlJPTExNRU5UX05PVElGSUNBVElPTl9SRUNFSVZFUlxuICAgIF0pO1xuICAgIGNvbnN0IG1hdGNoID0gKG5ldyBSZWdFeHAoYCR7Xy5lc2NhcGVSZWdFeHAoRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVIpfVxcXFxzKyhbMDFdKWApKVxuICAgICAgLmV4ZWMoc3Rkb3V0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBiaW9tZXRyaWMgZW5yb2xsbWVudCBzdGF0ZSBmcm9tICcke3N0ZG91dH0nYCk7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDdXJyZW50IGJpb21ldHJpYyBlbnJvbGxlZCBzdGF0ZSBmb3IgJHt0aGlzLnVkaWR9IFNpbXVsYXRvcjogJHttYXRjaFsxXX1gKTtcbiAgICByZXR1cm4gbWF0Y2hbMV0gPT09ICcxJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIGFzeW5jIGVucm9sbEJpb21ldHJpYyAoaXNFbmFibGVkID0gdHJ1ZSkge1xuICAgIGxvZy5kZWJ1ZyhgU2V0dGluZyBiaW9tZXRyaWMgZW5yb2xsZWQgc3RhdGUgZm9yICR7dGhpcy51ZGlkfSBTaW11bGF0b3IgdG8gJyR7aXNFbmFibGVkID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ30nYCk7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdub3RpZnl1dGlsJyxcbiAgICAgICctcycsIEVOUk9MTE1FTlRfTk9USUZJQ0FUSU9OX1JFQ0VJVkVSLCBpc0VuYWJsZWQgPyAnMScgOiAnMCdcbiAgICBdKTtcbiAgICBhd2FpdCB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoW1xuICAgICAgJ25vdGlmeXV0aWwnLFxuICAgICAgJy1wJywgRU5ST0xMTUVOVF9OT1RJRklDQVRJT05fUkVDRUlWRVJcbiAgICBdKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc0Jpb21ldHJpY0Vucm9sbGVkKCkgIT09IGlzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IGJpb21ldHJpYyBlbnJvbGxlZCBzdGF0ZSBmb3IgJHt0aGlzLnVkaWR9IFNpbXVsYXRvciB0byAnJHtpc0VuYWJsZWQgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfSdgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBub3RpZmljYXRpb24gdG8gbWF0Y2gvbm90IG1hdGNoIHRoZSBwYXJ0aWN1bGFyIGJpb21ldHJpYy5cbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IHNob3VsZE1hdGNoIFt0cnVlXSAtIFNldCBpdCB0byB0cnVlIG9yIGZhbHNlIGluIG9yZGVyIHRvIGVtdWxhdGVcbiAgICogbWF0Y2hpbmcvbm90IG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpb21ldHJpY1xuICAgKiBAcGFyYW0gez9zdHJpbmd9IGJpb21ldHJpY05hbWUgW3RvdWNoSWRdIC0gRWl0aGVyIHRvdWNoSWQgb3IgZmFjZUlkIChmYWNlSWQgaXMgb25seSBhdmFpbGFibGUgc2luY2UgaU9TIDExKVxuICAgKi9cbiAgYXN5bmMgc2VuZEJpb21ldHJpY01hdGNoIChzaG91bGRNYXRjaCA9IHRydWUsIGJpb21ldHJpY05hbWUgPSAndG91Y2hJZCcpIHtcbiAgICBjb25zdCBkb21haW5Db21wb25lbnQgPSB0b0Jpb21ldHJpY0RvbWFpbkNvbXBvbmVudChiaW9tZXRyaWNOYW1lKTtcbiAgICBjb25zdCBkb21haW4gPSBgY29tLmFwcGxlLkJpb21ldHJpY0tpdF9TaW0uJHtkb21haW5Db21wb25lbnR9LiR7c2hvdWxkTWF0Y2ggPyAnJyA6ICdubyd9bWF0Y2hgO1xuICAgIGF3YWl0IHRoaXMuc2ltY3RsLnNwYXduUHJvY2VzcyhbXG4gICAgICAnbm90aWZ5dXRpbCcsXG4gICAgICAnLXAnLCBkb21haW5cbiAgICBdKTtcbiAgICBsb2cuaW5mbyhgU2VudCBub3RpZmljYXRpb24gJHtkb21haW59IHRvICR7c2hvdWxkTWF0Y2ggPyAnbWF0Y2gnIDogJ25vdCBtYXRjaCd9ICR7YmlvbWV0cmljTmFtZX0gYmlvbWV0cmljIGAgK1xuICAgICAgYGZvciAke3RoaXMudWRpZH0gU2ltdWxhdG9yYCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBhc3luYyBnZXRMYXVuY2hEYWVtb25zUm9vdCAoKSB7XG4gICAgY29uc3QgZGV2Um9vdCA9IGF3YWl0IGdldERldmVsb3BlclJvb3QoKTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGRldlJvb3QsXG4gICAgICAnUGxhdGZvcm1zL2lQaG9uZU9TLnBsYXRmb3JtL0RldmVsb3Blci9MaWJyYXJ5L0NvcmVTaW11bGF0b3IvUHJvZmlsZXMvUnVudGltZXMvaU9TLnNpbXJ1bnRpbWUvQ29udGVudHMvUmVzb3VyY2VzL1J1bnRpbWVSb290L1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBLZXlib2FyZE9wdGlvbnNcbiAgICogQHByb3BlcnR5IHshc3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXlib2FyZCBsb2NhbGUsIGZvciBleGFtcGxlIGBlbl9VU2Agb3IgYGRlX0NIYFxuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IGxheW91dCBUaGUga2V5Ym9hcmQgbGF5b3V0LCBmb3IgZXhhbXBsZSBgUVVFUlRZYCBvciBgVWtyYWluaWFuYFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGhhcmR3YXJlIENvdWxkIGVpdGhlciBiZSBgQXV0b21hdGljYCBvciBgbnVsbGBcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExhbmd1YWdlT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxhbmd1YWdlLCBmb3IgZXhhbXBsZSBgZGVgIG9yIGB6aC1IYW50LUNOYFxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTG9jYWxlT3B0aW9uc1xuICAgKiBAcHJvcGVydHkgeyFzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBsb2NhbGUsIGZvciBleGFtcGxlIGBkZV9DSGAgb3IgYHpoX0NOYFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGNhbGVuZGFyIE9wdGlvbmFsIGNhbGVuZGFyIGZvcm1hdCwgZm9yIGV4YW1wbGUgYGdyZWdvcmlhbmAgb3IgYHBlcnNpYW5gXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2NhbGl6YXRpb25PcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7P0tleWJvYXJkT3B0aW9uc30ga2V5Ym9hcmRcbiAgICogQHByb3BlcnR5IHs/TGFuZ3VhZ2VPcHRpb25zfSBsYW5ndWFnZVxuICAgKiBAcHJvcGVydHkgez9Mb2NhbGVPcHRpb25zfSBsb2NhbGVcbiAgICovXG5cbiAgLyoqXG4gICAqIENoYW5nZSBsb2NhbGl6YXRpb24gc2V0dGluZ3Mgb24gdGhlIGN1cnJlbnRseSBib290ZWQgc2ltdWxhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7P0xvY2FsaXphdGlvbk9wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgc2V0dGluZyB0aGUgcHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBhbnkgb2Ygc2V0dGluZ3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNoYW5nZWRcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUxvY2FsaXphdGlvbiAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eShvcHRzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbGFuZ3VhZ2UsIGxvY2FsZSwga2V5Ym9hcmQgfSA9IG9wdHM7XG4gICAgY29uc3QgZ2xvYmFsUHJlZnMgPSB7fTtcbiAgICBsZXQga2V5Ym9hcmRJZCA9IG51bGw7XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChrZXlib2FyZCkpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgbGF5b3V0LCBoYXJkd2FyZSB9ID0ga2V5Ym9hcmQ7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2tleWJvYXJkJyBmaWVsZCBtdXN0IGhhdmUgYSB2YWxpZCBuYW1lIHNldGApO1xuICAgICAgfVxuICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2tleWJvYXJkJyBmaWVsZCBtdXN0IGhhdmUgYSB2YWxpZCBsYXlvdXQgc2V0YCk7XG4gICAgICB9XG4gICAgICBrZXlib2FyZElkID0gYCR7bmFtZX1Ac3c9JHtsYXlvdXR9YDtcbiAgICAgIGlmIChoYXJkd2FyZSkge1xuICAgICAgICBrZXlib2FyZElkICs9IGA7QGh3PSR7aGFyZHdhcmV9YDtcbiAgICAgIH1cbiAgICAgIGdsb2JhbFByZWZzLkFwcGxlS2V5Ym9hcmRzID0gW2tleWJvYXJkSWRdO1xuICAgIH1cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGxhbmd1YWdlKSkge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBsYW5ndWFnZTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnbGFuZ3VhZ2UnIGZpZWxkIG11c3QgaGF2ZSBhIHZhbGlkIG5hbWUgc2V0YCk7XG4gICAgICB9XG4gICAgICBnbG9iYWxQcmVmcy5BcHBsZUxhbmd1YWdlcyA9IFtuYW1lXTtcbiAgICB9XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChsb2NhbGUpKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNhbGVuZGFyIH0gPSBsb2NhbGU7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJ2xvY2FsZScgZmllbGQgbXVzdCBoYXZlIGEgdmFsaWQgbmFtZSBzZXRgKTtcbiAgICAgIH1cbiAgICAgIGxldCBsb2NhbGVJZCA9IG5hbWU7XG4gICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgbG9jYWxlSWQgKz0gYEBjYWxlbmRhcj0ke2NhbGVuZGFyfWA7XG4gICAgICB9XG4gICAgICBnbG9iYWxQcmVmcy5BcHBsZUxvY2FsZSA9IGxvY2FsZUlkO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGdsb2JhbFByZWZzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ0NodW5rcyA9IGdlbmVyYXRlRGVmYXVsdHNDb21tYW5kQXJncyhnbG9iYWxQcmVmcywgdHJ1ZSk7XG4gICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICdkZWZhdWx0cycsICd3cml0ZScsICcuR2xvYmFsUHJlZmVyZW5jZXMucGxpc3QnLCAuLi5hcmdzXG4gICAgXSkpKTtcblxuICAgIGlmIChrZXlib2FyZElkKSB7XG4gICAgICBjb25zdCBhcmdDaHVua3MgPSBnZW5lcmF0ZURlZmF1bHRzQ29tbWFuZEFyZ3Moe1xuICAgICAgICBLZXlib2FyZHNDdXJyZW50QW5kTmV4dDogW2tleWJvYXJkSWRdLFxuICAgICAgICBLZXlib2FyZExhc3RVc2VkOiBrZXlib2FyZElkLFxuICAgICAgICBLZXlib2FyZExhc3RVc2VkRm9yTGFuZ3VhZ2U6IHsgW2tleWJvYXJkLm5hbWVdOiBrZXlib2FyZElkIH1cbiAgICAgIH0sIHRydWUpO1xuICAgICAgYXdhaXQgQi5hbGwoYXJnQ2h1bmtzLm1hcCgoYXJncykgPT4gdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFtcbiAgICAgICAgJ2RlZmF1bHRzJywgJ3dyaXRlJywgJ2NvbS5hcHBsZS5QcmVmZXJlbmNlcycsIC4uLmFyZ3NcbiAgICAgIF0pKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW11bGF0b3JYY29kZTk7XG4iXSwiZmlsZSI6ImxpYi9zaW11bGF0b3IteGNvZGUtOS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -1,7 +1,7 @@
1
1
  import SimulatorXcode8 from './simulator-xcode-8';
2
2
  import _ from 'lodash';
3
3
  import path from 'path';
4
- import { fs, timing } from '@appium/support';
4
+ import { fs, timing, util } from '@appium/support';
5
5
  import AsyncLock from 'async-lock';
6
6
  import log from './logger';
7
7
  import { waitForCondition } from 'asyncbox';
@@ -9,6 +9,8 @@ import { toBiometricDomainComponent, getDeveloperRoot } from './utils.js';
9
9
  import { NSUserDefaults, generateDefaultsCommandArgs } from './defaults-utils';
10
10
  import B from 'bluebird';
11
11
  import { EventEmitter } from 'events';
12
+ import { getPath as getXcodePath } from 'appium-xcode';
13
+ import { exec } from 'teen_process';
12
14
 
13
15
  const SIMULATOR_SHUTDOWN_TIMEOUT = 15 * 1000;
14
16
  const startupLock = new AsyncLock();
@@ -84,10 +86,14 @@ class SimulatorXcode9 extends SimulatorXcode8 {
84
86
  if (opts.scaleFactor) {
85
87
  opts.devicePreferences.SimulatorWindowLastScale = parseFloat(opts.scaleFactor);
86
88
  }
87
- // This option is necessary to make the Simulator window follow
88
- // the actual XCUIDevice orientation
89
89
  const commonPreferences = {
90
- RotateWindowWhenSignaledByGuest: true
90
+ // This option is necessary to make the Simulator window follow
91
+ // the actual XCUIDevice orientation
92
+ RotateWindowWhenSignaledByGuest: true,
93
+ // https://github.com/appium/appium/issues/16418
94
+ StartLastDeviceOnLaunch: false,
95
+ DetachOnWindowClose: false,
96
+ AttachBootedOnStart: true,
91
97
  };
92
98
  if (_.isBoolean(opts.connectHardwareKeyboard) || _.isNil(opts.connectHardwareKeyboard)) {
93
99
  opts.devicePreferences.ConnectHardwareKeyboard = opts.connectHardwareKeyboard ?? false;
@@ -167,6 +173,26 @@ class SimulatorXcode9 extends SimulatorXcode8 {
167
173
  await this.disableKeyboardIntroduction();
168
174
  }
169
175
 
176
+ /**
177
+ * @override
178
+ */
179
+ async startUIClient (opts = {}) {
180
+ opts = _.cloneDeep(opts);
181
+ _.defaultsDeep(opts, {
182
+ startupTimeout: this.startupTimeout,
183
+ });
184
+
185
+ const simulatorApp = path.resolve(await getXcodePath(), 'Applications', this.simulatorApp);
186
+ const args = ['-Fn', simulatorApp];
187
+ log.info(`Starting Simulator UI: ${util.quote(['open', ...args])}`);
188
+ try {
189
+ await exec('open', args, {timeout: opts.startupTimeout});
190
+ } catch (err) {
191
+ throw new Error(`Got an unexpected error while opening Simulator UI: ` +
192
+ err.stderr || err.stdout || err.message);
193
+ }
194
+ }
195
+
170
196
  /**
171
197
  * Disable keyboard tutorial as 'com.apple.keyboard.preferences' domain via 'defaults' command.
172
198
  */
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "keywords": [
5
5
  "appium"
6
6
  ],
7
- "version": "4.0.0",
7
+ "version": "4.0.1",
8
8
  "author": "appium",
9
9
  "license": "Apache-2.0",
10
10
  "repository": {
@@ -37,7 +37,7 @@
37
37
  "asyncbox": "^2.3.1",
38
38
  "bluebird": "^3.5.1",
39
39
  "lodash": "^4.2.1",
40
- "node-simctl": "^6.6.0",
40
+ "node-simctl": "^7.0.1",
41
41
  "semver": "^7.0.0",
42
42
  "source-map-support": "^0.x",
43
43
  "teen_process": "^1.3.0"
@@ -72,6 +72,6 @@
72
72
  "mocha": "^9.0.0",
73
73
  "pem": "^1.8.3",
74
74
  "pre-commit": "^1.1.3",
75
- "sinon": "^12.0.0"
75
+ "sinon": "^13.0.0"
76
76
  }
77
77
  }