appium 2.0.0-beta.24 → 2.0.0-beta.25

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.
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.getDefaultsForSchema = exports.getDefaultsForExtension = exports.getArgSpec = exports.flattenSchema = exports.finalizeSchema = exports.SchemaUnsupportedSchemaError = exports.SchemaUnknownSchemaError = exports.SchemaNameConflictError = exports.SchemaFinalizationError = exports.ALLOWED_SCHEMA_EXTENSIONS = void 0;
8
+ exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.getDefaultsForSchema = exports.getDefaultsForExtension = exports.getArgSpec = exports.getAllArgSpecs = exports.flattenSchema = exports.finalizeSchema = exports.SchemaUnsupportedSchemaError = exports.SchemaUnknownSchemaError = exports.SchemaNameConflictError = exports.SchemaFinalizationError = exports.ALLOWED_SCHEMA_EXTENSIONS = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
@@ -50,7 +50,7 @@ class AppiumSchema {
50
50
  const instance = (_AppiumSchema$_instan = AppiumSchema._instance) !== null && _AppiumSchema$_instan !== void 0 ? _AppiumSchema$_instan : new AppiumSchema();
51
51
  AppiumSchema._instance = instance;
52
52
 
53
- _lodash.default.bindAll(instance, ['finalize', 'flatten', 'getArgSpec', 'getDefaults', 'getDefaultsForExtension', 'getSchema', 'hasArgSpec', 'isFinalized', 'registerSchema', 'reset', 'validate']);
53
+ _lodash.default.bindAll(instance, ['finalize', 'flatten', 'getAllArgSpecs', 'getArgSpec', 'getDefaults', 'getDefaultsForExtension', 'getSchema', 'hasArgSpec', 'isFinalized', 'registerSchema', 'reset', 'validate']);
54
54
 
55
55
  return instance;
56
56
  }
@@ -63,6 +63,10 @@ class AppiumSchema {
63
63
  return Boolean(this._finalizedSchemas);
64
64
  }
65
65
 
66
+ getAllArgSpecs() {
67
+ return this._argSpecs;
68
+ }
69
+
66
70
  finalize() {
67
71
  if (this.isFinalized()) {
68
72
  return this._finalizedSchemas;
@@ -397,6 +401,7 @@ exports.SchemaUnsupportedSchemaError = SchemaUnsupportedSchemaError;
397
401
  const appiumSchema = AppiumSchema.create();
398
402
  const {
399
403
  registerSchema,
404
+ getAllArgSpecs,
400
405
  getArgSpec,
401
406
  hasArgSpec,
402
407
  isFinalized,
@@ -418,6 +423,7 @@ exports.finalizeSchema = finalizeSchema;
418
423
  exports.isFinalized = isFinalized;
419
424
  exports.hasArgSpec = hasArgSpec;
420
425
  exports.getArgSpec = getArgSpec;
426
+ exports.getAllArgSpecs = getAllArgSpecs;
421
427
  exports.registerSchema = registerSchema;
422
428
  const {
423
429
  isAllowedSchemaFileExtension
@@ -425,4 +431,4 @@ const {
425
431
  exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;require('source-map-support').install();
426
432
 
427
433
 
428
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvc2NoZW1hLmpzIl0sIm5hbWVzIjpbIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJTZXQiLCJBcHBpdW1TY2hlbWEiLCJjb25zdHJ1Y3RvciIsIlJlYWRvbmx5TWFwIiwiRFJJVkVSX1RZUEUiLCJNYXAiLCJQTFVHSU5fVFlQRSIsIl9hanYiLCJfaW5zdGFudGlhdGVBanYiLCJjcmVhdGUiLCJpbnN0YW5jZSIsIl9pbnN0YW5jZSIsIl8iLCJiaW5kQWxsIiwiaGFzUmVnaXN0ZXJlZFNjaGVtYSIsImV4dFR5cGUiLCJleHROYW1lIiwiX3JlZ2lzdGVyZWRTY2hlbWFzIiwiaGFzIiwiaXNGaW5hbGl6ZWQiLCJCb29sZWFuIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJmaW5hbGl6ZSIsImFqdiIsImJhc2VTY2hlbWEiLCJjbG9uZURlZXAiLCJhcHBpdW1Db25maWdTY2hlbWEiLCJhZGRBcmdTcGVjcyIsInNjaGVtYSIsInByb3BOYW1lIiwicHJvcFNjaGVtYSIsIk9iamVjdCIsImVudHJpZXMiLCJhcmdTcGVjIiwiQXJnU3BlYyIsImRlc3QiLCJhcHBpdW1DbGlEZXN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdCIsImFyZyIsIl9hcmdTcGVjcyIsInNldCIsIm9taXQiLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiZmluYWxpemVkU2NoZW1hcyIsImZpbmFsU2NoZW1hIiwicmVkdWNlIiwiZXh0ZW5zaW9uU2NoZW1hcyIsImZvckVhY2giLCIkcmVmIiwidG9TY2hlbWFCYXNlUmVmIiwiJGlkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCIkY29tbWVudCIsInZhbGlkYXRlU2NoZW1hIiwiYWRkU2NoZW1hIiwiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJmcmVlemUiLCJBanYiLCJhbGxFcnJvcnMiLCJrZXl3b3JkcyIsImtleXdvcmQiLCJhZGRLZXl3b3JkIiwicmVzZXQiLCJzY2hlbWFJZCIsImtleXMiLCJyZW1vdmVTY2hlbWEiLCJyZWdpc3RlclNjaGVtYSIsImlzVW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaXNTdXBwb3J0ZWRTY2hlbWFUeXBlIiwiU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvciIsIm5vcm1hbGl6ZWRFeHROYW1lIiwia2ViYWJDYXNlIiwiZ2V0IiwiU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IiLCJnZXRBcmdTcGVjIiwibmFtZSIsInRvQXJnIiwiaGFzQXJnU3BlYyIsImdldERlZmF1bHRzIiwiZmxhdHRlbiIsIlNjaGVtYUZpbmFsaXphdGlvbkVycm9yIiwicmVkdWNlciIsImRlZmF1bHRzIiwicmV0dmFsIiwidmFsdWVzIiwiZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24iLCJzcGVjcyIsImZpbHRlciIsInNwZWMiLCJyYXdEZXN0IiwiZ2V0U2NoZW1hIiwic3RhY2siLCJwcmVmaXgiLCJmbGF0dGVuZWQiLCJwYWlycyIsInRvUGFpcnMiLCJrZXkiLCJ2YWx1ZSIsInB1c2giLCJTRVJWRVJfUFJPUF9OQU1FIiwicmVmU2NoZW1hIiwiZXJyIiwiU2NoZW1hVW5rbm93blNjaGVtYUVycm9yIiwiZXh0ZW5zaW9uSW5mb0Zyb21Sb290U2NoZW1hSWQiLCJSZWZlcmVuY2VFcnJvciIsInJlZiIsIl9nZXRWYWxpZGF0b3IiLCJpZCIsInZhbGlkYXRvciIsInZhbGlkYXRlIiwiaXNBcnJheSIsImVycm9ycyIsImlzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb24iLCJmaWxlbmFtZSIsInBhdGgiLCJleHRuYW1lIiwiaXNQbGFpbk9iamVjdCIsIiRhc3luYyIsIkVycm9yIiwiZGF0YSIsIm1zZyIsImlzQm9vbGVhbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcHBpdW1TY2hlbWEiLCJmaW5hbGl6ZVNjaGVtYSIsInJlc2V0U2NoZW1hIiwiZmxhdHRlblNjaGVtYSIsImdldERlZmF1bHRzRm9yU2NoZW1hIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FB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O0FBRUQsY0FBTSxJQUFJckQsU0FBSixDQUNILDBGQUF5RnVELElBQUksQ0FBQ0MsU0FBTCxDQUN4RmxHLE1BRHdGLENBRXhGLEVBSEUsQ0FBTjtBQUtEOztBQUNELGFBQVEsR0FBRStGLEdBQUksaUVBQWQ7QUFDRCxLQWpCRCxHQURGO0FBRnFDLGdEQVpoQyxxQ0FZZ0M7QUFBQTtBQXNCckMsU0FBS0QsSUFBTCxHQUFZO0FBQUM5RixNQUFBQSxNQUFEO0FBQVNiLE1BQUFBLE9BQVQ7QUFBa0JDLE1BQUFBO0FBQWxCLEtBQVo7QUFDRDs7QUF2Q3lEOzs7QUEwQzVELE1BQU0rRyxZQUFZLEdBQUc5SCxZQUFZLENBQUNRLE1BQWIsRUFBckI7QUFFTyxNQUFNO0FBQ1gyRCxFQUFBQSxjQURXO0FBRVhTLEVBQUFBLFVBRlc7QUFHWEcsRUFBQUEsVUFIVztBQUlYN0QsRUFBQUEsV0FKVztBQUtYRyxFQUFBQSxRQUFRLEVBQUUwRyxjQUxDO0FBTVhoRSxFQUFBQSxLQUFLLEVBQUVpRSxXQU5JO0FBT1hqQixFQUFBQSxRQVBXO0FBUVhuQixFQUFBQSxTQVJXO0FBU1hYLEVBQUFBLE9BQU8sRUFBRWdELGFBVEU7QUFVWGpELEVBQUFBLFdBQVcsRUFBRWtELG9CQVZGO0FBV1gzQyxFQUFBQTtBQVhXLElBWVR1QyxZQVpHOzs7Ozs7Ozs7Ozs7QUFhQSxNQUFNO0FBQUNaLEVBQUFBO0FBQUQsSUFBaUNsSCxZQUF2QyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQWp2IGZyb20gJ2Fqdic7XG5pbXBvcnQgYWRkRm9ybWF0cyBmcm9tICdhanYtZm9ybWF0cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUgfSBmcm9tICcuLi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCB7IFJlYWRvbmx5TWFwIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IGFwcGl1bUNvbmZpZ1NjaGVtYSBmcm9tICcuL2FwcGl1bS1jb25maWctc2NoZW1hJztcbmltcG9ydCB7IEFQUElVTV9DT05GSUdfU0NIRU1BX0lELCBBcmdTcGVjLCBTRVJWRVJfUFJPUF9OQU1FIH0gZnJvbSAnLi9hcmctc3BlYyc7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gJy4va2V5d29yZHMnO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgdGhhdCBhbiBleHRlbnNpb24gc2NoZW1hIGZpbGUgY2FuIGhhdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5qc29uJywgJy5qcycsICcuY2pzJ10pO1xuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgQWp2IGFuZCBzY2hlbWEtcmVsYXRlZCBmdW5jdGlvbnMuXG4gKlxuICogU2hvdWxkIGhhdmUgYmVlbiBuYW1lZCBIaWdobGFuZGVyLCBiZWNhdXNlIF90aGVyZSBjYW4gb25seSBiZSBvbmVfXG4gKi9cbmNsYXNzIEFwcGl1bVNjaGVtYSB7XG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgdW5pcXVlIGFyZ3VtZW50IElEcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHtAbGluayBBcmdTcGVjfXMuXG4gICAqXG4gICAqIEFuIFwiYXJndW1lbnRcIiBpcyBhIENMSSBhcmd1bWVudCBvciBhIGNvbmZpZyBwcm9wZXJ0eS5cbiAgICpcbiAgICogVXNlZCB0byBwcm92aWRlIGVhc3kgbG9va3VwcyBvZiBhcmd1bWVudCBtZXRhZGF0YSB3aGVuIGNvbnZlcnRpbmcgYmV0d2VlbiBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zIG9mIHRob3NlIGFyZ3VtZW50cy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlYWRvbmx5TWFwPHN0cmluZyxBcmdTcGVjPn1cbiAgICovXG4gIF9hcmdTcGVjcyA9IG5ldyBSZWFkb25seU1hcCgpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBleHRlbnNpb24gdHlwZXMgdG8gZXh0ZW5zaW9uIG5hbWVzIHRvIHNjaGVtYSBvYmplY3RzLlxuICAgKlxuICAgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBuYW1pbmcgY29uZmxpY3RzLiBUaGUgc2NoZW1hc1xuICAgKiBhcmUgc3RvcmVkIGhlcmUgaW4gbWVtb3J5IHVudGlsIHRoZSBpbnN0YW5jZSBpcyBfZmluYWxpemVkXy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlY29yZDxFeHRlbnNpb25UeXBlLE1hcDxzdHJpbmcsU2NoZW1hT2JqZWN0Pj59XG4gICAqL1xuICBfcmVnaXN0ZXJlZFNjaGVtYXMgPSB7W0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLCBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCl9O1xuXG4gIC8qKlxuICAgKiBBanYgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Fqdn1cbiAgICovXG4gIF9hanY7XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBvZiBzY2hlbWEgSURzIHRvIGZpbmFsaXplZCBzY2hlbWFzLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcmVmZXJlbmNlcywgYnV0IHJhdGhlciB0aGUgcm9vdCBzY2hlbWFzIHRoZW1zZWx2ZXMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD4/fVxuICAgKi9cbiAgX2ZpbmFsaXplZFNjaGVtYXMgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBBanYsIGFkZHMgc3RhbmRhcmQgZm9ybWF0cyBhbmQgb3VyIGN1c3RvbSBrZXl3b3Jkcy5cbiAgICogQHNlZSBodHRwczovL25wbS5pbS9hanYtZm9ybWF0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2UgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIGNyZWF0ZXMgYSBuZXcgb25lLlxuICAgKiBCaW5kcyBwdWJsaWMgbWV0aG9kcyB0byB0aGUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtBcHBpdW1TY2hlbWF9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlICgpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IEFwcGl1bVNjaGVtYS5faW5zdGFuY2UgPz8gbmV3IEFwcGl1bVNjaGVtYSgpO1xuICAgIEFwcGl1bVNjaGVtYS5faW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgIF8uYmluZEFsbChpbnN0YW5jZSwgW1xuICAgICAgJ2ZpbmFsaXplJyxcbiAgICAgICdmbGF0dGVuJyxcbiAgICAgICdnZXRBcmdTcGVjJyxcbiAgICAgICdnZXREZWZhdWx0cycsXG4gICAgICAnZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24nLFxuICAgICAgJ2dldFNjaGVtYScsXG4gICAgICAnaGFzQXJnU3BlYycsXG4gICAgICAnaXNGaW5hbGl6ZWQnLFxuICAgICAgJ3JlZ2lzdGVyU2NoZW1hJyxcbiAgICAgICdyZXNldCcsXG4gICAgICAndmFsaWRhdGUnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGEgc2NoZW1hIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdXNpbmcgZ2l2ZW4gZXh0ZW5zaW9uIHR5cGUgYW5kIG5hbWUuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgZGVwZW5kIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBfZmluYWxpemVkXy5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNSZWdpc3RlcmVkU2NoZW1hIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmhhcyhleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYHRydWVgIGlmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemUgZmluYWxpemV9IGhhcyBiZWVuIGNhbGxlZFxuICAgKiBzdWNjZXNzZnVsbHkgYW5kIHtAbGluayBBcHBpdW1TY2hlbWEucmVzZXQgcmVzZXR9IGhhcyBub3QgYmVlbiBjYWxsZWQgc2luY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiBmaW5hbGl6ZWRcbiAgICovXG4gIGlzRmluYWxpemVkICgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9maW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgd2hlbiBubyBtb3JlIHNjaGVtYXMgd2lsbCBiZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzOlxuICAgKiAxLiBJdCBjb21iaW5lcyBhbGwgc2NoZW1hcyBmcm9tIGV4dGVuc2lvbnMgaW50byB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEsXG4gICAqICAgIHRoZW4gYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSBgQWp2YCBpbnN0YW5jZS5cbiAgICogMi4gSXQgYWRkcyBzY2hlbWFzIGZvciBfZWFjaF8gYXJndW1lbnQvcHJvcGVydHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqICAgIFRoZSBDTEkgdXNlcyB0aGVzZSBzY2hlbWFzIHRvIHZhbGlkYXRlIHNwZWNpZmljIGFyZ3VtZW50cy5cbiAgICogMy4gVGhlIHNjaGVtYXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3ICh3aGljaCBpcyB0aGVcbiAgICogICAgb25seSBvbmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSlcbiAgICpcbiAgICogQW55IG1ldGhvZCBpbiB0aGlzIGluc3RhbmNlIHRoYXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogd2lsbCB0aHJvdyBpZiB0aGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQsIHRoaXMgaXMgYSBuby1vcC5cbiAgICogQHB1YmxpY1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBub3QgdmFsaWRcbiAgICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj59IFJlY29yZCBvZiBzY2hlbWEgSURzIHRvIGZ1bGwgc2NoZW1hIG9iamVjdHNcbiAgICovXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD59ICovIChcbiAgICAgICAgdGhpcy5fZmluYWxpemVkU2NoZW1hc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhanYgPSB0aGlzLl9hanY7XG5cbiAgICAvLyBBanYgd2lsbCBfbXV0YXRlXyB0aGUgc2NoZW1hLCBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0LlxuICAgIGNvbnN0IGJhc2VTY2hlbWEgPSBfLmNsb25lRGVlcChhcHBpdW1Db25maWdTY2hlbWEpO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hXG4gICAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdXG4gICAgICovXG4gICAgY29uc3QgYWRkQXJnU3BlY3MgPSAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSA9PiB7XG4gICAgICBmb3IgKGxldCBbcHJvcE5hbWUsIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgY29uc3QgYXJnU3BlYyA9IEFyZ1NwZWMuY3JlYXRlKHByb3BOYW1lLCB7XG4gICAgICAgICAgZGVzdDogcHJvcFNjaGVtYS5hcHBpdW1DbGlEZXN0LFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcFNjaGVtYS5kZWZhdWx0LFxuICAgICAgICAgIGV4dFR5cGUsXG4gICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHthcmd9ID0gYXJnU3BlYztcbiAgICAgICAgdGhpcy5fYXJnU3BlY3Muc2V0KGFyZywgYXJnU3BlYyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZEFyZ1NwZWNzKFxuICAgICAgXy5vbWl0KGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllcywgW1xuICAgICAgICBEUklWRVJfVFlQRSxcbiAgICAgICAgUExVR0lOX1RZUEUsXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pn1cbiAgICAgKi9cbiAgICBjb25zdCBmaW5hbGl6ZWRTY2hlbWFzID0ge307XG5cbiAgICBjb25zdCBmaW5hbFNjaGVtYSA9IF8ucmVkdWNlKFxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMsXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7dHlwZW9mIGJhc2VTY2hlbWF9IGJhc2VTY2hlbWFcbiAgICAgICAqIEBwYXJhbSB7TWFwPHN0cmluZyxTY2hlbWFPYmplY3Q+fSBleHRlbnNpb25TY2hlbWFzXG4gICAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICAgICAqL1xuICAgICAgKGJhc2VTY2hlbWEsIGV4dGVuc2lvblNjaGVtYXMsIGV4dFR5cGUpID0+IHtcbiAgICAgICAgZXh0ZW5zaW9uU2NoZW1hcy5mb3JFYWNoKChzY2hlbWEsIGV4dE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCAkcmVmID0gQXJnU3BlYy50b1NjaGVtYUJhc2VSZWYoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgICAgICAgc2NoZW1hLiRpZCA9ICRyZWY7XG4gICAgICAgICAgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7IC8vIHRoaXMgbWFrZXMgYHNjaGVtYWAgYmVjb21lIGEgYFN0cmljdFNjaGVtYU9iamVjdGBcbiAgICAgICAgICBiYXNlU2NoZW1hLnByb3BlcnRpZXMuc2VydmVyLnByb3BlcnRpZXNbZXh0VHlwZV0ucHJvcGVydGllc1tleHROYW1lXSA9XG4gICAgICAgICAgICB7JHJlZiwgJGNvbW1lbnQ6IGV4dE5hbWV9O1xuICAgICAgICAgIGFqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuICAgICAgICAgIGFkZEFyZ1NwZWNzKHNjaGVtYS5wcm9wZXJ0aWVzLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBhanYuYWRkU2NoZW1hKHNjaGVtYSwgJHJlZik7XG4gICAgICAgICAgZmluYWxpemVkU2NoZW1hc1skcmVmXSA9IC8qKiBAdHlwZSB7U3RyaWN0U2NoZW1hT2JqZWN0fSAqLyAoc2NoZW1hKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiYXNlU2NoZW1hO1xuICAgICAgfSxcbiAgICAgIGJhc2VTY2hlbWEsXG4gICAgKTtcblxuICAgIGFqdi5hZGRTY2hlbWEoZmluYWxTY2hlbWEsIEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKTtcbiAgICBmaW5hbGl6ZWRTY2hlbWFzW0FQUElVTV9DT05GSUdfU0NIRU1BX0lEXSA9IGZpbmFsU2NoZW1hO1xuICAgIGFqdi52YWxpZGF0ZVNjaGVtYShmaW5hbFNjaGVtYSwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gZmluYWxpemVkU2NoZW1hcztcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShmaW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIGFuZCBjcmVhdGVzIGFuIEFqdiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge0Fqdn1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFudGlhdGVBanYgKCkge1xuICAgIGNvbnN0IGFqdiA9IGFkZEZvcm1hdHMoXG4gICAgICBuZXcgQWp2KHtcbiAgICAgICAgLy8gd2l0aG91dCB0aGlzIG5vdCBtdWNoIHZhbGlkYXRpb24gYWN0dWFsbHkgaGFwcGVuc1xuICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gYWRkIGN1c3RvbSBrZXl3b3JkcyB0byBhanYuIHNlZSBzY2hlbWEta2V5d29yZHMuanNcbiAgICBfLmZvckVhY2goa2V5d29yZHMsIChrZXl3b3JkKSA9PiB7XG4gICAgICBhanYuYWRkS2V5d29yZChrZXl3b3JkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhanY7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2UgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLlxuICAgKlxuICAgKiAtIFJlbW92ZXMgYWxsIGFkZGVkIHNjaGVtYXMgZnJvbSB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiB7QGxpbmsgQXJnU3BlYyBBcmdTcGVjc31cbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiByZWdpc3RlcmVkIHNjaGVtYXNcbiAgICogLSBTZXRzIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hLl9maW5hbGl6ZWQgX2ZpbmFsaXplZH0gZmxhZyB0byBgZmFsc2VgXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0gYWdhaW4sIHlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyBmaXJzdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXNldCAoKSB7XG4gICAgZm9yIChjb25zdCBzY2hlbWFJZCBvZiBPYmplY3Qua2V5cyh0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID8/IHt9KSkge1xuICAgICAgdGhpcy5fYWp2LnJlbW92ZVNjaGVtYShzY2hlbWFJZCk7XG4gICAgfVxuICAgIHRoaXMuX2FyZ1NwZWNzID0gbmV3IFJlYWRvbmx5TWFwKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMgPSB7XG4gICAgICBbRFJJVkVSX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgICBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAgIC8vIEFqdiBzZWVtcyB0byBoYXZlIGFuIG92ZXItZWFnZXIgY2FjaGUsIHNvIHdlIGhhdmUgdG8gZHVtcCB0aGUgb2JqZWN0IGVudGlyZWx5LlxuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzY2hlbWEgZnJvbSBhbiBleHRlbnNpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgXCJmYWlsLWZhc3RcIiBpbiB0aGF0IHRoZSBzY2hlbWEgd2lsbCBpbW1lZGlhdGVseSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBKU09OIHNjaGVtYSBkcmFmdC0wNyBfb3JfIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiB0aGUgc2NoZW1hJ3MgYCRzY2hlbWFgIHByb3AgaXMuXG4gICAqXG4gICAqIERvZXMgX25vdF8gYWRkIHRoZSBzY2hlbWEgdG8gdGhlIGBhanZgIGluc3RhbmNlICh0aGlzIGlzIGRvbmUgYnkge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0pLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIFVuaXF1ZSBleHRlbnNpb24gbmFtZSBmb3IgYHR5cGVgXG4gICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWEgLSBTY2hlbWEgb2JqZWN0XG4gICAqIEB0aHJvd3Mge1NjaGVtYU5hbWVDb25mbGljdEVycm9yfSBJZiB0aGUgc2NoZW1hIGlzIGFuIGludmFsaWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWdpc3RlclNjaGVtYSAoZXh0VHlwZSwgZXh0TmFtZSwgc2NoZW1hKSB7XG4gICAgaWYgKCEoZXh0VHlwZSAmJiBleHROYW1lKSB8fCBfLmlzVW5kZWZpbmVkKHNjaGVtYSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdFeHBlY3RlZCBleHRlbnNpb24gdHlwZSwgZXh0ZW5zaW9uIG5hbWUsIGFuZCBhIGRlZmluZWQgc2NoZW1hJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghQXBwaXVtU2NoZW1hLmlzU3VwcG9ydGVkU2NoZW1hVHlwZShzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvcihzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkRXh0TmFtZSA9IF8ua2ViYWJDYXNlKGV4dE5hbWUpO1xuICAgIGlmICh0aGlzLmhhc1JlZ2lzdGVyZWRTY2hlbWEoZXh0VHlwZSwgbm9ybWFsaXplZEV4dE5hbWUpKSB7XG4gICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uZ2V0KG5vcm1hbGl6ZWRFeHROYW1lKSA9PT0gc2NoZW1hKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBTY2hlbWFOYW1lQ29uZmxpY3RFcnJvcihleHRUeXBlLCBleHROYW1lKTtcbiAgICB9XG4gICAgdGhpcy5fYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5zZXQobm9ybWFsaXplZEV4dE5hbWUsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHtAbGluayBBcmdTcGVjfSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge0FyZ1NwZWN8dW5kZWZpbmVkfSBBcmdTcGVjIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0QXJnU3BlYyAobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5nZXQoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGluc3RhbmNlIGtub3dzIGFib3V0IGFuIGFyZ3VtZW50IGJ5IHRoZSBnaXZlbiBgbmFtZWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBzdWNoIGFuIHtAbGluayBBcmdTcGVjfSBleGlzdHNcbiAgICovXG4gIGhhc0FyZ1NwZWMgKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJnU3BlY3MuaGFzKEFyZ1NwZWMudG9BcmcobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBgUmVjb3JkYCBvZiBhcmd1bWVudCBcImRlc3RcIiBzdHJpbmdzIHRvIGRlZmF1bHQgdmFsdWVzLlxuICAgKlxuICAgKiBUaGUgXCJkZXN0XCIgc3RyaW5nIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGluIG9iamVjdCByZXR1cm5lZCBieVxuICAgKiBgYXJncGFyc2UuQXJndW1lbnRQYXJzZXJbJ3BhcnNlX2FyZ3MnXWAuXG4gICAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbnx1bmRlZmluZWR9IEZsYXR0ZW5lZFxuICAgKiBAcGFyYW0ge0ZsYXR0ZW5lZH0gW2ZsYXR0ZW49dHJ1ZV0gLSBJZiBgdHJ1ZWAsIGZsYXR0ZW5zIHRoZSByZXR1cm5lZCBvYmplY3RcbiAgICogdXNpbmcgXCJrZXlwYXRoXCItc3R5bGUga2V5cyBvZiB0aGUgZm9ybWF0IGA8ZXh0VHlwZT4uPGV4dE5hbWU+LjxhcmdOYW1lPmAuXG4gICAqIE90aGVyd2lzZSwgcmV0dXJucyBhIG5lc3RlZCBvYmplY3QgdXNpbmcgYGV4dFR5cGVgIGFuZCBgZXh0TmFtZWAgYXNcbiAgICogcHJvcGVydGllcy4gQmFzZSBhcmd1bWVudHMgKHNlcnZlciBhcmd1bWVudHMpIGFyZSBhbHdheXMgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICogQHJldHVybnMge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn1cbiAgICovXG4gIGdldERlZmF1bHRzIChmbGF0dGVuID0gLyoqIEB0eXBlIHtGbGF0dGVuZWR9ICovICh0cnVlKSkge1xuICAgIGlmICghdGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjYWxsYmFjayBEZWZhdWx0UmVkdWNlclxuICAgICAqIEBwYXJhbSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSBkZWZhdWx0c1xuICAgICAqIEBwYXJhbSB7QXJnU3BlY30gYXJnU3BlY1xuICAgICAqIEByZXR1cm5zIHtEZWZhdWx0VmFsdWVzPEZsYXR0ZW5lZD59XG4gICAgICovXG4gICAgLyoqIEB0eXBlIHtEZWZhdWx0UmVkdWNlcn0gKi9cbiAgICBjb25zdCByZWR1Y2VyID0gZmxhdHRlblxuICAgICAgPyAoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIGRlc3R9KSA9PiB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgZGVmYXVsdHNbZGVzdF0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgfVxuICAgICAgOiAoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIGRlc3R9KSA9PiB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgXy5zZXQoZGVmYXVsdHMsIGRlc3QsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgfTtcblxuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSAqL1xuICAgIGNvbnN0IHJldHZhbCA9IHt9O1xuICAgIHJldHVybiBbLi4udGhpcy5fYXJnU3BlY3MudmFsdWVzKCldLnJlZHVjZShyZWR1Y2VyLCByZXR2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmbGF0dGVuZWQgUmVjb3JkIG9mIGRlZmF1bHRzIGZvciBhIHNwZWNpZmljIGV4dGVuc2lvbi4gS2V5cyB3aWxsXG4gICAqIGJlIG9mIGZvcm1hdCBgPGFyZ05hbWU+YC5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPn1cbiAgICovXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgIH1cbiAgICBjb25zdCBzcGVjcyA9IFsuLi50aGlzLl9hcmdTcGVjcy52YWx1ZXMoKV0uZmlsdGVyKFxuICAgICAgKHNwZWMpID0+IHNwZWMuZXh0VHlwZSA9PT0gZXh0VHlwZSAmJiBzcGVjLmV4dE5hbWUgPT09IGV4dE5hbWUsXG4gICAgKTtcbiAgICByZXR1cm4gc3BlY3MucmVkdWNlKChkZWZhdWx0cywge2RlZmF1bHRWYWx1ZSwgcmF3RGVzdH0pID0+IHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGRlZmF1bHRzW3Jhd0Rlc3RdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVuIHNjaGVtYSBpbnRvIGFuIGFycmF5IG9mIGBTY2hlbWFPYmplY3RgcyBhbmQgYXNzb2NpYXRlZFxuICAgKiB7QGxpbmsgQXJnU3BlYyBBcmdTcGVjc30uXG4gICAqXG4gICAqIENvbnZlcnRzIG5lc3RlZCBleHRlbnNpb24gc2NoZW1hcyB0byBrZXlzIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gdHlwZSBhbmRcbiAgICogbmFtZS4gVXNlZCB3aGVuIHRyYW5zbGF0aW5nIHRvIGBhcmdwYXJzZWAgb3B0aW9ucyBvciBnZXR0aW5nIHRoZSBsaXN0IG9mXG4gICAqIGRlZmF1bHQgdmFsdWVzIChzZWUge0BsaW5rIEFwcGl1bVNjaGVtYS5nZXREZWZhdWx0c30pIGZvciBDTEkgb3Igb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVybWVkaWF0ZSByZXByc2VudGF0aW9uIHVzZWQgYnkgYGNsaS1hcmdzYFxuICAgKiBtb2R1bGUncyBgdG9QYXJzZXJBcmdzYCwgd2hpY2ggY29udmVydHMgdGhlIGZpbmFsaXplZCBzY2hlbWEgdG8gcGFyYW1ldGVyc1xuICAgKiB1c2VkIGJ5IGBhcmdwYXJzZWAuXG4gICAqIEB0aHJvd3MgSWYge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0gaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQuXG4gICAqIEByZXR1cm5zIHtGbGF0dGVuZWRTY2hlbWF9XG4gICAqL1xuICBmbGF0dGVuICgpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpO1xuXG4gICAgLyoqIEB0eXBlIHt7cHJvcGVydGllczogU2NoZW1hT2JqZWN0LCBwcmVmaXg6IHN0cmluZ1tdfVtdfSAqL1xuICAgIGNvbnN0IHN0YWNrID0gW3twcm9wZXJ0aWVzOiBzY2hlbWEucHJvcGVydGllcywgcHJlZml4OiBbXX1dO1xuICAgIC8qKiBAdHlwZSB7RmxhdHRlbmVkU2NoZW1hfSAqL1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuXG4gICAgLy8gdGhpcyBiaXQgaXMgYSByZWN1cnNpdmUgYWxnb3JpdGhtIHJld3JpdHRlbiBhcyBhIGZvciBsb29wLlxuICAgIC8vIHdoZW4gd2UgZmluZCBzb21ldGhpbmcgd2Ugd2FudCB0byB0cmF2ZXJzZSwgd2UgYWRkIGl0IHRvIGBzdGFja2BcbiAgICBmb3IgKGNvbnN0IHtwcm9wZXJ0aWVzLCBwcmVmaXh9IG9mIHN0YWNrKSB7XG4gICAgICBjb25zdCBwYWlycyA9IF8udG9QYWlycyhwcm9wZXJ0aWVzKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IHtwcm9wZXJ0aWVzLCAkcmVmfSA9IHZhbHVlO1xuICAgICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIHByZWZpeDoga2V5ID09PSBTRVJWRVJfUFJPUF9OQU1FID8gW10gOiBbLi4ucHJlZml4LCBrZXldLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCRyZWYpIHtcbiAgICAgICAgICBsZXQgcmVmU2NoZW1hO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWZTY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgkcmVmKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBleHRlbnNpb24gc2NoZW1hIHN1cHBsaWVzIGEgJHJlZiB0byBhIG5vbi1leGlzdGVudCBzY2hlbWFcbiAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IoJHJlZik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtub3JtYWxpemVkRXh0TmFtZX0gPVxuICAgICAgICAgICAgQXJnU3BlYy5leHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCgkcmVmKTtcbiAgICAgICAgICBpZiAoIW5vcm1hbGl6ZWRFeHROYW1lKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBleHRlbnNpb24gbmFtZSBmcm9tIHNjaGVtYSBJRCAkeyRyZWZ9LiBUaGlzIGlzIGEgYnVnLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHJlZlNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBbLi4ucHJlZml4LCBrZXksIG5vcm1hbGl6ZWRFeHROYW1lXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IERSSVZFUl9UWVBFICYmIGtleSAhPT0gUExVR0lOX1RZUEUpIHtcbiAgICAgICAgICBjb25zdCBbZXh0VHlwZSwgZXh0TmFtZV0gPSBwcmVmaXg7XG4gICAgICAgICAgY29uc3QgYXJnU3BlYyA9IHRoaXMuZ2V0QXJnU3BlYyhcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7RXh0ZW5zaW9uVHlwZX0gKi8gKGV4dFR5cGUpLFxuICAgICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghYXJnU3BlYykge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgYFVua25vd24gYXJndW1lbnQgd2l0aCBrZXkgJHtrZXl9LCBleHRUeXBlICR7ZXh0VHlwZX0gYW5kIGV4dE5hbWUgJHtleHROYW1lfS4gVGhpcyBpcyBhIGJ1Zy5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxhdHRlbmVkLnB1c2goe3NjaGVtYTogXy5jbG9uZURlZXAodmFsdWUpLCBhcmdTcGVjfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGl0c2VsZlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRFxuICAgKiBAdGhyb3dzIElmIHRoZSBzY2hlbWEgaGFzIG5vdCB5ZXQgYmVlbiBmaW5hbGl6ZWRcbiAgICogQHJldHVybnMge1NjaGVtYU9iamVjdH1cbiAgICovXG4gIGdldFNjaGVtYSAocmVmID0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTY2hlbWFPYmplY3R9ICovICh0aGlzLl9nZXRWYWxpZGF0b3IocmVmKS5zY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBzY2hlbWEgdmFsaWRhdG9yIGZ1bmN0aW9uIGZyb20gQWp2XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaWRdIC0gU2NoZW1hIElEXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlZhbGlkYXRlRnVuY3Rpb259XG4gICAqL1xuICBfZ2V0VmFsaWRhdG9yIChpZCA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fYWp2LmdldFNjaGVtYShpZCk7XG4gICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgIGlmIChpZCA9PT0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVW5rbm93blNjaGVtYUVycm9yKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBvYmplY3QsIHZhbGlkYXRlcyBpdCBhZ2FpbnN0IHRoZSBBcHBpdW0gY29uZmlnIHNjaGVtYS5cbiAgICogSWYgZXJyb3JzIG9jY3VyLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBub24tZW1wdHkuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSAoaG9wZWZ1bGx5IGFuIG9iamVjdCkgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRCBvciByZWYuXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuRXJyb3JPYmplY3RbXX0gQXJyYXkgb2YgZXJyb3JzLCBpZiBhbnkuXG4gICAqL1xuICB2YWxpZGF0ZSAodmFsdWUsIHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fZ2V0VmFsaWRhdG9yKHJlZik7XG4gICAgcmV0dXJuICF2YWxpZGF0b3IodmFsdWUpICYmIF8uaXNBcnJheSh2YWxpZGF0b3IuZXJyb3JzKVxuICAgICAgPyBbLi4udmFsaWRhdG9yLmVycm9yc11cbiAgICAgIDogW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYGZpbGVuYW1lYCdzIGZpbGUgZXh0ZW5zaW9uIGlzIGFsbG93ZWQgKGluIHtAbGluayBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TfSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uIChmaWxlbmFtZSkge1xuICAgIHJldHVybiBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLmhhcyhwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgc2NoZW1hYCBpcyBhIHBsYWluIG9iamVjdCB3aXRoIGEgbm9uLXRydWUgYCRhc3luY2AgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWEgLSBTY2hlbWEgdG8gY2hlY2tcbiAgICogQHJldHVybnMge3NjaGVtYSBpcyBTY2hlbWFPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgaXNTdXBwb3J0ZWRTY2hlbWFUeXBlIChzY2hlbWEpIHtcbiAgICByZXR1cm4gXy5pc1BsYWluT2JqZWN0KHNjaGVtYSkgJiYgc2NoZW1hLiRhc3luYyAhPT0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZSBoYXMgbm90IHlldCBiZWVuIGZpbmFsaXplZCwgYnV0XG4gKiB0aGUgbWV0aG9kIGNhbGxlZCByZXF1aXJlcyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpbmFsaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfRklOQUxJWkFUSU9OJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoJ1NjaGVtYSBub3QgeWV0IGZpbmFsaXplZDsgYGZpbmFsaXplKClgIG11c3QgYmUgY2FsbGVkIGZpcnN0LicpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBcInVuaXF1ZVwiIHNjaGVtYSBJRCBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWEgSUQuXG4gKlxuICogVGhpcyBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgY2F1c2VkIGJ5IGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc2NoZW1hIHR3aWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9OQU1FX0NPTkZMSUNUJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBzdXBlcihcbiAgICAgIGBOYW1lIGZvciAke2V4dFR5cGV9IHNjaGVtYSBcIiR7ZXh0TmFtZX1cIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWFgLFxuICAgICk7XG4gICAgdGhpcy5kYXRhID0ge2V4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgSUQgd2FzIGV4cGVjdGVkLCBidXQgaXQgZG9lc24ndCBleGlzdCBvbiB0aGUge0BsaW5rIEFqdn0gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IgZXh0ZW5kcyBSZWZlcmVuY2VFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTktOT1dOX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hSWQ6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYUlkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hSWQpIHtcbiAgICBzdXBlcihgVW5rbm93biBzY2hlbWE6IFwiJHtzY2hlbWFJZH1cImApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWFJZH07XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNjaGVtYSBpcyBwcm92aWRlZCwgYnV0IGl0J3Mgb2YgYW4gdW5zdXBwb3J0ZWQgdHlwZS5cbiAqXG4gKiBcIlZhbGlkXCIgc2NoZW1hcyB3aGljaCBhcmUgdW5zdXBwb3J0ZWQgaW5jbHVkZSBib29sZWFuIHNjaGVtYXMgYW5kIGFzeW5jIHNjaGVtYXNcbiAqIChoYXZpbmcgYSBgdHJ1ZWAgYCRhc3luY2AgcHJvcGVydHkpLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTlNVUFBPUlRFRF9TQ0hFTUEnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8e3NjaGVtYTogYW55LCBleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWFcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy84Mjc3XG4gICAgc3VwZXIoXG4gICAgICAoKCkgPT4ge1xuICAgICAgICBsZXQgbXNnID0gYFVuc3VwcG9ydGVkIHNjaGVtYSBmcm9tICR7ZXh0VHlwZX0gXCIke2V4dE5hbWV9XCI6YDtcbiAgICAgICAgaWYgKF8uaXNCb29sZWFuKHNjaGVtYSkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7bXNnfSBzY2hlbWEgY2Fubm90IGJlIGEgYm9vbGVhbmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChzY2hlbWEpKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYS4kYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBjYW5ub3QgYmUgYW4gYXN5bmMgc2NoZW1hYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYHNjaGVtYSBJUyBzdXBwb3J0ZWQ7IHRoaXMgZXJyb3Igc2hvdWxkIG5vdCBiZSB0aHJvd24gKHRoaXMgaXMgYSBidWcpLiB2YWx1ZSBvZiBzY2hlbWE6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0IHdpdGhvdXQgYSB0cnVlIFwiJGFzeW5jXCIgcHJvcGVydHlgO1xuICAgICAgfSkoKSxcbiAgICApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbmNvbnN0IGFwcGl1bVNjaGVtYSA9IEFwcGl1bVNjaGVtYS5jcmVhdGUoKTtcblxuZXhwb3J0IGNvbnN0IHtcbiAgcmVnaXN0ZXJTY2hlbWEsXG4gIGdldEFyZ1NwZWMsXG4gIGhhc0FyZ1NwZWMsXG4gIGlzRmluYWxpemVkLFxuICBmaW5hbGl6ZTogZmluYWxpemVTY2hlbWEsXG4gIHJlc2V0OiByZXNldFNjaGVtYSxcbiAgdmFsaWRhdGUsXG4gIGdldFNjaGVtYSxcbiAgZmxhdHRlbjogZmxhdHRlblNjaGVtYSxcbiAgZ2V0RGVmYXVsdHM6IGdldERlZmF1bHRzRm9yU2NoZW1hLFxuICBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbixcbn0gPSBhcHBpdW1TY2hlbWE7XG5leHBvcnQgY29uc3Qge2lzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb259ID0gQXBwaXVtU2NoZW1hO1xuXG4vKipcbiAqIEFwcGl1bSBvbmx5IHN1cHBvcnRzIHNjaGVtYXMgdGhhdCBhcmUgcGxhaW4gb2JqZWN0czsgbm90IGFycmF5cy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdCAmIHtba2V5OiBudW1iZXJdOiBuZXZlcn19IFNjaGVtYU9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEFuIG9iamVjdCBoYXZpbmcgcHJvcGVydHkgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0cmljdFByb3BcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gKi9cblxuLyoqXG4gKiBBIHtAbGluayBTY2hlbWFPYmplY3R9IHdpdGggYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtTY2hlbWFPYmplY3QgJiBTdHJpY3RQcm9wfSBTdHJpY3RTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEEgbGlzdCBvZiBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHtAbGluayBBcmdTcGVjfSBvYmplY3RzLlxuICpcbiAqIEludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHdoZW4gY29udmVydGluZyB0aGUgZW50aXJlIHNjaGVtYSBkb3duIHRvIENMSSBhcmd1bWVudHMuXG4gKiBAdHlwZWRlZiB7e3NjaGVtYTogU2NoZW1hT2JqZWN0LCBhcmdTcGVjOiBBcmdTcGVjfVtdfSBGbGF0dGVuZWRTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcmdTcGVjWydkZWZhdWx0VmFsdWUnXX0gQXJnU3BlY0RlZmF1bHRWYWx1ZVxuICovXG5cbi8qKlxuICogZS5nLiBge2RyaXZlcjoge2ZvbzogJ2Jhcid9fWAgd2hlcmUgYGZvb2AgaXMgdGhlIGFyZyBuYW1lIGFuZCBgYmFyYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLFJlY29yZDxzdHJpbmcsQXJnU3BlY0RlZmF1bHRWYWx1ZT4+fSBOZXN0ZWRBcmdTcGVjRGVmYXVsdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBIZWxwZXIgdHlwZSBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmdldERlZmF1bHRzfVxuICogQHRlbXBsYXRlIHtib29sZWFufHVuZGVmaW5lZH0gRmxhdHRlbmVkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxGbGF0dGVuZWQgZXh0ZW5kcyB0cnVlID8gQXJnU3BlY0RlZmF1bHRWYWx1ZSA6IEFyZ1NwZWNEZWZhdWx0VmFsdWUgfCBOZXN0ZWRBcmdTcGVjRGVmYXVsdFZhbHVlPn0gRGVmYXVsdFZhbHVlc1xuICovXG4iXSwiZmlsZSI6ImxpYi9zY2hlbWEvc2NoZW1hLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
434
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvc2NoZW1hLmpzIl0sIm5hbWVzIjpbIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJTZXQiLCJBcHBpdW1TY2hlbWEiLCJjb25zdHJ1Y3RvciIsIlJlYWRvbmx5TWFwIiwiRFJJVkVSX1RZUEUiLCJNYXAiLCJQTFVHSU5fVFlQRSIsIl9hanYiLCJfaW5zdGFudGlhdGVBanYiLCJjcmVhdGUiLCJpbnN0YW5jZSIsIl9pbnN0YW5jZSIsIl8iLCJiaW5kQWxsIiwiaGFzUmVnaXN0ZXJlZFNjaGVtYSIsImV4dFR5cGUiLCJleHROYW1lIiwiX3JlZ2lzdGVyZWRTY2hlbWFzIiwiaGFzIiwiaXNGaW5hbGl6ZWQiLCJCb29sZWFuIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJnZXRBbGxBcmdTcGVjcyIsIl9hcmdTcGVjcyIsImZpbmFsaXplIiwiYWp2IiwiYmFzZVNjaGVtYSIsImNsb25lRGVlcCIsImFwcGl1bUNvbmZpZ1NjaGVtYSIsImFkZEFyZ1NwZWNzIiwic2NoZW1hIiwicHJvcE5hbWUiLCJwcm9wU2NoZW1hIiwiT2JqZWN0IiwiZW50cmllcyIsImFyZ1NwZWMiLCJBcmdTcGVjIiwiZGVzdCIsImFwcGl1bUNsaURlc3QiLCJkZWZhdWx0VmFsdWUiLCJkZWZhdWx0IiwiYXJnIiwic2V0Iiwib21pdCIsInByb3BlcnRpZXMiLCJzZXJ2ZXIiLCJmaW5hbGl6ZWRTY2hlbWFzIiwiZmluYWxTY2hlbWEiLCJyZWR1Y2UiLCJleHRlbnNpb25TY2hlbWFzIiwiZm9yRWFjaCIsIiRyZWYiLCJ0b1NjaGVtYUJhc2VSZWYiLCIkaWQiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsIiRjb21tZW50IiwidmFsaWRhdGVTY2hlbWEiLCJhZGRTY2hlbWEiLCJBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCIsImZyZWV6ZSIsIkFqdiIsImFsbEVycm9ycyIsImtleXdvcmRzIiwia2V5d29yZCIsImFkZEtleXdvcmQiLCJyZXNldCIsInNjaGVtYUlkIiwia2V5cyIsInJlbW92ZVNjaGVtYSIsInJlZ2lzdGVyU2NoZW1hIiwiaXNVbmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpc1N1cHBvcnRlZFNjaGVtYVR5cGUiLCJTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yIiwibm9ybWFsaXplZEV4dE5hbWUiLCJrZWJhYkNhc2UiLCJnZXQiLCJTY2hlbWFOYW1lQ29uZmxpY3RFcnJvciIsImdldEFyZ1NwZWMiLCJuYW1lIiwidG9BcmciLCJoYXNBcmdTcGVjIiwiZ2V0RGVmYXVsdHMiLCJmbGF0dGVuIiwiU2NoZW1hRmluYWxpemF0aW9uRXJyb3IiLCJyZWR1Y2VyIiwiZGVmYXVsdHMiLCJyZXR2YWwiLCJ2YWx1ZXMiLCJnZXREZWZhdWx0c0ZvckV4dGVuc2lvbiIsInNwZWNzIiwiZmlsdGVyIiwic3BlYyIsInJhd0Rlc3QiLCJnZXRTY2hlbWEiLCJzdGFjayIsInByZWZpeCIsImZsYXR0ZW5lZCIsInBhaXJzIiwidG9QYWlycyIsImtleSIsInZhbHVlIiwicHVzaCIsIlNFUlZFUl9QUk9QX05BTUUiLCJyZWZTY2hlbWEiLCJlcnIiLCJTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsIlJlZmVyZW5jZUVycm9yIiwicmVmIiwiX2dldFZhbGlkYXRvciIsImlkIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJpc0FycmF5IiwiZXJyb3JzIiwiaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiIsImZpbGVuYW1lIiwicGF0aCIsImV4dG5hbWUiLCJpc1BsYWluT2JqZWN0IiwiJGFzeW5jIiwiRXJyb3IiLCJkYXRhIiwibXNnIiwiaXNCb29sZWFuIiwiSlNPTiIsInN0cmluZ2lmeSIsImFwcGl1bVNjaGVtYSIsImZpbmFsaXplU2NoZW1hIiwicmVzZXRTY2hlbWEiLCJmbGF0dGVuU2NoZW1hIiwiZ2V0RGVmYXVsdHNGb3JTY2hlbWEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLTyxNQUFNQSx5QkFBeUIsR0FBRyxJQUFJQyxHQUFKLENBQVEsQ0FBQyxPQUFELEVBQVUsS0FBVixFQUFpQixNQUFqQixDQUFSLENBQWxDOzs7QUFPUCxNQUFNQyxZQUFOLENBQW1CO0FBbURqQkMsRUFBQUEsV0FBVyxHQUFJO0FBQUEscURBekNILElBQUlDLGtCQUFKLEVBeUNHO0FBQUEsOERBL0JNO0FBQUMsT0FBQ0MsNEJBQUQsR0FBZSxJQUFJQyxHQUFKLEVBQWhCO0FBQTJCLE9BQUNDLDRCQUFELEdBQWUsSUFBSUQsR0FBSjtBQUExQyxLQStCTjtBQUFBO0FBQUEsNkRBUEssSUFPTDtBQUNiLFNBQUtFLElBQUwsR0FBWU4sWUFBWSxDQUFDTyxlQUFiLEVBQVo7QUFDRDs7QUFTWSxTQUFOQyxNQUFNLEdBQUk7QUFBQTs7QUFDZixVQUFNQyxRQUFRLDRCQUFHVCxZQUFZLENBQUNVLFNBQWhCLHlFQUE2QixJQUFJVixZQUFKLEVBQTNDO0FBQ0FBLElBQUFBLFlBQVksQ0FBQ1UsU0FBYixHQUF5QkQsUUFBekI7O0FBRUFFLG9CQUFFQyxPQUFGLENBQVVILFFBQVYsRUFBb0IsQ0FDbEIsVUFEa0IsRUFFbEIsU0FGa0IsRUFHbEIsZ0JBSGtCLEVBSWxCLFlBSmtCLEVBS2xCLGFBTGtCLEVBTWxCLHlCQU5rQixFQU9sQixXQVBrQixFQVFsQixZQVJrQixFQVNsQixhQVRrQixFQVVsQixnQkFWa0IsRUFXbEIsT0FYa0IsRUFZbEIsVUFaa0IsQ0FBcEI7O0FBZUEsV0FBT0EsUUFBUDtBQUNEOztBQVVESSxFQUFBQSxtQkFBbUIsQ0FBRUMsT0FBRixFQUFXQyxPQUFYLEVBQW9CO0FBQ3JDLFdBQU8sS0FBS0Msa0JBQUwsQ0FBd0JGLE9BQXhCLEVBQWlDRyxHQUFqQyxDQUFxQ0YsT0FBckMsQ0FBUDtBQUNEOztBQU9ERyxFQUFBQSxXQUFXLEdBQUk7QUFDYixXQUFPQyxPQUFPLENBQUMsS0FBS0MsaUJBQU4sQ0FBZDtBQUNEOztBQUVEQyxFQUFBQSxjQUFjLEdBQUk7QUFDaEIsV0FBTyxLQUFLQyxTQUFaO0FBQ0Q7O0FBcUJEQyxFQUFBQSxRQUFRLEdBQUk7QUFDVixRQUFJLEtBQUtMLFdBQUwsRUFBSixFQUF3QjtBQUN0QixhQUNFLEtBQUtFLGlCQURQO0FBR0Q7O0FBRUQsVUFBTUksR0FBRyxHQUFHLEtBQUtsQixJQUFqQjs7QUFHQSxVQUFNbUIsVUFBVSxHQUFHZCxnQkFBRWUsU0FBRixDQUFZQywyQkFBWixDQUFuQjs7QUFRQSxVQUFNQyxXQUFXLEdBQUcsQ0FBQ0MsTUFBRCxFQUFTZixPQUFULEVBQWtCQyxPQUFsQixLQUE4QjtBQUNoRCxXQUFLLElBQUksQ0FBQ2UsUUFBRCxFQUFXQyxVQUFYLENBQVQsSUFBbUNDLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlSixNQUFmLENBQW5DLEVBQTJEO0FBQ3pELGNBQU1LLE9BQU8sR0FBR0MsaUJBQVEzQixNQUFSLENBQWVzQixRQUFmLEVBQXlCO0FBQ3ZDTSxVQUFBQSxJQUFJLEVBQUVMLFVBQVUsQ0FBQ00sYUFEc0I7QUFFdkNDLFVBQUFBLFlBQVksRUFBRVAsVUFBVSxDQUFDUSxPQUZjO0FBR3ZDekIsVUFBQUEsT0FIdUM7QUFJdkNDLFVBQUFBO0FBSnVDLFNBQXpCLENBQWhCOztBQU1BLGNBQU07QUFBQ3lCLFVBQUFBO0FBQUQsWUFBUU4sT0FBZDs7QUFDQSxhQUFLWixTQUFMLENBQWVtQixHQUFmLENBQW1CRCxHQUFuQixFQUF3Qk4sT0FBeEI7QUFDRDtBQUNGLEtBWEQ7O0FBYUFOLElBQUFBLFdBQVcsQ0FDVGpCLGdCQUFFK0IsSUFBRixDQUFPakIsVUFBVSxDQUFDa0IsVUFBWCxDQUFzQkMsTUFBdEIsQ0FBNkJELFVBQXBDLEVBQWdELENBQzlDeEMsNEJBRDhDLEVBRTlDRSw0QkFGOEMsQ0FBaEQsQ0FEUyxDQUFYO0FBVUEsVUFBTXdDLGdCQUFnQixHQUFHLEVBQXpCOztBQUVBLFVBQU1DLFdBQVcsR0FBR25DLGdCQUFFb0MsTUFBRixDQUNsQixLQUFLL0Isa0JBRGEsRUFPbEIsQ0FBQ1MsVUFBRCxFQUFhdUIsZ0JBQWIsRUFBK0JsQyxPQUEvQixLQUEyQztBQUN6Q2tDLE1BQUFBLGdCQUFnQixDQUFDQyxPQUFqQixDQUF5QixDQUFDcEIsTUFBRCxFQUFTZCxPQUFULEtBQXFCO0FBQzVDLGNBQU1tQyxJQUFJLEdBQUdmLGlCQUFRZ0IsZUFBUixDQUF3QnJDLE9BQXhCLEVBQWlDQyxPQUFqQyxDQUFiOztBQUNBYyxRQUFBQSxNQUFNLENBQUN1QixHQUFQLEdBQWFGLElBQWI7QUFDQXJCLFFBQUFBLE1BQU0sQ0FBQ3dCLG9CQUFQLEdBQThCLEtBQTlCO0FBQ0E1QixRQUFBQSxVQUFVLENBQUNrQixVQUFYLENBQXNCQyxNQUF0QixDQUE2QkQsVUFBN0IsQ0FBd0M3QixPQUF4QyxFQUFpRDZCLFVBQWpELENBQTRENUIsT0FBNUQsSUFDRTtBQUFDbUMsVUFBQUEsSUFBRDtBQUFPSSxVQUFBQSxRQUFRLEVBQUV2QztBQUFqQixTQURGO0FBRUFTLFFBQUFBLEdBQUcsQ0FBQytCLGNBQUosQ0FBbUIxQixNQUFuQixFQUEyQixJQUEzQjtBQUNBRCxRQUFBQSxXQUFXLENBQUNDLE1BQU0sQ0FBQ2MsVUFBUixFQUFvQjdCLE9BQXBCLEVBQTZCQyxPQUE3QixDQUFYO0FBQ0FTLFFBQUFBLEdBQUcsQ0FBQ2dDLFNBQUosQ0FBYzNCLE1BQWQsRUFBc0JxQixJQUF0QjtBQUNBTCxRQUFBQSxnQkFBZ0IsQ0FBQ0ssSUFBRCxDQUFoQixHQUE0RHJCLE1BQTVEO0FBQ0QsT0FWRDtBQVdBLGFBQU9KLFVBQVA7QUFDRCxLQXBCaUIsRUFxQmxCQSxVQXJCa0IsQ0FBcEI7O0FBd0JBRCxJQUFBQSxHQUFHLENBQUNnQyxTQUFKLENBQWNWLFdBQWQsRUFBMkJXLGdDQUEzQjtBQUNBWixJQUFBQSxnQkFBZ0IsQ0FBQ1ksZ0NBQUQsQ0FBaEIsR0FBNENYLFdBQTVDO0FBQ0F0QixJQUFBQSxHQUFHLENBQUMrQixjQUFKLENBQW1CVCxXQUFuQixFQUFnQyxJQUFoQztBQUVBLFNBQUsxQixpQkFBTCxHQUF5QnlCLGdCQUF6QjtBQUNBLFdBQU9iLE1BQU0sQ0FBQzBCLE1BQVAsQ0FBY2IsZ0JBQWQsQ0FBUDtBQUNEOztBQU9xQixTQUFmdEMsZUFBZSxHQUFJO0FBQ3hCLFVBQU1pQixHQUFHLEdBQUcseUJBQ1YsSUFBSW1DLFlBQUosQ0FBUTtBQUVOQyxNQUFBQSxTQUFTLEVBQUU7QUFGTCxLQUFSLENBRFUsQ0FBWjs7QUFRQWpELG9CQUFFc0MsT0FBRixDQUFVWSxrQkFBVixFQUFxQkMsT0FBRCxJQUFhO0FBQy9CdEMsTUFBQUEsR0FBRyxDQUFDdUMsVUFBSixDQUFlRCxPQUFmO0FBQ0QsS0FGRDs7QUFJQSxXQUFPdEMsR0FBUDtBQUNEOztBQWFEd0MsRUFBQUEsS0FBSyxHQUFJO0FBQ1AsU0FBSyxNQUFNQyxRQUFYLElBQXVCakMsTUFBTSxDQUFDa0MsSUFBUCwwQkFBWSxLQUFLOUMsaUJBQWpCLHlFQUFzQyxFQUF0QyxDQUF2QixFQUFrRTtBQUFBOztBQUNoRSxXQUFLZCxJQUFMLENBQVU2RCxZQUFWLENBQXVCRixRQUF2QjtBQUNEOztBQUNELFNBQUszQyxTQUFMLEdBQWlCLElBQUlwQixrQkFBSixFQUFqQjtBQUNBLFNBQUtjLGtCQUFMLEdBQTBCO0FBQ3hCLE9BQUNiLDRCQUFELEdBQWUsSUFBSUMsR0FBSixFQURTO0FBRXhCLE9BQUNDLDRCQUFELEdBQWUsSUFBSUQsR0FBSjtBQUZTLEtBQTFCO0FBSUEsU0FBS2dCLGlCQUFMLEdBQXlCLElBQXpCO0FBR0EsU0FBS2QsSUFBTCxHQUFZTixZQUFZLENBQUNPLGVBQWIsRUFBWjtBQUNEOztBQWNENkQsRUFBQUEsY0FBYyxDQUFFdEQsT0FBRixFQUFXQyxPQUFYLEVBQW9CYyxNQUFwQixFQUE0QjtBQUN4QyxRQUFJLEVBQUVmLE9BQU8sSUFBSUMsT0FBYixLQUF5QkosZ0JBQUUwRCxXQUFGLENBQWN4QyxNQUFkLENBQTdCLEVBQW9EO0FBQ2xELFlBQU0sSUFBSXlDLFNBQUosQ0FDSiwrREFESSxDQUFOO0FBR0Q7O0FBQ0QsUUFBSSxDQUFDdEUsWUFBWSxDQUFDdUUscUJBQWIsQ0FBbUMxQyxNQUFuQyxDQUFMLEVBQWlEO0FBQy9DLFlBQU0sSUFBSTJDLDRCQUFKLENBQWlDM0MsTUFBakMsRUFBeUNmLE9BQXpDLEVBQWtEQyxPQUFsRCxDQUFOO0FBQ0Q7O0FBQ0QsVUFBTTBELGlCQUFpQixHQUFHOUQsZ0JBQUUrRCxTQUFGLENBQVkzRCxPQUFaLENBQTFCOztBQUNBLFFBQUksS0FBS0YsbUJBQUwsQ0FBeUJDLE9BQXpCLEVBQWtDMkQsaUJBQWxDLENBQUosRUFBMEQ7QUFDeEQsVUFBSSxLQUFLekQsa0JBQUwsQ0FBd0JGLE9BQXhCLEVBQWlDNkQsR0FBakMsQ0FBcUNGLGlCQUFyQyxNQUE0RDVDLE1BQWhFLEVBQXdFO0FBQ3RFO0FBQ0Q7O0FBQ0QsWUFBTSxJQUFJK0MsdUJBQUosQ0FBNEI5RCxPQUE1QixFQUFxQ0MsT0FBckMsQ0FBTjtBQUNEOztBQUNELFNBQUtULElBQUwsQ0FBVWlELGNBQVYsQ0FBeUIxQixNQUF6QixFQUFpQyxJQUFqQzs7QUFFQSxTQUFLYixrQkFBTCxDQUF3QkYsT0FBeEIsRUFBaUMyQixHQUFqQyxDQUFxQ2dDLGlCQUFyQyxFQUF3RDVDLE1BQXhEO0FBQ0Q7O0FBU0RnRCxFQUFBQSxVQUFVLENBQUVDLElBQUYsRUFBUWhFLE9BQVIsRUFBaUJDLE9BQWpCLEVBQTBCO0FBQ2xDLFdBQU8sS0FBS08sU0FBTCxDQUFlcUQsR0FBZixDQUFtQnhDLGlCQUFRNEMsS0FBUixDQUFjRCxJQUFkLEVBQW9CaEUsT0FBcEIsRUFBNkJDLE9BQTdCLENBQW5CLENBQVA7QUFDRDs7QUFTRGlFLEVBQUFBLFVBQVUsQ0FBRUYsSUFBRixFQUFRaEUsT0FBUixFQUFpQkMsT0FBakIsRUFBMEI7QUFDbEMsV0FBTyxLQUFLTyxTQUFMLENBQWVMLEdBQWYsQ0FBbUJrQixpQkFBUTRDLEtBQVIsQ0FBY0QsSUFBZCxFQUFvQmhFLE9BQXBCLEVBQTZCQyxPQUE3QixDQUFuQixDQUFQO0FBQ0Q7O0FBY0RrRSxFQUFBQSxXQUFXLENBQUVDLE9BQU8sR0FBNkIsSUFBdEMsRUFBNkM7QUFDdEQsUUFBSSxDQUFDLEtBQUtoRSxXQUFMLEVBQUwsRUFBeUI7QUFDdkIsWUFBTSxJQUFJaUUsdUJBQUosRUFBTjtBQUNEOztBQVVELFVBQU1DLE9BQU8sR0FBR0YsT0FBTyxHQUNuQixDQUFDRyxRQUFELEVBQVc7QUFBQy9DLE1BQUFBLFlBQUQ7QUFBZUYsTUFBQUE7QUFBZixLQUFYLEtBQW9DO0FBQ3BDLFVBQUksQ0FBQ3pCLGdCQUFFMEQsV0FBRixDQUFjL0IsWUFBZCxDQUFMLEVBQWtDO0FBQ2hDK0MsUUFBQUEsUUFBUSxDQUFDakQsSUFBRCxDQUFSLEdBQWlCRSxZQUFqQjtBQUNEOztBQUNELGFBQU8rQyxRQUFQO0FBQ0QsS0FOb0IsR0FPbkIsQ0FBQ0EsUUFBRCxFQUFXO0FBQUMvQyxNQUFBQSxZQUFEO0FBQWVGLE1BQUFBO0FBQWYsS0FBWCxLQUFvQztBQUNwQyxVQUFJLENBQUN6QixnQkFBRTBELFdBQUYsQ0FBYy9CLFlBQWQsQ0FBTCxFQUFrQztBQUNoQzNCLHdCQUFFOEIsR0FBRixDQUFNNEMsUUFBTixFQUFnQmpELElBQWhCLEVBQXNCRSxZQUF0QjtBQUNEOztBQUNELGFBQU8rQyxRQUFQO0FBQ0QsS0FaSDtBQWVBLFVBQU1DLE1BQU0sR0FBRyxFQUFmO0FBQ0EsV0FBTyxDQUFDLEdBQUcsS0FBS2hFLFNBQUwsQ0FBZWlFLE1BQWYsRUFBSixFQUE2QnhDLE1BQTdCLENBQW9DcUMsT0FBcEMsRUFBNkNFLE1BQTdDLENBQVA7QUFDRDs7QUFTREUsRUFBQUEsdUJBQXVCLENBQUUxRSxPQUFGLEVBQVdDLE9BQVgsRUFBb0I7QUFDekMsUUFBSSxDQUFDLEtBQUtHLFdBQUwsRUFBTCxFQUF5QjtBQUN2QixZQUFNLElBQUlpRSx1QkFBSixFQUFOO0FBQ0Q7O0FBQ0QsVUFBTU0sS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLbkUsU0FBTCxDQUFlaUUsTUFBZixFQUFKLEVBQTZCRyxNQUE3QixDQUNYQyxJQUFELElBQVVBLElBQUksQ0FBQzdFLE9BQUwsS0FBaUJBLE9BQWpCLElBQTRCNkUsSUFBSSxDQUFDNUUsT0FBTCxLQUFpQkEsT0FEM0MsQ0FBZDtBQUdBLFdBQU8wRSxLQUFLLENBQUMxQyxNQUFOLENBQWEsQ0FBQ3NDLFFBQUQsRUFBVztBQUFDL0MsTUFBQUEsWUFBRDtBQUFlc0QsTUFBQUE7QUFBZixLQUFYLEtBQXVDO0FBQ3pELFVBQUksQ0FBQ2pGLGdCQUFFMEQsV0FBRixDQUFjL0IsWUFBZCxDQUFMLEVBQWtDO0FBQ2hDK0MsUUFBQUEsUUFBUSxDQUFDTyxPQUFELENBQVIsR0FBb0J0RCxZQUFwQjtBQUNEOztBQUNELGFBQU8rQyxRQUFQO0FBQ0QsS0FMTSxFQUtKLEVBTEksQ0FBUDtBQU1EOztBQWdCREgsRUFBQUEsT0FBTyxHQUFJO0FBQ1QsVUFBTXJELE1BQU0sR0FBRyxLQUFLZ0UsU0FBTCxFQUFmO0FBR0EsVUFBTUMsS0FBSyxHQUFHLENBQUM7QUFBQ25ELE1BQUFBLFVBQVUsRUFBRWQsTUFBTSxDQUFDYyxVQUFwQjtBQUFnQ29ELE1BQUFBLE1BQU0sRUFBRTtBQUF4QyxLQUFELENBQWQ7QUFFQSxVQUFNQyxTQUFTLEdBQUcsRUFBbEI7O0FBSUEsU0FBSyxNQUFNO0FBQUNyRCxNQUFBQSxVQUFEO0FBQWFvRCxNQUFBQTtBQUFiLEtBQVgsSUFBbUNELEtBQW5DLEVBQTBDO0FBQ3hDLFlBQU1HLEtBQUssR0FBR3RGLGdCQUFFdUYsT0FBRixDQUFVdkQsVUFBVixDQUFkOztBQUNBLFdBQUssTUFBTSxDQUFDd0QsR0FBRCxFQUFNQyxLQUFOLENBQVgsSUFBMkJILEtBQTNCLEVBQWtDO0FBQ2hDLGNBQU07QUFBQ3RELFVBQUFBLFVBQUQ7QUFBYU8sVUFBQUE7QUFBYixZQUFxQmtELEtBQTNCOztBQUNBLFlBQUl6RCxVQUFKLEVBQWdCO0FBQ2RtRCxVQUFBQSxLQUFLLENBQUNPLElBQU4sQ0FBVztBQUNUMUQsWUFBQUEsVUFEUztBQUVUb0QsWUFBQUEsTUFBTSxFQUFFSSxHQUFHLEtBQUtHLHlCQUFSLEdBQTJCLEVBQTNCLEdBQWdDLENBQUMsR0FBR1AsTUFBSixFQUFZSSxHQUFaO0FBRi9CLFdBQVg7QUFJRCxTQUxELE1BS08sSUFBSWpELElBQUosRUFBVTtBQUNmLGNBQUlxRCxTQUFKOztBQUNBLGNBQUk7QUFDRkEsWUFBQUEsU0FBUyxHQUFHLEtBQUtWLFNBQUwsQ0FBZTNDLElBQWYsQ0FBWjtBQUNELFdBRkQsQ0FFRSxPQUFPc0QsR0FBUCxFQUFZO0FBRVosa0JBQU0sSUFBSUMsd0JBQUosQ0FBNkJ2RCxJQUE3QixDQUFOO0FBQ0Q7O0FBQ0QsZ0JBQU07QUFBQ3VCLFlBQUFBO0FBQUQsY0FDSnRDLGlCQUFRdUUsNkJBQVIsQ0FBc0N4RCxJQUF0QyxDQURGOztBQUVBLGNBQUksQ0FBQ3VCLGlCQUFMLEVBQXdCO0FBRXRCLGtCQUFNLElBQUlrQyxjQUFKLENBQ0gscURBQW9EekQsSUFBSyxrQkFEdEQsQ0FBTjtBQUdEOztBQUNENEMsVUFBQUEsS0FBSyxDQUFDTyxJQUFOLENBQVc7QUFDVDFELFlBQUFBLFVBQVUsRUFBRTRELFNBQVMsQ0FBQzVELFVBRGI7QUFFVG9ELFlBQUFBLE1BQU0sRUFBRSxDQUFDLEdBQUdBLE1BQUosRUFBWUksR0FBWixFQUFpQjFCLGlCQUFqQjtBQUZDLFdBQVg7QUFJRCxTQXBCTSxNQW9CQSxJQUFJMEIsR0FBRyxLQUFLaEcsNEJBQVIsSUFBdUJnRyxHQUFHLEtBQUs5Riw0QkFBbkMsRUFBZ0Q7QUFDckQsZ0JBQU0sQ0FBQ1MsT0FBRCxFQUFVQyxPQUFWLElBQXFCZ0YsTUFBM0I7QUFDQSxnQkFBTTdELE9BQU8sR0FBRyxLQUFLMkMsVUFBTCxDQUNkc0IsR0FEYyxFQUVnQnJGLE9BRmhCLEVBR2RDLE9BSGMsQ0FBaEI7O0FBS0EsY0FBSSxDQUFDbUIsT0FBTCxFQUFjO0FBRVosa0JBQU0sSUFBSXlFLGNBQUosQ0FDSCw2QkFBNEJSLEdBQUksYUFBWXJGLE9BQVEsZ0JBQWVDLE9BQVEsa0JBRHhFLENBQU47QUFHRDs7QUFDRGlGLFVBQUFBLFNBQVMsQ0FBQ0ssSUFBVixDQUFlO0FBQUN4RSxZQUFBQSxNQUFNLEVBQUVsQixnQkFBRWUsU0FBRixDQUFZMEUsS0FBWixDQUFUO0FBQTZCbEUsWUFBQUE7QUFBN0IsV0FBZjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxXQUFPOEQsU0FBUDtBQUNEOztBQVNESCxFQUFBQSxTQUFTLENBQUVlLEdBQUcsR0FBR25ELGdDQUFSLEVBQWlDO0FBQ3hDLFdBQW9DLEtBQUtvRCxhQUFMLENBQW1CRCxHQUFuQixFQUF3Qi9FLE1BQTVEO0FBQ0Q7O0FBUURnRixFQUFBQSxhQUFhLENBQUVDLEVBQUUsR0FBR3JELGdDQUFQLEVBQWdDO0FBQzNDLFVBQU1zRCxTQUFTLEdBQUcsS0FBS3pHLElBQUwsQ0FBVXVGLFNBQVYsQ0FBb0JpQixFQUFwQixDQUFsQjs7QUFDQSxRQUFJLENBQUNDLFNBQUwsRUFBZ0I7QUFDZCxVQUFJRCxFQUFFLEtBQUtyRCxnQ0FBWCxFQUFvQztBQUNsQyxjQUFNLElBQUkwQix1QkFBSixFQUFOO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsY0FBTSxJQUFJc0Isd0JBQUosQ0FBNkJLLEVBQTdCLENBQU47QUFDRDtBQUNGOztBQUNELFdBQU9DLFNBQVA7QUFDRDs7QUFVREMsRUFBQUEsUUFBUSxDQUFFWixLQUFGLEVBQVNRLEdBQUcsR0FBR25ELGdDQUFmLEVBQXdDO0FBQzlDLFVBQU1zRCxTQUFTLEdBQUcsS0FBS0YsYUFBTCxDQUFtQkQsR0FBbkIsQ0FBbEI7O0FBQ0EsV0FBTyxDQUFDRyxTQUFTLENBQUNYLEtBQUQsQ0FBVixJQUFxQnpGLGdCQUFFc0csT0FBRixDQUFVRixTQUFTLENBQUNHLE1BQXBCLENBQXJCLEdBQ0gsQ0FBQyxHQUFHSCxTQUFTLENBQUNHLE1BQWQsQ0FERyxHQUVILEVBRko7QUFHRDs7QUFPa0MsU0FBNUJDLDRCQUE0QixDQUFFQyxRQUFGLEVBQVk7QUFDN0MsV0FBT3RILHlCQUF5QixDQUFDbUIsR0FBMUIsQ0FBOEJvRyxjQUFLQyxPQUFMLENBQWFGLFFBQWIsQ0FBOUIsQ0FBUDtBQUNEOztBQU8yQixTQUFyQjdDLHFCQUFxQixDQUFFMUMsTUFBRixFQUFVO0FBQ3BDLFdBQU9sQixnQkFBRTRHLGFBQUYsQ0FBZ0IxRixNQUFoQixLQUEyQkEsTUFBTSxDQUFDMkYsTUFBUCxLQUFrQixJQUFwRDtBQUNEOztBQXpmZ0I7OzhCQUFieEgsWTs7QUFnZ0JDLE1BQU1tRix1QkFBTixTQUFzQ3NDLEtBQXRDLENBQTRDO0FBTWpEeEgsRUFBQUEsV0FBVyxHQUFJO0FBQ2IsVUFBTSw4REFBTjtBQURhLGdEQUZSLCtCQUVRO0FBRWQ7O0FBUmdEOzs7O0FBZ0I1QyxNQUFNMkUsdUJBQU4sU0FBc0M2QyxLQUF0QyxDQUE0QztBQWVqRHhILEVBQUFBLFdBQVcsQ0FBRWEsT0FBRixFQUFXQyxPQUFYLEVBQW9CO0FBQzdCLFVBQ0csWUFBV0QsT0FBUSxZQUFXQyxPQUFRLHFDQUR6QztBQUQ2QixnREFYeEIsZ0NBV3dCO0FBQUE7QUFJN0IsU0FBSzJHLElBQUwsR0FBWTtBQUFDNUcsTUFBQUEsT0FBRDtBQUFVQyxNQUFBQTtBQUFWLEtBQVo7QUFDRDs7QUFwQmdEOzs7O0FBMEI1QyxNQUFNMEYsd0JBQU4sU0FBdUNFLGNBQXZDLENBQXNEO0FBYzNEMUcsRUFBQUEsV0FBVyxDQUFFZ0UsUUFBRixFQUFZO0FBQ3JCLFVBQU8sb0JBQW1CQSxRQUFTLEdBQW5DO0FBRHFCLGdEQVZoQixpQ0FVZ0I7QUFBQTtBQUVyQixTQUFLeUQsSUFBTCxHQUFZO0FBQUN6RCxNQUFBQTtBQUFELEtBQVo7QUFDRDs7QUFqQjBEOzs7O0FBMEJ0RCxNQUFNTyw0QkFBTixTQUEyQ0YsU0FBM0MsQ0FBcUQ7QUFnQjFEckUsRUFBQUEsV0FBVyxDQUFFNEIsTUFBRixFQUFVZixPQUFWLEVBQW1CQyxPQUFuQixFQUE0QjtBQUVyQyxVQUNFLENBQUMsTUFBTTtBQUNMLFVBQUk0RyxHQUFHLEdBQUksMkJBQTBCN0csT0FBUSxLQUFJQyxPQUFRLElBQXpEOztBQUNBLFVBQUlKLGdCQUFFaUgsU0FBRixDQUFZL0YsTUFBWixDQUFKLEVBQXlCO0FBQ3ZCLGVBQVEsR0FBRThGLEdBQUksNkJBQWQ7QUFDRDs7QUFDRCxVQUFJaEgsZ0JBQUU0RyxhQUFGLENBQWdCMUYsTUFBaEIsQ0FBSixFQUE2QjtBQUMzQixZQUFJQSxNQUFNLENBQUMyRixNQUFYLEVBQW1CO0FBQ2pCLGlCQUFRLEdBQUVHLEdBQUksbUNBQWQ7QUFDRDs7QUFFRCxjQUFNLElBQUlyRCxTQUFKLENBQ0gsMEZBQXlGdUQsSUFBSSxDQUFDQyxTQUFMLENBQ3hGakcsTUFEd0YsQ0FFeEYsRUFIRSxDQUFOO0FBS0Q7O0FBQ0QsYUFBUSxHQUFFOEYsR0FBSSxpRUFBZDtBQUNELEtBakJELEdBREY7QUFGcUMsZ0RBWmhDLHFDQVlnQztBQUFBO0FBc0JyQyxTQUFLRCxJQUFMLEdBQVk7QUFBQzdGLE1BQUFBLE1BQUQ7QUFBU2YsTUFBQUEsT0FBVDtBQUFrQkMsTUFBQUE7QUFBbEIsS0FBWjtBQUNEOztBQXZDeUQ7OztBQTBDNUQsTUFBTWdILFlBQVksR0FBRy9ILFlBQVksQ0FBQ1EsTUFBYixFQUFyQjtBQUVPLE1BQU07QUFDWDRELEVBQUFBLGNBRFc7QUFFWC9DLEVBQUFBLGNBRlc7QUFHWHdELEVBQUFBLFVBSFc7QUFJWEcsRUFBQUEsVUFKVztBQUtYOUQsRUFBQUEsV0FMVztBQU1YSyxFQUFBQSxRQUFRLEVBQUV5RyxjQU5DO0FBT1hoRSxFQUFBQSxLQUFLLEVBQUVpRSxXQVBJO0FBUVhqQixFQUFBQSxRQVJXO0FBU1huQixFQUFBQSxTQVRXO0FBVVhYLEVBQUFBLE9BQU8sRUFBRWdELGFBVkU7QUFXWGpELEVBQUFBLFdBQVcsRUFBRWtELG9CQVhGO0FBWVgzQyxFQUFBQTtBQVpXLElBYVR1QyxZQWJHOzs7Ozs7Ozs7Ozs7O0FBY0EsTUFBTTtBQUFDWixFQUFBQTtBQUFELElBQWlDbkgsWUFBdkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEFqdiBmcm9tICdhanYnO1xuaW1wb3J0IGFkZEZvcm1hdHMgZnJvbSAnYWp2LWZvcm1hdHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBSZWFkb25seU1hcCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBhcHBpdW1Db25maWdTY2hlbWEgZnJvbSAnLi9hcHBpdW0tY29uZmlnLXNjaGVtYSc7XG5pbXBvcnQgeyBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCwgQXJnU3BlYywgU0VSVkVSX1BST1BfTkFNRSB9IGZyb20gJy4vYXJnLXNwZWMnO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tICcuL2tleXdvcmRzJztcblxuLyoqXG4gKiBFeHRlbnNpb25zIHRoYXQgYW4gZXh0ZW5zaW9uIHNjaGVtYSBmaWxlIGNhbiBoYXZlLlxuICovXG5leHBvcnQgY29uc3QgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuanNvbicsICcuanMnLCAnLmNqcyddKTtcblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIEFqdiBhbmQgc2NoZW1hLXJlbGF0ZWQgZnVuY3Rpb25zLlxuICpcbiAqIFNob3VsZCBoYXZlIGJlZW4gbmFtZWQgSGlnaGxhbmRlciwgYmVjYXVzZSBfdGhlcmUgY2FuIG9ubHkgYmUgb25lX1xuICovXG5jbGFzcyBBcHBpdW1TY2hlbWEge1xuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHVuaXF1ZSBhcmd1bWVudCBJRHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY31zLlxuICAgKlxuICAgKiBBbiBcImFyZ3VtZW50XCIgaXMgYSBDTEkgYXJndW1lbnQgb3IgYSBjb25maWcgcHJvcGVydHkuXG4gICAqXG4gICAqIFVzZWQgdG8gcHJvdmlkZSBlYXN5IGxvb2t1cHMgb2YgYXJndW1lbnQgbWV0YWRhdGEgd2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBvZiB0aG9zZSBhcmd1bWVudHMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWFkb25seU1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUmVhZG9ubHlNYXAoKTtcblxuICAvKipcbiAgICogQSBtYXAgb2YgZXh0ZW5zaW9uIHR5cGVzIHRvIGV4dGVuc2lvbiBuYW1lcyB0byBzY2hlbWEgb2JqZWN0cy5cbiAgICpcbiAgICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbmFtaW5nIGNvbmZsaWN0cy4gVGhlIHNjaGVtYXNcbiAgICogYXJlIHN0b3JlZCBoZXJlIGluIG1lbW9yeSB1bnRpbCB0aGUgaW5zdGFuY2UgaXMgX2ZpbmFsaXplZF8uXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8RXh0ZW5zaW9uVHlwZSxNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD4+fVxuICAgKi9cbiAgX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1tEUklWRVJfVFlQRV06IG5ldyBNYXAoKSwgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpfTtcblxuICAvKipcbiAgICogQWp2IGluc3RhbmNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBanZ9XG4gICAqL1xuICBfYWp2O1xuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBcHBpdW1TY2hlbWF9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbmNlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgb2Ygc2NoZW1hIElEcyB0byBmaW5hbGl6ZWQgc2NoZW1hcy5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHJlZmVyZW5jZXMsIGJ1dCByYXRoZXIgdGhlIHJvb3Qgc2NoZW1hcyB0aGVtc2VsdmVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+P31cbiAgICovXG4gIF9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgQWp2LCBhZGRzIHN0YW5kYXJkIGZvcm1hdHMgYW5kIG91ciBjdXN0b20ga2V5d29yZHMuXG4gICAqIEBzZWUgaHR0cHM6Ly9ucG0uaW0vYWp2LWZvcm1hdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBmdW5jdGlvbiBmb3Ige0BsaW5rIEFwcGl1bVNjaGVtYX0gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBjcmVhdGVzIGEgbmV3IG9uZS5cbiAgICogQmluZHMgcHVibGljIG1ldGhvZHMgdG8gdGhlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7QXBwaXVtU2NoZW1hfVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZSAoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID8/IG5ldyBBcHBpdW1TY2hlbWEoKTtcbiAgICBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgICBfLmJpbmRBbGwoaW5zdGFuY2UsIFtcbiAgICAgICdmaW5hbGl6ZScsXG4gICAgICAnZmxhdHRlbicsXG4gICAgICAnZ2V0QWxsQXJnU3BlY3MnLFxuICAgICAgJ2dldEFyZ1NwZWMnLFxuICAgICAgJ2dldERlZmF1bHRzJyxcbiAgICAgICdnZXREZWZhdWx0c0ZvckV4dGVuc2lvbicsXG4gICAgICAnZ2V0U2NoZW1hJyxcbiAgICAgICdoYXNBcmdTcGVjJyxcbiAgICAgICdpc0ZpbmFsaXplZCcsXG4gICAgICAncmVnaXN0ZXJTY2hlbWEnLFxuICAgICAgJ3Jlc2V0JyxcbiAgICAgICd2YWxpZGF0ZScsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzY2hlbWEgaGFzIGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBnaXZlbiBleHRlbnNpb24gdHlwZSBhbmQgbmFtZS5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gd2hldGhlciBvciBub3QgdGhlIGluc3RhbmNlIGhhcyBiZWVuIF9maW5hbGl6ZWRfLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IElmIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc1JlZ2lzdGVyZWRTY2hlbWEgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uaGFzKGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBgdHJ1ZWAgaWYge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZSBmaW5hbGl6ZX0gaGFzIGJlZW4gY2FsbGVkXG4gICAqIHN1Y2Nlc3NmdWxseSBhbmQge0BsaW5rIEFwcGl1bVNjaGVtYS5yZXNldCByZXNldH0gaGFzIG5vdCBiZWVuIGNhbGxlZCBzaW5jZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IElmIGZpbmFsaXplZFxuICAgKi9cbiAgaXNGaW5hbGl6ZWQgKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMpO1xuICB9XG5cbiAgZ2V0QWxsQXJnU3BlY3MgKCkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgd2hlbiBubyBtb3JlIHNjaGVtYXMgd2lsbCBiZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzOlxuICAgKiAxLiBJdCBjb21iaW5lcyBhbGwgc2NoZW1hcyBmcm9tIGV4dGVuc2lvbnMgaW50byB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEsXG4gICAqICAgIHRoZW4gYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSBgQWp2YCBpbnN0YW5jZS5cbiAgICogMi4gSXQgYWRkcyBzY2hlbWFzIGZvciBfZWFjaF8gYXJndW1lbnQvcHJvcGVydHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqICAgIFRoZSBDTEkgdXNlcyB0aGVzZSBzY2hlbWFzIHRvIHZhbGlkYXRlIHNwZWNpZmljIGFyZ3VtZW50cy5cbiAgICogMy4gVGhlIHNjaGVtYXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3ICh3aGljaCBpcyB0aGVcbiAgICogICAgb25seSBvbmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSlcbiAgICpcbiAgICogQW55IG1ldGhvZCBpbiB0aGlzIGluc3RhbmNlIHRoYXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogd2lsbCB0aHJvdyBpZiB0aGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQsIHRoaXMgaXMgYSBuby1vcC5cbiAgICogQHB1YmxpY1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBub3QgdmFsaWRcbiAgICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj59IFJlY29yZCBvZiBzY2hlbWEgSURzIHRvIGZ1bGwgc2NoZW1hIG9iamVjdHNcbiAgICovXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD59ICovIChcbiAgICAgICAgdGhpcy5fZmluYWxpemVkU2NoZW1hc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhanYgPSB0aGlzLl9hanY7XG5cbiAgICAvLyBBanYgd2lsbCBfbXV0YXRlXyB0aGUgc2NoZW1hLCBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0LlxuICAgIGNvbnN0IGJhc2VTY2hlbWEgPSBfLmNsb25lRGVlcChhcHBpdW1Db25maWdTY2hlbWEpO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hXG4gICAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdXG4gICAgICovXG4gICAgY29uc3QgYWRkQXJnU3BlY3MgPSAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSA9PiB7XG4gICAgICBmb3IgKGxldCBbcHJvcE5hbWUsIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgY29uc3QgYXJnU3BlYyA9IEFyZ1NwZWMuY3JlYXRlKHByb3BOYW1lLCB7XG4gICAgICAgICAgZGVzdDogcHJvcFNjaGVtYS5hcHBpdW1DbGlEZXN0LFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcFNjaGVtYS5kZWZhdWx0LFxuICAgICAgICAgIGV4dFR5cGUsXG4gICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHthcmd9ID0gYXJnU3BlYztcbiAgICAgICAgdGhpcy5fYXJnU3BlY3Muc2V0KGFyZywgYXJnU3BlYyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZEFyZ1NwZWNzKFxuICAgICAgXy5vbWl0KGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllcywgW1xuICAgICAgICBEUklWRVJfVFlQRSxcbiAgICAgICAgUExVR0lOX1RZUEUsXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pn1cbiAgICAgKi9cbiAgICBjb25zdCBmaW5hbGl6ZWRTY2hlbWFzID0ge307XG5cbiAgICBjb25zdCBmaW5hbFNjaGVtYSA9IF8ucmVkdWNlKFxuICAgICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMsXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7dHlwZW9mIGJhc2VTY2hlbWF9IGJhc2VTY2hlbWFcbiAgICAgICAqIEBwYXJhbSB7TWFwPHN0cmluZyxTY2hlbWFPYmplY3Q+fSBleHRlbnNpb25TY2hlbWFzXG4gICAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICAgICAqL1xuICAgICAgKGJhc2VTY2hlbWEsIGV4dGVuc2lvblNjaGVtYXMsIGV4dFR5cGUpID0+IHtcbiAgICAgICAgZXh0ZW5zaW9uU2NoZW1hcy5mb3JFYWNoKChzY2hlbWEsIGV4dE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCAkcmVmID0gQXJnU3BlYy50b1NjaGVtYUJhc2VSZWYoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgICAgICAgc2NoZW1hLiRpZCA9ICRyZWY7XG4gICAgICAgICAgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7IC8vIHRoaXMgbWFrZXMgYHNjaGVtYWAgYmVjb21lIGEgYFN0cmljdFNjaGVtYU9iamVjdGBcbiAgICAgICAgICBiYXNlU2NoZW1hLnByb3BlcnRpZXMuc2VydmVyLnByb3BlcnRpZXNbZXh0VHlwZV0ucHJvcGVydGllc1tleHROYW1lXSA9XG4gICAgICAgICAgICB7JHJlZiwgJGNvbW1lbnQ6IGV4dE5hbWV9O1xuICAgICAgICAgIGFqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuICAgICAgICAgIGFkZEFyZ1NwZWNzKHNjaGVtYS5wcm9wZXJ0aWVzLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBhanYuYWRkU2NoZW1hKHNjaGVtYSwgJHJlZik7XG4gICAgICAgICAgZmluYWxpemVkU2NoZW1hc1skcmVmXSA9IC8qKiBAdHlwZSB7U3RyaWN0U2NoZW1hT2JqZWN0fSAqLyAoc2NoZW1hKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiYXNlU2NoZW1hO1xuICAgICAgfSxcbiAgICAgIGJhc2VTY2hlbWEsXG4gICAgKTtcblxuICAgIGFqdi5hZGRTY2hlbWEoZmluYWxTY2hlbWEsIEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKTtcbiAgICBmaW5hbGl6ZWRTY2hlbWFzW0FQUElVTV9DT05GSUdfU0NIRU1BX0lEXSA9IGZpbmFsU2NoZW1hO1xuICAgIGFqdi52YWxpZGF0ZVNjaGVtYShmaW5hbFNjaGVtYSwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gZmluYWxpemVkU2NoZW1hcztcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShmaW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIGFuZCBjcmVhdGVzIGFuIEFqdiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge0Fqdn1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFudGlhdGVBanYgKCkge1xuICAgIGNvbnN0IGFqdiA9IGFkZEZvcm1hdHMoXG4gICAgICBuZXcgQWp2KHtcbiAgICAgICAgLy8gd2l0aG91dCB0aGlzIG5vdCBtdWNoIHZhbGlkYXRpb24gYWN0dWFsbHkgaGFwcGVuc1xuICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gYWRkIGN1c3RvbSBrZXl3b3JkcyB0byBhanYuIHNlZSBzY2hlbWEta2V5d29yZHMuanNcbiAgICBfLmZvckVhY2goa2V5d29yZHMsIChrZXl3b3JkKSA9PiB7XG4gICAgICBhanYuYWRkS2V5d29yZChrZXl3b3JkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhanY7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2UgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLlxuICAgKlxuICAgKiAtIFJlbW92ZXMgYWxsIGFkZGVkIHNjaGVtYXMgZnJvbSB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiB7QGxpbmsgQXJnU3BlYyBBcmdTcGVjc31cbiAgICogLSBSZXNldHMgdGhlIG1hcCBvZiByZWdpc3RlcmVkIHNjaGVtYXNcbiAgICogLSBTZXRzIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hLl9maW5hbGl6ZWQgX2ZpbmFsaXplZH0gZmxhZyB0byBgZmFsc2VgXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0gYWdhaW4sIHlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyBmaXJzdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXNldCAoKSB7XG4gICAgZm9yIChjb25zdCBzY2hlbWFJZCBvZiBPYmplY3Qua2V5cyh0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID8/IHt9KSkge1xuICAgICAgdGhpcy5fYWp2LnJlbW92ZVNjaGVtYShzY2hlbWFJZCk7XG4gICAgfVxuICAgIHRoaXMuX2FyZ1NwZWNzID0gbmV3IFJlYWRvbmx5TWFwKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMgPSB7XG4gICAgICBbRFJJVkVSX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgICBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAgIC8vIEFqdiBzZWVtcyB0byBoYXZlIGFuIG92ZXItZWFnZXIgY2FjaGUsIHNvIHdlIGhhdmUgdG8gZHVtcCB0aGUgb2JqZWN0IGVudGlyZWx5LlxuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzY2hlbWEgZnJvbSBhbiBleHRlbnNpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgXCJmYWlsLWZhc3RcIiBpbiB0aGF0IHRoZSBzY2hlbWEgd2lsbCBpbW1lZGlhdGVseSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBKU09OIHNjaGVtYSBkcmFmdC0wNyBfb3JfIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiB0aGUgc2NoZW1hJ3MgYCRzY2hlbWFgIHByb3AgaXMuXG4gICAqXG4gICAqIERvZXMgX25vdF8gYWRkIHRoZSBzY2hlbWEgdG8gdGhlIGBhanZgIGluc3RhbmNlICh0aGlzIGlzIGRvbmUgYnkge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0pLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIFVuaXF1ZSBleHRlbnNpb24gbmFtZSBmb3IgYHR5cGVgXG4gICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWEgLSBTY2hlbWEgb2JqZWN0XG4gICAqIEB0aHJvd3Mge1NjaGVtYU5hbWVDb25mbGljdEVycm9yfSBJZiB0aGUgc2NoZW1hIGlzIGFuIGludmFsaWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWdpc3RlclNjaGVtYSAoZXh0VHlwZSwgZXh0TmFtZSwgc2NoZW1hKSB7XG4gICAgaWYgKCEoZXh0VHlwZSAmJiBleHROYW1lKSB8fCBfLmlzVW5kZWZpbmVkKHNjaGVtYSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdFeHBlY3RlZCBleHRlbnNpb24gdHlwZSwgZXh0ZW5zaW9uIG5hbWUsIGFuZCBhIGRlZmluZWQgc2NoZW1hJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghQXBwaXVtU2NoZW1hLmlzU3VwcG9ydGVkU2NoZW1hVHlwZShzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvcihzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkRXh0TmFtZSA9IF8ua2ViYWJDYXNlKGV4dE5hbWUpO1xuICAgIGlmICh0aGlzLmhhc1JlZ2lzdGVyZWRTY2hlbWEoZXh0VHlwZSwgbm9ybWFsaXplZEV4dE5hbWUpKSB7XG4gICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uZ2V0KG5vcm1hbGl6ZWRFeHROYW1lKSA9PT0gc2NoZW1hKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBTY2hlbWFOYW1lQ29uZmxpY3RFcnJvcihleHRUeXBlLCBleHROYW1lKTtcbiAgICB9XG4gICAgdGhpcy5fYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG5cbiAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5zZXQobm9ybWFsaXplZEV4dE5hbWUsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHtAbGluayBBcmdTcGVjfSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge0FyZ1NwZWN8dW5kZWZpbmVkfSBBcmdTcGVjIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0QXJnU3BlYyAobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5nZXQoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGluc3RhbmNlIGtub3dzIGFib3V0IGFuIGFyZ3VtZW50IGJ5IHRoZSBnaXZlbiBgbmFtZWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBzdWNoIGFuIHtAbGluayBBcmdTcGVjfSBleGlzdHNcbiAgICovXG4gIGhhc0FyZ1NwZWMgKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJnU3BlY3MuaGFzKEFyZ1NwZWMudG9BcmcobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBgUmVjb3JkYCBvZiBhcmd1bWVudCBcImRlc3RcIiBzdHJpbmdzIHRvIGRlZmF1bHQgdmFsdWVzLlxuICAgKlxuICAgKiBUaGUgXCJkZXN0XCIgc3RyaW5nIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGluIG9iamVjdCByZXR1cm5lZCBieVxuICAgKiBgYXJncGFyc2UuQXJndW1lbnRQYXJzZXJbJ3BhcnNlX2FyZ3MnXWAuXG4gICAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbnx1bmRlZmluZWR9IEZsYXR0ZW5lZFxuICAgKiBAcGFyYW0ge0ZsYXR0ZW5lZH0gW2ZsYXR0ZW49dHJ1ZV0gLSBJZiBgdHJ1ZWAsIGZsYXR0ZW5zIHRoZSByZXR1cm5lZCBvYmplY3RcbiAgICogdXNpbmcgXCJrZXlwYXRoXCItc3R5bGUga2V5cyBvZiB0aGUgZm9ybWF0IGA8ZXh0VHlwZT4uPGV4dE5hbWU+LjxhcmdOYW1lPmAuXG4gICAqIE90aGVyd2lzZSwgcmV0dXJucyBhIG5lc3RlZCBvYmplY3QgdXNpbmcgYGV4dFR5cGVgIGFuZCBgZXh0TmFtZWAgYXNcbiAgICogcHJvcGVydGllcy4gQmFzZSBhcmd1bWVudHMgKHNlcnZlciBhcmd1bWVudHMpIGFyZSBhbHdheXMgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICogQHJldHVybnMge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn1cbiAgICovXG4gIGdldERlZmF1bHRzIChmbGF0dGVuID0gLyoqIEB0eXBlIHtGbGF0dGVuZWR9ICovICh0cnVlKSkge1xuICAgIGlmICghdGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjYWxsYmFjayBEZWZhdWx0UmVkdWNlclxuICAgICAqIEBwYXJhbSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSBkZWZhdWx0c1xuICAgICAqIEBwYXJhbSB7QXJnU3BlY30gYXJnU3BlY1xuICAgICAqIEByZXR1cm5zIHtEZWZhdWx0VmFsdWVzPEZsYXR0ZW5lZD59XG4gICAgICovXG4gICAgLyoqIEB0eXBlIHtEZWZhdWx0UmVkdWNlcn0gKi9cbiAgICBjb25zdCByZWR1Y2VyID0gZmxhdHRlblxuICAgICAgPyAoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIGRlc3R9KSA9PiB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgZGVmYXVsdHNbZGVzdF0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgfVxuICAgICAgOiAoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIGRlc3R9KSA9PiB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgXy5zZXQoZGVmYXVsdHMsIGRlc3QsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgfTtcblxuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSAqL1xuICAgIGNvbnN0IHJldHZhbCA9IHt9O1xuICAgIHJldHVybiBbLi4udGhpcy5fYXJnU3BlY3MudmFsdWVzKCldLnJlZHVjZShyZWR1Y2VyLCByZXR2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmbGF0dGVuZWQgUmVjb3JkIG9mIGRlZmF1bHRzIGZvciBhIHNwZWNpZmljIGV4dGVuc2lvbi4gS2V5cyB3aWxsXG4gICAqIGJlIG9mIGZvcm1hdCBgPGFyZ05hbWU+YC5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPn1cbiAgICovXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgIH1cbiAgICBjb25zdCBzcGVjcyA9IFsuLi50aGlzLl9hcmdTcGVjcy52YWx1ZXMoKV0uZmlsdGVyKFxuICAgICAgKHNwZWMpID0+IHNwZWMuZXh0VHlwZSA9PT0gZXh0VHlwZSAmJiBzcGVjLmV4dE5hbWUgPT09IGV4dE5hbWUsXG4gICAgKTtcbiAgICByZXR1cm4gc3BlY3MucmVkdWNlKChkZWZhdWx0cywge2RlZmF1bHRWYWx1ZSwgcmF3RGVzdH0pID0+IHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGRlZmF1bHRzW3Jhd0Rlc3RdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVuIHNjaGVtYSBpbnRvIGFuIGFycmF5IG9mIGBTY2hlbWFPYmplY3RgcyBhbmQgYXNzb2NpYXRlZFxuICAgKiB7QGxpbmsgQXJnU3BlYyBBcmdTcGVjc30uXG4gICAqXG4gICAqIENvbnZlcnRzIG5lc3RlZCBleHRlbnNpb24gc2NoZW1hcyB0byBrZXlzIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gdHlwZSBhbmRcbiAgICogbmFtZS4gVXNlZCB3aGVuIHRyYW5zbGF0aW5nIHRvIGBhcmdwYXJzZWAgb3B0aW9ucyBvciBnZXR0aW5nIHRoZSBsaXN0IG9mXG4gICAqIGRlZmF1bHQgdmFsdWVzIChzZWUge0BsaW5rIEFwcGl1bVNjaGVtYS5nZXREZWZhdWx0c30pIGZvciBDTEkgb3Igb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVybWVkaWF0ZSByZXByc2VudGF0aW9uIHVzZWQgYnkgYGNsaS1hcmdzYFxuICAgKiBtb2R1bGUncyBgdG9QYXJzZXJBcmdzYCwgd2hpY2ggY29udmVydHMgdGhlIGZpbmFsaXplZCBzY2hlbWEgdG8gcGFyYW1ldGVyc1xuICAgKiB1c2VkIGJ5IGBhcmdwYXJzZWAuXG4gICAqIEB0aHJvd3MgSWYge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0gaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQuXG4gICAqIEByZXR1cm5zIHtGbGF0dGVuZWRTY2hlbWF9XG4gICAqL1xuICBmbGF0dGVuICgpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpO1xuXG4gICAgLyoqIEB0eXBlIHsge3Byb3BlcnRpZXM6IFNjaGVtYU9iamVjdCwgcHJlZml4OiBzdHJpbmdbXX1bXSB9ICovXG4gICAgY29uc3Qgc3RhY2sgPSBbe3Byb3BlcnRpZXM6IHNjaGVtYS5wcm9wZXJ0aWVzLCBwcmVmaXg6IFtdfV07XG4gICAgLyoqIEB0eXBlIHtGbGF0dGVuZWRTY2hlbWF9ICovXG4gICAgY29uc3QgZmxhdHRlbmVkID0gW107XG5cbiAgICAvLyB0aGlzIGJpdCBpcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gcmV3cml0dGVuIGFzIGEgZm9yIGxvb3AuXG4gICAgLy8gd2hlbiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSB3YW50IHRvIHRyYXZlcnNlLCB3ZSBhZGQgaXQgdG8gYHN0YWNrYFxuICAgIGZvciAoY29uc3Qge3Byb3BlcnRpZXMsIHByZWZpeH0gb2Ygc3RhY2spIHtcbiAgICAgIGNvbnN0IHBhaXJzID0gXy50b1BhaXJzKHByb3BlcnRpZXMpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qge3Byb3BlcnRpZXMsICRyZWZ9ID0gdmFsdWU7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBrZXkgPT09IFNFUlZFUl9QUk9QX05BTUUgPyBbXSA6IFsuLi5wcmVmaXgsIGtleV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHJlZikge1xuICAgICAgICAgIGxldCByZWZTY2hlbWE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlZlNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCRyZWYpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIGFuIGV4dGVuc2lvbiBzY2hlbWEgc3VwcGxpZXMgYSAkcmVmIHRvIGEgbm9uLWV4aXN0ZW50IHNjaGVtYVxuICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcigkcmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge25vcm1hbGl6ZWRFeHROYW1lfSA9XG4gICAgICAgICAgICBBcmdTcGVjLmV4dGVuc2lvbkluZm9Gcm9tUm9vdFNjaGVtYUlkKCRyZWYpO1xuICAgICAgICAgIGlmICghbm9ybWFsaXplZEV4dE5hbWUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGV4dGVuc2lvbiBuYW1lIGZyb20gc2NoZW1hIElEICR7JHJlZn0uIFRoaXMgaXMgYSBidWcuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydGllczogcmVmU2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBwcmVmaXg6IFsuLi5wcmVmaXgsIGtleSwgbm9ybWFsaXplZEV4dE5hbWVdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gRFJJVkVSX1RZUEUgJiYga2V5ICE9PSBQTFVHSU5fVFlQRSkge1xuICAgICAgICAgIGNvbnN0IFtleHRUeXBlLCBleHROYW1lXSA9IHByZWZpeDtcbiAgICAgICAgICBjb25zdCBhcmdTcGVjID0gdGhpcy5nZXRBcmdTcGVjKFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtFeHRlbnNpb25UeXBlfSAqLyAoZXh0VHlwZSksXG4gICAgICAgICAgICBleHROYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFhcmdTcGVjKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgVW5rbm93biBhcmd1bWVudCB3aXRoIGtleSAke2tleX0sIGV4dFR5cGUgJHtleHRUeXBlfSBhbmQgZXh0TmFtZSAke2V4dE5hbWV9LiBUaGlzIGlzIGEgYnVnLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbGF0dGVuZWQucHVzaCh7c2NoZW1hOiBfLmNsb25lRGVlcCh2YWx1ZSksIGFyZ1NwZWN9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgaXRzZWxmXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWZdIC0gU2NoZW1hIElEXG4gICAqIEB0aHJvd3MgSWYgdGhlIHNjaGVtYSBoYXMgbm90IHlldCBiZWVuIGZpbmFsaXplZFxuICAgKiBAcmV0dXJucyB7U2NoZW1hT2JqZWN0fVxuICAgKi9cbiAgZ2V0U2NoZW1hIChyZWYgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1NjaGVtYU9iamVjdH0gKi8gKHRoaXMuX2dldFZhbGlkYXRvcihyZWYpLnNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHNjaGVtYSB2YWxpZGF0b3IgZnVuY3Rpb24gZnJvbSBBanZcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtpZF0gLSBTY2hlbWEgSURcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuVmFsaWRhdGVGdW5jdGlvbn1cbiAgICovXG4gIF9nZXRWYWxpZGF0b3IgKGlkID0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLl9hanYuZ2V0U2NoZW1hKGlkKTtcbiAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgaWYgKGlkID09PSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIG9iamVjdCwgdmFsaWRhdGVzIGl0IGFnYWluc3QgdGhlIEFwcGl1bSBjb25maWcgc2NoZW1hLlxuICAgKiBJZiBlcnJvcnMgb2NjdXIsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG5vbi1lbXB0eS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIChob3BlZnVsbHkgYW4gb2JqZWN0KSB0byB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWZdIC0gU2NoZW1hIElEIG9yIHJlZi5cbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5FcnJvck9iamVjdFtdfSBBcnJheSBvZiBlcnJvcnMsIGlmIGFueS5cbiAgICovXG4gIHZhbGlkYXRlICh2YWx1ZSwgcmVmID0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLl9nZXRWYWxpZGF0b3IocmVmKTtcbiAgICByZXR1cm4gIXZhbGlkYXRvcih2YWx1ZSkgJiYgXy5pc0FycmF5KHZhbGlkYXRvci5lcnJvcnMpXG4gICAgICA/IFsuLi52YWxpZGF0b3IuZXJyb3JzXVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgZmlsZW5hbWVgJ3MgZmlsZSBleHRlbnNpb24gaXMgYWxsb3dlZCAoaW4ge0BsaW5rIEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlN9KS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb24gKGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMuaGFzKHBhdGguZXh0bmFtZShmaWxlbmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGBzY2hlbWFgIGlzIGEgcGxhaW4gb2JqZWN0IHdpdGggYSBub24tdHJ1ZSBgJGFzeW5jYCBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHthbnl9IHNjaGVtYSAtIFNjaGVtYSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB7c2NoZW1hIGlzIFNjaGVtYU9iamVjdH1cbiAgICovXG4gIHN0YXRpYyBpc1N1cHBvcnRlZFNjaGVtYVR5cGUgKHNjaGVtYSkge1xuICAgIHJldHVybiBfLmlzUGxhaW5PYmplY3Qoc2NoZW1hKSAmJiBzY2hlbWEuJGFzeW5jICE9PSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHtAbGluayBBcHBpdW1TY2hlbWF9IGluc3RhbmNlIGhhcyBub3QgeWV0IGJlZW4gZmluYWxpemVkLCBidXRcbiAqIHRoZSBtZXRob2QgY2FsbGVkIHJlcXVpcmVzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9GSU5BTElaQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcignU2NoZW1hIG5vdCB5ZXQgZmluYWxpemVkOyBgZmluYWxpemUoKWAgbXVzdCBiZSBjYWxsZWQgZmlyc3QuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIFwidW5pcXVlXCIgc2NoZW1hIElEIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNjaGVtYSBJRC5cbiAqXG4gKiBUaGlzIGlzIGxpa2VseSBnb2luZyB0byBiZSBjYXVzZWQgYnkgYXR0ZW1wdGluZyB0byByZWdpc3RlciB0aGUgc2FtZSBzY2hlbWEgdHdpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFOYW1lQ29uZmxpY3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX05BTUVfQ09ORkxJQ1QnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8e2V4dFR5cGU6IEV4dGVuc2lvblR5cGUsIGV4dE5hbWU6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHN1cGVyKFxuICAgICAgYE5hbWUgZm9yICR7ZXh0VHlwZX0gc2NoZW1hIFwiJHtleHROYW1lfVwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHNjaGVtYWAsXG4gICAgKTtcbiAgICB0aGlzLmRhdGEgPSB7ZXh0VHlwZSwgZXh0TmFtZX07XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNjaGVtYSBJRCB3YXMgZXhwZWN0ZWQsIGJ1dCBpdCBkb2Vzbid0IGV4aXN0IG9uIHRoZSB7QGxpbmsgQWp2fSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYVVua25vd25TY2hlbWFFcnJvciBleHRlbmRzIFJlZmVyZW5jZUVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX1VOS05PV05fU0NIRU1BJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtzY2hlbWFJZDogc3RyaW5nfT59XG4gICAqL1xuICBkYXRhO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hSWRcbiAgICovXG4gIGNvbnN0cnVjdG9yIChzY2hlbWFJZCkge1xuICAgIHN1cGVyKGBVbmtub3duIHNjaGVtYTogXCIke3NjaGVtYUlkfVwiYCk7XG4gICAgdGhpcy5kYXRhID0ge3NjaGVtYUlkfTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgc2NoZW1hIGlzIHByb3ZpZGVkLCBidXQgaXQncyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLlxuICpcbiAqIFwiVmFsaWRcIiBzY2hlbWFzIHdoaWNoIGFyZSB1bnN1cHBvcnRlZCBpbmNsdWRlIGJvb2xlYW4gc2NoZW1hcyBhbmQgYXN5bmMgc2NoZW1hc1xuICogKGhhdmluZyBhIGB0cnVlYCBgJGFzeW5jYCBwcm9wZXJ0eSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yIGV4dGVuZHMgVHlwZUVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX1VOU1VQUE9SVEVEX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hOiBhbnksIGV4dFR5cGU6IEV4dGVuc2lvblR5cGUsIGV4dE5hbWU6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHNjaGVtYVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yIChzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzgyNzdcbiAgICBzdXBlcihcbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGxldCBtc2cgPSBgVW5zdXBwb3J0ZWQgc2NoZW1hIGZyb20gJHtleHRUeXBlfSBcIiR7ZXh0TmFtZX1cIjpgO1xuICAgICAgICBpZiAoXy5pc0Jvb2xlYW4oc2NoZW1hKSkge1xuICAgICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBjYW5ub3QgYmUgYSBib29sZWFuYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hLiRhc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIGNhbm5vdCBiZSBhbiBhc3luYyBzY2hlbWFgO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgc2NoZW1hIElTIHN1cHBvcnRlZDsgdGhpcyBlcnJvciBzaG91bGQgbm90IGJlIHRocm93biAodGhpcyBpcyBhIGJ1ZykuIHZhbHVlIG9mIHNjaGVtYTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIG11c3QgYmUgYSBwbGFpbiBvYmplY3Qgd2l0aG91dCBhIHRydWUgXCIkYXN5bmNcIiBwcm9wZXJ0eWA7XG4gICAgICB9KSgpLFxuICAgICk7XG4gICAgdGhpcy5kYXRhID0ge3NjaGVtYSwgZXh0VHlwZSwgZXh0TmFtZX07XG4gIH1cbn1cblxuY29uc3QgYXBwaXVtU2NoZW1hID0gQXBwaXVtU2NoZW1hLmNyZWF0ZSgpO1xuXG5leHBvcnQgY29uc3Qge1xuICByZWdpc3RlclNjaGVtYSxcbiAgZ2V0QWxsQXJnU3BlY3MsXG4gIGdldEFyZ1NwZWMsXG4gIGhhc0FyZ1NwZWMsXG4gIGlzRmluYWxpemVkLFxuICBmaW5hbGl6ZTogZmluYWxpemVTY2hlbWEsXG4gIHJlc2V0OiByZXNldFNjaGVtYSxcbiAgdmFsaWRhdGUsXG4gIGdldFNjaGVtYSxcbiAgZmxhdHRlbjogZmxhdHRlblNjaGVtYSxcbiAgZ2V0RGVmYXVsdHM6IGdldERlZmF1bHRzRm9yU2NoZW1hLFxuICBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbixcbn0gPSBhcHBpdW1TY2hlbWE7XG5leHBvcnQgY29uc3Qge2lzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb259ID0gQXBwaXVtU2NoZW1hO1xuXG4vKipcbiAqIEFwcGl1bSBvbmx5IHN1cHBvcnRzIHNjaGVtYXMgdGhhdCBhcmUgcGxhaW4gb2JqZWN0czsgbm90IGFycmF5cy5cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdCAmIHtba2V5OiBudW1iZXJdOiBuZXZlcn19IFNjaGVtYU9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEFuIG9iamVjdCBoYXZpbmcgcHJvcGVydHkgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0cmljdFByb3BcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gKi9cblxuLyoqXG4gKiBBIHtAbGluayBTY2hlbWFPYmplY3R9IHdpdGggYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtTY2hlbWFPYmplY3QgJiBTdHJpY3RQcm9wfSBTdHJpY3RTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEEgbGlzdCBvZiBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHtAbGluayBBcmdTcGVjfSBvYmplY3RzLlxuICpcbiAqIEludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHdoZW4gY29udmVydGluZyB0aGUgZW50aXJlIHNjaGVtYSBkb3duIHRvIENMSSBhcmd1bWVudHMuXG4gKiBAdHlwZWRlZiB7IHtzY2hlbWE6IFNjaGVtYU9iamVjdCwgYXJnU3BlYzogQXJnU3BlY31bXSB9IEZsYXR0ZW5lZFNjaGVtYVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FyZ1NwZWNbJ2RlZmF1bHRWYWx1ZSddfSBBcmdTcGVjRGVmYXVsdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBlLmcuIGB7ZHJpdmVyOiB7Zm9vOiAnYmFyJ319YCB3aGVyZSBgZm9vYCBpcyB0aGUgYXJnIG5hbWUgYW5kIGBiYXJgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsUmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPj59IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9XG4gKiBAdGVtcGxhdGUge2Jvb2xlYW58dW5kZWZpbmVkfSBGbGF0dGVuZWRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEZsYXR0ZW5lZCBleHRlbmRzIHRydWUgPyBBcmdTcGVjRGVmYXVsdFZhbHVlIDogQXJnU3BlY0RlZmF1bHRWYWx1ZSB8IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWU+fSBEZWZhdWx0VmFsdWVzXG4gKi9cbiJdLCJmaWxlIjoibGliL3NjaGVtYS9zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -31,9 +31,7 @@ describe('config file behavior', function () {
31
31
  describe('when provided a path to a config file', function () {
32
32
  describe('when the config file is valid per the schema', function () {
33
33
  it('should return a valid config object', async function () {
34
- const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH, {
35
- normalize: false
36
- });
34
+ const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH);
37
35
  result.should.deep.equal({
38
36
  config: require(GOOD_FILEPATH),
39
37
  filepath: GOOD_FILEPATH,
@@ -43,17 +41,13 @@ describe('config file behavior', function () {
43
41
  describe('server.nodeconfig behavior', function () {
44
42
  describe('when a string', function () {
45
43
  it('should return errors', async function () {
46
- const result = await (0, _configFile.readConfigFile)(BAD_NODECONFIG_FILEPATH, {
47
- normalize: false
48
- });
44
+ const result = await (0, _configFile.readConfigFile)(BAD_NODECONFIG_FILEPATH);
49
45
  result.should.have.nested.property('errors[0].instancePath', '/server/nodeconfig');
50
46
  });
51
47
  });
52
48
  describe('when an object', function () {
53
49
  it('should return a valid config object', async function () {
54
- const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH, {
55
- normalize: false
56
- });
50
+ const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH);
57
51
  result.should.have.property('errors').that.is.empty;
58
52
  });
59
53
  });
@@ -61,25 +55,19 @@ describe('config file behavior', function () {
61
55
  describe('server.allow-insecure behavior', function () {
62
56
  describe('when a string path', function () {
63
57
  it('should return errors', async function () {
64
- const result = await (0, _configFile.readConfigFile)(SECURITY_PATH_FILEPATH, {
65
- normalize: false
66
- });
58
+ const result = await (0, _configFile.readConfigFile)(SECURITY_PATH_FILEPATH);
67
59
  result.should.have.nested.property('errors[0].instancePath', '/server/allow-insecure');
68
60
  });
69
61
  });
70
62
  describe('when a comma-delimited string', function () {
71
63
  it('should return errors', async function () {
72
- const result = await (0, _configFile.readConfigFile)(SECURITY_DELIMITED_FILEPATH, {
73
- normalize: false
74
- });
64
+ const result = await (0, _configFile.readConfigFile)(SECURITY_DELIMITED_FILEPATH);
75
65
  result.should.have.nested.property('errors[0].instancePath', '/server/allow-insecure');
76
66
  });
77
67
  });
78
68
  describe('when an array', function () {
79
69
  it('should return a valid config object', async function () {
80
- const result = await (0, _configFile.readConfigFile)(SECURITY_ARRAY_FILEPATH, {
81
- normalize: false
82
- });
70
+ const result = await (0, _configFile.readConfigFile)(SECURITY_ARRAY_FILEPATH);
83
71
  result.should.deep.equal({
84
72
  config: require(SECURITY_ARRAY_FILEPATH),
85
73
  filepath: SECURITY_ARRAY_FILEPATH,
@@ -92,10 +80,8 @@ describe('config file behavior', function () {
92
80
  describe('when the config file is invalid per the schema', function () {
93
81
  describe('without extensions', function () {
94
82
  it('should return an object containing errors', async function () {
95
- const result = await (0, _configFile.readConfigFile)(BAD_FILEPATH, {
96
- normalize: false
97
- });
98
- result.should.have.deep.property('config', require(BAD_FILEPATH));
83
+ const result = await (0, _configFile.readConfigFile)(BAD_FILEPATH);
84
+ result.should.have.deep.property('config', (0, _configFile.normalizeConfig)(require(BAD_FILEPATH)));
99
85
  result.should.have.property('filepath', BAD_FILEPATH);
100
86
  result.should.have.deep.property('errors').that.contains.members([{
101
87
  instancePath: '',
@@ -168,9 +154,7 @@ describe('config file behavior', function () {
168
154
  });
169
155
  describe('when provided a config file with unknown properties', function () {
170
156
  beforeEach(async function () {
171
- result = await (0, _configFile.readConfigFile)(UNKNOWN_PROPS_FILEPATH, {
172
- normalize: false
173
- });
157
+ result = await (0, _configFile.readConfigFile)(UNKNOWN_PROPS_FILEPATH);
174
158
  });
175
159
  it('should return an object containing errors', function () {
176
160
  result.should.have.deep.property('errors', [{
@@ -187,9 +171,7 @@ describe('config file behavior', function () {
187
171
  });
188
172
  describe('when provided a config file with valid properties', function () {
189
173
  beforeEach(async function () {
190
- result = await (0, _configFile.readConfigFile)(EXT_PROPS_FILEPATH, {
191
- normalize: false
192
- });
174
+ result = await (0, _configFile.readConfigFile)(EXT_PROPS_FILEPATH);
193
175
  });
194
176
  it('should return an object containing no errors', function () {
195
177
  result.should.have.deep.property('errors', []);
@@ -206,4 +188,4 @@ describe('config file behavior', function () {
206
188
  });require('source-map-support').install();
207
189
 
208
190
 
209
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWZpbGUtZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiR09PRF9GSUxFUEFUSCIsIkJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIIiwiQkFEX0ZJTEVQQVRIIiwiSU5WQUxJRF9KU09OX0ZJTEVQQVRIIiwiU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgiLCJTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEgiLCJTRUNVUklUWV9QQVRIX0ZJTEVQQVRIIiwiVU5LTk9XTl9QUk9QU19GSUxFUEFUSCIsIkVYVF9QUk9QU19GSUxFUEFUSCIsImJlZm9yZUVhY2giLCJhZnRlckVhY2giLCJpdCIsInJlc3VsdCIsIm5vcm1hbGl6ZSIsInNob3VsZCIsImRlZXAiLCJlcXVhbCIsImNvbmZpZyIsInJlcXVpcmUiLCJmaWxlcGF0aCIsImVycm9ycyIsImhhdmUiLCJuZXN0ZWQiLCJwcm9wZXJ0eSIsInRoYXQiLCJpcyIsImVtcHR5IiwiY29udGFpbnMiLCJtZW1iZXJzIiwiaW5zdGFuY2VQYXRoIiwic2NoZW1hUGF0aCIsImtleXdvcmQiLCJwYXJhbXMiLCJhZGRpdGlvbmFsUHJvcGVydHkiLCJtZXNzYWdlIiwiaXNJZGVudGlmaWVyTG9jYXRpb24iLCJ0eXBlIiwiY29tcGFyaXNvbiIsImxpbWl0IiwiYWxsb3dlZFZhbHVlcyIsImFuZCIsImxlbmd0aE9mIiwiYSIsInN0cmluZyIsImV4dFNjaGVtYSIsImJlIiwicmVqZWN0ZWRXaXRoIiwiUmVnRXhwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQUEsUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7QUFDM0MsUUFBTUMsYUFBYSxHQUFHLDZCQUFlLFFBQWYsRUFBeUIseUJBQXpCLENBQXRCO0FBQ0EsUUFBTUMsdUJBQXVCLEdBQUcsNkJBQzlCLFFBRDhCLEVBRTlCLG1DQUY4QixDQUFoQztBQUlBLFFBQU1DLFlBQVksR0FBRyw2QkFBZSxRQUFmLEVB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V0QsV0FaQyxDQUFGO0FBYUQsU0FuQk8sQ0FBUjtBQXFCQXBDLFFBQUFBLFFBQVEsQ0FBQyxtREFBRCxFQUFzRCxZQUFZO0FBQ3hFVSxVQUFBQSxVQUFVLENBQUMsa0JBQWtCO0FBQzNCRyxZQUFBQSxNQUFNLEdBQUcsTUFBTSxnQ0FBZUosa0JBQWYsRUFBbUM7QUFDaERLLGNBQUFBLFNBQVMsRUFBRTtBQURxQyxhQUFuQyxDQUFmO0FBR0QsV0FKUyxDQUFWO0FBS0FGLFVBQUFBLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxZQUFZO0FBQzdEQyxZQUFBQSxNQUFNLENBQUNFLE1BQVAsQ0FBY08sSUFBZCxDQUFtQk4sSUFBbkIsQ0FBd0JRLFFBQXhCLENBQWlDLFFBQWpDLEVBQTJDLEVBQTNDO0FBQ0QsV0FGQyxDQUFGO0FBR0QsU0FUTyxDQUFSO0FBVUQsT0F6Q08sQ0FBUjtBQTBDRCxLQWhKTyxDQUFSO0FBa0pBeEIsSUFBQUEsUUFBUSxDQUFDLHNDQUFELEVBQXlDLFlBQVk7QUFDM0RZLE1BQUFBLEVBQUUsQ0FBQyxrREFBRCxFQUFxRCxrQkFBa0I7QUFDdkUsY0FBTSxnQ0FBZVIscUJBQWYsRUFBc0NXLE1BQXRDLENBQTZDK0IsRUFBN0MsQ0FBZ0RDLFlBQWhELENBQ0osSUFBSUMsTUFBSixDQUFZLEdBQUU1QyxxQkFBc0IsYUFBcEMsQ0FESSxDQUFOO0FBR0QsT0FKQyxDQUFGO0FBS0QsS0FOTyxDQUFSO0FBT0QsR0FyT08sQ0FBUjtBQXNPRCxDQTlRTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJlYWRDb25maWdGaWxlIH0gZnJvbSAnLi4vbGliL2NvbmZpZy1maWxlJztcbmltcG9ydCB7IGZpbmFsaXplU2NoZW1hLCByZWdpc3RlclNjaGVtYSwgcmVzZXRTY2hlbWEgfSBmcm9tICcuLi9saWIvc2NoZW1hL3NjaGVtYSc7XG5pbXBvcnQgZXh0U2NoZW1hIGZyb20gJy4vZml4dHVyZXMvZHJpdmVyLnNjaGVtYS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRml4dHVyZSB9IGZyb20gJy4vaGVscGVycyc7XG5cbmRlc2NyaWJlKCdjb25maWcgZmlsZSBiZWhhdmlvcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgR09PRF9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKCdjb25maWcnLCAnYXBwaXVtLmNvbmZpZy5nb29kLmpzb24nKTtcbiAgY29uc3QgQkFEX05PREVDT05GSUdfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5iYWQtbm9kZWNvbmZpZy5qc29uJyxcbiAgKTtcbiAgY29uc3QgQkFEX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoJ2NvbmZpZycsICdhcHBpdW0uY29uZmlnLmJhZC5qc29uJyk7XG4gIGNvbnN0IElOVkFMSURfSlNPTl9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLmludmFsaWQuanNvbicsXG4gICk7XG4gIGNvbnN0IFNFQ1VSSVRZX0FSUkFZX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuc2VjdXJpdHktYXJyYXkuanNvbicsXG4gICk7XG4gIGNvbnN0IFNFQ1VSSVRZX0RFTElNSVRFRF9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLnNlY3VyaXR5LWRlbGltaXRlZC5qc29uJyxcbiAgKTtcbiAgY29uc3QgU0VDVVJJVFlfUEFUSF9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLnNlY3VyaXR5LXBhdGguanNvbicsXG4gICk7XG4gIGNvbnN0IFVOS05PV05fUFJPUFNfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5leHQtdW5rbm93bi1wcm9wcy5qc29uJyxcbiAgKTtcbiAgY29uc3QgRVhUX1BST1BTX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuZXh0LWdvb2QuanNvbicsXG4gICk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgZmluYWxpemVTY2hlbWEoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICByZXNldFNjaGVtYSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIHBhdGggdG8gYSBjb25maWcgZmlsZScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgdmFsaWQgcGVyIHRoZSBzY2hlbWEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIGNvbmZpZyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEdPT0RfRklMRVBBVEgsIHtcbiAgICAgICAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwLmVxdWFsKHtcbiAgICAgICAgICBjb25maWc6IHJlcXVpcmUoR09PRF9GSUxFUEFUSCksXG4gICAgICAgICAgZmlsZXBhdGg6IEdPT0RfRklMRVBBVEgsXG4gICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3NlcnZlci5ub2RlY29uZmlnIGJlaGF2aW9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgnd2hlbiBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShCQURfTk9ERUNPTkZJR19GSUxFUEFUSCwge1xuICAgICAgICAgICAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUubmVzdGVkLnByb3BlcnR5KFxuICAgICAgICAgICAgICAnZXJyb3JzWzBdLmluc3RhbmNlUGF0aCcsXG4gICAgICAgICAgICAgICcvc2VydmVyL25vZGVjb25maWcnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3doZW4gYW4gb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgdmFsaWQgY29uZmlnIG9iamVjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEdPT0RfRklMRVBBVEgsIHtcbiAgICAgICAgICAgICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdlcnJvcnMnKS50aGF0LmlzLmVtcHR5O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnc2VydmVyLmFsbG93LWluc2VjdXJlIGJlaGF2aW9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgnd2hlbiBhIHN0cmluZyBwYXRoJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKFNFQ1VSSVRZX1BBVEhfRklMRVBBVEgsIHtcbiAgICAgICAgICAgICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShcbiAgICAgICAgICAgICAgJ2Vycm9yc1swXS5pbnN0YW5jZVBhdGgnLFxuICAgICAgICAgICAgICAnL3NlcnZlci9hbGxvdy1pbnNlY3VyZScsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZXJyb3JzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoU0VDVVJJVFlfREVMSU1JVEVEX0ZJTEVQQVRILCB7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgICAgICAgICAgICdlcnJvcnNbMF0uaW5zdGFuY2VQYXRoJyxcbiAgICAgICAgICAgICAgJy9zZXJ2ZXIvYWxsb3ctaW5zZWN1cmUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3doZW4gYW4gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSB2YWxpZCBjb25maWcgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgsIHtcbiAgICAgICAgICAgICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5kZWVwLmVxdWFsKHtcbiAgICAgICAgICAgICAgY29uZmlnOiByZXF1aXJlKFNFQ1VSSVRZX0FSUkFZX0ZJTEVQQVRIKSxcbiAgICAgICAgICAgICAgZmlsZXBhdGg6IFNFQ1VSSVRZX0FSUkFZX0ZJTEVQQVRILFxuICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgaW52YWxpZCBwZXIgdGhlIHNjaGVtYScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlc2NyaWJlKCd3aXRob3V0IGV4dGVuc2lvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShCQURfRklMRVBBVEgsIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmRlZXAucHJvcGVydHkoJ2NvbmZpZycsIHJlcXVpcmUoQkFEX0ZJTEVQQVRIKSk7XG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdmaWxlcGF0aCcsIEJBRF9GSUxFUEFUSCk7XG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmRlZXAucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuY29udGFpbnMubWVtYmVycyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogJycsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICcjL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnR5OiAnYXBwaXVtLWhvbWUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICBpc0lkZW50aWZpZXJMb2NhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogJy9zZXJ2ZXIvYWxsb3ctY29ycycsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICcjL3Byb3BlcnRpZXMvc2VydmVyL3Byb3BlcnRpZXMvYWxsb3ctY29ycy90eXBlJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ3R5cGUnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGJvb2xlYW4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9hbGxvdy1pbnNlY3VyZScsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICcjL3Byb3BlcnRpZXMvc2VydmVyL3Byb3BlcnRpZXMvYWxsb3ctaW5zZWN1cmUvdHlwZScsXG4gICAgICAgICAgICAgIGtleXdvcmQ6ICd0eXBlJyxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5J1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSBhcnJheScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL2NhbGxiYWNrLXBvcnQnLFxuICAgICAgICAgICAgICBzY2hlbWFQYXRoOlxuICAgICAgICAgICAgICAgICcjL3Byb3BlcnRpZXMvc2VydmVyL3Byb3BlcnRpZXMvY2FsbGJhY2stcG9ydC9tYXhpbXVtJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ21heGltdW0nLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBjb21wYXJpc29uOiAnPD0nLFxuICAgICAgICAgICAgICAgIGxpbWl0OiA2NTUzNSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgPD0gNjU1MzUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9sb2ctbGV2ZWwnLFxuICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAnIy9wcm9wZXJ0aWVzL3NlcnZlci9wcm9wZXJ0aWVzL2xvZy1sZXZlbC9lbnVtJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ2VudW0nLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAnaW5mbzpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnaW5mbzppbmZvJyxcbiAgICAgICAgICAgICAgICAgICdpbmZvOndhcm4nLFxuICAgICAgICAgICAgICAgICAgJ2luZm86ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgJ3dhcm46ZGVidWcnLFxuICAgICAgICAgICAgICAgICAgJ3dhcm46aW5mbycsXG4gICAgICAgICAgICAgICAgICAnd2Fybjp3YXJuJyxcbiAgICAgICAgICAgICAgICAgICd3YXJuOmVycm9yJyxcbiAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6ZGVidWcnLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yOmluZm8nLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yOndhcm4nLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yOmVycm9yJyxcbiAgICAgICAgICAgICAgICAgICdkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6ZGVidWcnLFxuICAgICAgICAgICAgICAgICAgJ2RlYnVnOmluZm8nLFxuICAgICAgICAgICAgICAgICAgJ2RlYnVnOndhcm4nLFxuICAgICAgICAgICAgICAgICAgJ2RlYnVnOmVycm9yJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogJy9zZXJ2ZXIvbG9nLW5vLWNvbG9ycycsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICcjL3Byb3BlcnRpZXMvc2VydmVyL3Byb3BlcnRpZXMvbG9nLW5vLWNvbG9ycy90eXBlJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ3R5cGUnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGJvb2xlYW4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9wb3J0JyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9wb3J0L3R5cGUnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAndHlwZScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgaW50ZWdlcicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pLmFuZC5sZW5ndGhPZig3KTtcblxuICAgICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVhc29uJykudGhhdC5pcy5hLnN0cmluZztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3dpdGggZXh0ZW5zaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJy4uL2xpYi9jb25maWctZmlsZScpLlJlYWRDb25maWdGaWxlUmVzdWx0fSAqL1xuICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlc2V0U2NoZW1hKCk7XG4gICAgICAgICAgcmVnaXN0ZXJTY2hlbWEoJ2RyaXZlcicsICdmYWtlJywgZXh0U2NoZW1hKTtcbiAgICAgICAgICBmaW5hbGl6ZVNjaGVtYSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIGNvbmZpZyBmaWxlIHdpdGggdW5rbm93biBwcm9wZXJ0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoVU5LTk9XTl9QUk9QU19GSUxFUEFUSCwge1xuICAgICAgICAgICAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmRlZXAucHJvcGVydHkoJ2Vycm9ycycsIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogJy9zZXJ2ZXIvZHJpdmVyL2Zha2UnLFxuICAgICAgICAgICAgICAgIHNjaGVtYVBhdGg6XG4gICAgICAgICAgICAgICAgICAnZHJpdmVyLWZha2UuanNvbi9hZGRpdGlvbmFsUHJvcGVydGllcycsXG4gICAgICAgICAgICAgICAga2V5d29yZDogJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHthZGRpdGlvbmFsUHJvcGVydHk6ICdidWJiJ30sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgTk9UIGhhdmUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICBpc0lkZW50aWZpZXJMb2NhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIGNvbmZpZyBmaWxlIHdpdGggdmFsaWQgcHJvcGVydGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEVYVF9QUk9QU19GSUxFUEFUSCwge1xuICAgICAgICAgICAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbm8gZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmRlZXAucHJvcGVydHkoJ2Vycm9ycycsIFtdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyBpbnZhbGlkIEpTT04nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCB3aXRoIGEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCByZWFkQ29uZmlnRmlsZShJTlZBTElEX0pTT05fRklMRVBBVEgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgJHtJTlZBTElEX0pTT05fRklMRVBBVEh9IGlzIGludmFsaWRgKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2NvbmZpZy1maWxlLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
191
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWZpbGUtZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiR09PRF9GSUxFUEFUSCIsIkJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIIiwiQkFEX0ZJTEVQQVRIIiwiSU5WQUxJRF9KU09OX0ZJTEVQQVRIIiwiU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgiLCJTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEgiLCJTRUNVUklUWV9QQVRIX0ZJTEVQQVRIIiwiVU5LTk9XTl9QUk9QU19GSUxFUEFUSCIsIkVYVF9QUk9QU19GSUxFUEFUSCIsImJlZm9yZUVhY2giLCJhZnRlckVhY2giLCJpdCIsInJlc3VsdCIsInNob3VsZCIsImRlZXAiLCJlcXVhbCIsImNvbmZpZyIsInJlcXVpcmUiLCJmaWxlcGF0aCIsImVycm9ycyIsImhhdmUiLCJuZXN0ZWQiLCJwcm9wZXJ0eSIsInRoYXQiLCJpcyIsImVtcHR5IiwiY29udGFpbnMiLCJtZW1iZXJzIiwiaW5zdGFuY2VQYXRoIiwic2NoZW1hUGF0aCIsImtleXdvcmQiLCJwYXJhbXMiLCJhZGRpdGlvbmFsUHJvcGVydHkiLCJtZXNzYWdlIiwiaXNJZGVudGlmaWVyTG9jYXRpb24iLCJ0eXBlIiwiY29tcGFyaXNvbiIsImxpbWl0IiwiYWxsb3dlZFZhbHVlcyIsImFuZCIsImxlbmd0aE9mIiwiYSIsInN0cmluZyIsImV4dFNjaGVtYSIsImJlIiwicmVqZWN0ZWRXaXRoIiwiUmVnRXhwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQUEsUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7QUFDM0MsUUFBTUMsYUFBYSxHQUFHLDZCQUFlLFFBQWYsRUFBeUIseUJBQXpCLENBQXRCO0FBQ0EsUUFBTUMsdUJBQXVCLEdBQUcsNkJBQzlCLFFBRDhCLEVBRTlCLG1DQUY4QixDQUFoQztBQUlBLFFBQU1DLFlBQVksR0FBRyw2QkFBZSxRQUFmLEVBQXlCLHdCQUF6QixD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TyxDQUFSO0FBc0NELEtBMUlPLENBQVI7QUE0SUF2QixJQUFBQSxRQUFRLENBQUMsc0NBQUQsRUFBeUMsWUFBWTtBQUMzRFksTUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXFELGtCQUFrQjtBQUN2RSxjQUFNLGdDQUFlUixxQkFBZixFQUFzQ1UsTUFBdEMsQ0FBNkMrQixFQUE3QyxDQUFnREMsWUFBaEQsQ0FDSixJQUFJQyxNQUFKLENBQVksR0FBRTNDLHFCQUFzQixhQUFwQyxDQURJLENBQU47QUFHRCxPQUpDLENBQUY7QUFLRCxLQU5PLENBQVI7QUFPRCxHQW5OTyxDQUFSO0FBb05ELENBN1BPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHsgcmVhZENvbmZpZ0ZpbGUsIG5vcm1hbGl6ZUNvbmZpZyB9IGZyb20gJy4uL2xpYi9jb25maWctZmlsZSc7XG5pbXBvcnQgeyBmaW5hbGl6ZVNjaGVtYSwgcmVnaXN0ZXJTY2hlbWEsIHJlc2V0U2NoZW1hIH0gZnJvbSAnLi4vbGliL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IGV4dFNjaGVtYSBmcm9tICcuL2ZpeHR1cmVzL2RyaXZlci5zY2hlbWEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUZpeHR1cmUgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5kZXNjcmliZSgnY29uZmlnIGZpbGUgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEdPT0RfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZSgnY29uZmlnJywgJ2FwcGl1bS5jb25maWcuZ29vZC5qc29uJyk7XG4gIGNvbnN0IEJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuYmFkLW5vZGVjb25maWcuanNvbicsXG4gICk7XG4gIGNvbnN0IEJBRF9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKCdjb25maWcnLCAnYXBwaXVtLmNvbmZpZy5iYWQuanNvbicpO1xuICBjb25zdCBJTlZBTElEX0pTT05fRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5pbnZhbGlkLmpzb24nLFxuICApO1xuICBjb25zdCBTRUNVUklUWV9BUlJBWV9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLnNlY3VyaXR5LWFycmF5Lmpzb24nLFxuICApO1xuICBjb25zdCBTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5zZWN1cml0eS1kZWxpbWl0ZWQuanNvbicsXG4gICk7XG4gIGNvbnN0IFNFQ1VSSVRZX1BBVEhfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5zZWN1cml0eS1wYXRoLmpzb24nLFxuICApO1xuICBjb25zdCBVTktOT1dOX1BST1BTX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuZXh0LXVua25vd24tcHJvcHMuanNvbicsXG4gICk7XG4gIGNvbnN0IEVYVF9QUk9QU19GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLmV4dC1nb29kLmpzb24nLFxuICApO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgcmVzZXRTY2hlbWEoKTtcbiAgfSk7XG5cblxuICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIHBhdGggdG8gYSBjb25maWcgZmlsZScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgdmFsaWQgcGVyIHRoZSBzY2hlbWEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIGNvbmZpZyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEdPT0RfRklMRVBBVEgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIGNvbmZpZzogcmVxdWlyZShHT09EX0ZJTEVQQVRIKSxcbiAgICAgICAgICBmaWxlcGF0aDogR09PRF9GSUxFUEFUSCxcbiAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnc2VydmVyLm5vZGVjb25maWcgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIKTtcbiAgICAgICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgICAgICAgICAgICdlcnJvcnNbMF0uaW5zdGFuY2VQYXRoJyxcbiAgICAgICAgICAgICAgJy9zZXJ2ZXIvbm9kZWNvbmZpZycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBhbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSB2YWxpZCBjb25maWcgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoR09PRF9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuaXMuZW1wdHk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzZXJ2ZXIuYWxsb3ctaW5zZWN1cmUgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgc3RyaW5nIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZXJyb3JzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoU0VDVVJJVFlfUEFUSF9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUubmVzdGVkLnByb3BlcnR5KFxuICAgICAgICAgICAgICAnZXJyb3JzWzBdLmluc3RhbmNlUGF0aCcsXG4gICAgICAgICAgICAgICcvc2VydmVyL2FsbG93LWluc2VjdXJlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEgpO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShcbiAgICAgICAgICAgICAgJ2Vycm9yc1swXS5pbnN0YW5jZVBhdGgnLFxuICAgICAgICAgICAgICAnL3NlcnZlci9hbGxvdy1pbnNlY3VyZScsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBhbiBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIGNvbmZpZyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShTRUNVUklUWV9BUlJBWV9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAgICAgICBjb25maWc6IHJlcXVpcmUoU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgpLFxuICAgICAgICAgICAgICBmaWxlcGF0aDogU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgsXG4gICAgICAgICAgICAgIGVycm9yczogW10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyBpbnZhbGlkIHBlciB0aGUgc2NoZW1hJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3dpdGhvdXQgZXh0ZW5zaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgZXJyb3JzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEJBRF9GSUxFUEFUSCk7XG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmRlZXAucHJvcGVydHkoJ2NvbmZpZycsIG5vcm1hbGl6ZUNvbmZpZyhyZXF1aXJlKEJBRF9GSUxFUEFUSCkpKTtcbiAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZpbGVwYXRoJywgQkFEX0ZJTEVQQVRIKTtcbiAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJykudGhhdC5jb250YWlucy5tZW1iZXJzKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydHk6ICdhcHBpdW0taG9tZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcycsXG4gICAgICAgICAgICAgIGlzSWRlbnRpZmllckxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9hbGxvdy1jb3JzJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9hbGxvdy1jb3JzL3R5cGUnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAndHlwZScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgYm9vbGVhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL2FsbG93LWluc2VjdXJlJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9hbGxvdy1pbnNlY3VyZS90eXBlJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ3R5cGUnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGFycmF5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogJy9zZXJ2ZXIvY2FsbGJhY2stcG9ydCcsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6XG4gICAgICAgICAgICAgICAgJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9jYWxsYmFjay1wb3J0L21heGltdW0nLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnbWF4aW11bScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGNvbXBhcmlzb246ICc8PScsXG4gICAgICAgICAgICAgICAgbGltaXQ6IDY1NTM1LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSA8PSA2NTUzNScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL2xvZy1sZXZlbCcsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICcjL3Byb3BlcnRpZXMvc2VydmVyL3Byb3BlcnRpZXMvbG9nLWxldmVsL2VudW0nLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnZW51bScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICdpbmZvOmRlYnVnJyxcbiAgICAgICAgICAgICAgICAgICdpbmZvOmluZm8nLFxuICAgICAgICAgICAgICAgICAgJ2luZm86d2FybicsXG4gICAgICAgICAgICAgICAgICAnaW5mbzplcnJvcicsXG4gICAgICAgICAgICAgICAgICAnd2FybicsXG4gICAgICAgICAgICAgICAgICAnd2FybjpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnd2FybjppbmZvJyxcbiAgICAgICAgICAgICAgICAgICd3YXJuOndhcm4nLFxuICAgICAgICAgICAgICAgICAgJ3dhcm46ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICdlcnJvcjpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6aW5mbycsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6d2FybicsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgJ2RlYnVnJyxcbiAgICAgICAgICAgICAgICAgICdkZWJ1ZzpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6aW5mbycsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6d2FybicsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6ZXJyb3InLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9sb2ctbm8tY29sb3JzJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9sb2ctbm8tY29sb3JzL3R5cGUnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAndHlwZScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgYm9vbGVhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL3BvcnQnLFxuICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAnIy9wcm9wZXJ0aWVzL3NlcnZlci9wcm9wZXJ0aWVzL3BvcnQvdHlwZScsXG4gICAgICAgICAgICAgIGtleXdvcmQ6ICd0eXBlJyxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSBpbnRlZ2VyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSkuYW5kLmxlbmd0aE9mKDcpO1xuXG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdyZWFzb24nKS50aGF0LmlzLmEuc3RyaW5nO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2l0aCBleHRlbnNpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vbGliL2NvbmZpZy1maWxlJykuUmVhZENvbmZpZ0ZpbGVSZXN1bHR9ICovXG4gICAgICAgIGxldCByZXN1bHQ7XG5cbiAgICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVzZXRTY2hlbWEoKTtcbiAgICAgICAgICByZWdpc3RlclNjaGVtYSgnZHJpdmVyJywgJ2Zha2UnLCBleHRTY2hlbWEpO1xuICAgICAgICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgY29uZmlnIGZpbGUgd2l0aCB1bmtub3duIHByb3BlcnRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShVTktOT1dOX1BST1BTX0ZJTEVQQVRIKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJywgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9kcml2ZXIvZmFrZScsXG4gICAgICAgICAgICAgICAgc2NoZW1hUGF0aDpcbiAgICAgICAgICAgICAgICAgICdkcml2ZXItZmFrZS5qc29uL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICBrZXl3b3JkOiAnYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgIHBhcmFtczoge2FkZGl0aW9uYWxQcm9wZXJ0eTogJ2J1YmInfSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgIGlzSWRlbnRpZmllckxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgY29uZmlnIGZpbGUgd2l0aCB2YWxpZCBwcm9wZXJ0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoRVhUX1BST1BTX0ZJTEVQQVRIKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBubyBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJywgW10pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIGludmFsaWQgSlNPTicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggYSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHJlYWRDb25maWdGaWxlKElOVkFMSURfSlNPTl9GSUxFUEFUSCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICBuZXcgUmVnRXhwKGAke0lOVkFMSURfSlNPTl9GSUxFUEFUSH0gaXMgaW52YWxpZGApLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvY29uZmlnLWZpbGUtZTJlLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=