@decaf-ts/for-typeorm 0.0.21 → 0.0.23

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.
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('tslib'), require('@decaf-ts/core'), require('@decaf-ts/db-decorators'), require('reflect-metadata'), require('@decaf-ts/decorator-validation'), require('@decaf-ts/reflection'), require('@decaf-ts/logging'), require('typeorm')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'tslib', '@decaf-ts/core', '@decaf-ts/db-decorators', 'reflect-metadata', '@decaf-ts/decorator-validation', '@decaf-ts/reflection', '@decaf-ts/logging', 'typeorm'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-typeorm"] = {}, global.tslib, global.core, global.dbDecorators, null, global.decoratorValidation, global.reflection, global.logging, global.typeorm));
5
- })(this, (function (exports, tslib, core, dbDecorators, reflectMetadata, decoratorValidation, reflection, logging, typeorm) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/decoration'), require('tslib'), require('@decaf-ts/core'), require('@decaf-ts/db-decorators'), require('reflect-metadata'), require('@decaf-ts/decorator-validation'), require('@decaf-ts/reflection'), require('@decaf-ts/logging'), require('typeorm')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/decoration', 'tslib', '@decaf-ts/core', '@decaf-ts/db-decorators', 'reflect-metadata', '@decaf-ts/decorator-validation', '@decaf-ts/reflection', '@decaf-ts/logging', 'typeorm'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-typeorm"] = {}, global.decoration, global.tslib, global.core, global.dbDecorators, null, global.decoratorValidation, global.reflection, global.logging, global.typeorm));
5
+ })(this, (function (exports, decoration, tslib, core, dbDecorators, reflectMetadata, decoratorValidation, reflection, logging, typeorm) { 'use strict';
6
6
 
7
7
  /**
8
8
  * @description Regular expression to identify reserved attributes for SQL contexts.
@@ -2255,31 +2255,9 @@
2255
2255
  }
2256
2256
  }
2257
2257
  async flags(operation, model, flags) {
2258
- const f = await super.flags(operation, model, flags);
2259
- const newObj = {
2258
+ return Object.assign(await super.flags(operation, model, flags), {
2260
2259
  user: this.config.username,
2261
- };
2262
- const m = new model();
2263
- const exceptions = [];
2264
- if (operation === dbDecorators.OperationKeys.CREATE) {
2265
- const pk = dbDecorators.findPrimaryKey(m).id;
2266
- exceptions.push(pk);
2267
- }
2268
- if (operation === dbDecorators.OperationKeys.CREATE ||
2269
- operation === dbDecorators.OperationKeys.UPDATE) {
2270
- const decs = Object.keys(m).reduce((accum, key) => {
2271
- const decs = reflection.Reflection.getPropertyDecorators(decoratorValidation.ValidationKeys.REFLECT, m, key, true);
2272
- const dec = decs.decorators.find((dec) => dec.key === dbDecorators.DBKeys.TIMESTAMP &&
2273
- dec.props.operation.indexOf(operation) !== -1);
2274
- if (dec) {
2275
- accum[key] = dec.props;
2276
- }
2277
- return accum;
2278
- }, {});
2279
- exceptions.push(...Object.keys(decs));
2280
- }
2281
- newObj.ignoredValidationProperties = (f.ignoredValidationProperties ? f.ignoredValidationProperties : []).concat(...exceptions);
2282
- return Object.assign(f, newObj);
2260
+ });
2283
2261
  }
2284
2262
  Dispatch() {
2285
2263
  return new TypeORMDispatch();
@@ -3018,7 +2996,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3018
2996
  const name = options.name || core.sequenceNameForModel(original, "pk");
3019
2997
  decorators.push(PrimaryGeneratedColumn({
3020
2998
  name: name,
3021
- }));
2999
+ }), core.noValidateOnCreate());
3022
3000
  }
3023
3001
  else {
3024
3002
  switch (type.toLowerCase()) {
@@ -3092,7 +3070,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3092
3070
  const versionKey = core.Repository.key(dbDecorators.DBKeys.VERSION);
3093
3071
  decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
3094
3072
  .for(versionKey)
3095
- .define(decoratorValidation.type(Number.name), typeorm.VersionColumn())
3073
+ .define(decoratorValidation.type(Number.name), typeorm.VersionColumn(), core.noValidateOnCreate())
3096
3074
  .apply();
3097
3075
  function ValidationUpdateKey(key) {
3098
3076
  return dbDecorators.UpdateValidationKeys.REFLECT + key;
@@ -3107,11 +3085,12 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3107
3085
  operation: operation,
3108
3086
  format: format,
3109
3087
  }),
3088
+ core.noValidateOnCreate(),
3110
3089
  ];
3111
3090
  if (operation.indexOf(dbDecorators.OperationKeys.UPDATE) !== -1)
3112
3091
  decorators.push(decoratorValidation.propMetadata(timestampKey, {
3113
3092
  message: dbDecorators.DEFAULT_ERROR_MESSAGES.TIMESTAMP.INVALID,
3114
- }));
3093
+ }), core.noValidateOnCreateUpdate());
3115
3094
  else
3116
3095
  decorators.push(dbDecorators.readonly());
3117
3096
  return reflection.apply(...decorators);
@@ -3370,13 +3349,11 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3370
3349
  const updatedByKey = core.Repository.key(core.PersistenceKeys.UPDATED_BY);
3371
3350
  decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
3372
3351
  .for(createdByKey)
3373
- .define(dbDecorators.onCreate(createdByOnTypeORMCreateUpdate, {}), decoratorValidation.required(), decoratorValidation.propMetadata(createdByKey, {})
3374
- // assign(`pk.${prop}`, options)
3375
- )
3352
+ .define(dbDecorators.onCreate(createdByOnTypeORMCreateUpdate, {}), decoratorValidation.required(), decoratorValidation.propMetadata(createdByKey, {}), core.noValidateOnCreate())
3376
3353
  .apply();
3377
3354
  decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
3378
3355
  .for(updatedByKey)
3379
- .define(dbDecorators.onCreateUpdate(createdByOnTypeORMCreateUpdate, {}), decoratorValidation.required(), decoratorValidation.propMetadata(updatedByKey, {}))
3356
+ .define(dbDecorators.onCreateUpdate(createdByOnTypeORMCreateUpdate, {}), decoratorValidation.required(), decoratorValidation.propMetadata(updatedByKey, {}), core.noValidateOnCreateUpdate())
3380
3357
  .apply();
3381
3358
  }
3382
3359
  }
@@ -3424,9 +3401,18 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3424
3401
  * @const VERSION
3425
3402
  * @memberOf module:for-typeorm
3426
3403
  */
3427
- const VERSION = "0.0.20";
3404
+ const VERSION = "0.0.22";
3405
+ /**
3406
+ * @description Stores the current package version.
3407
+ * @summary The version string of the for-typeorm package.
3408
+ * @const PACKAGE_NAME
3409
+ * @memberOf module:for-typeorm
3410
+ */
3411
+ const PACKAGE_NAME = "@decaf-ts/for-typeorm";
3412
+ decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
3428
3413
 
3429
3414
  exports.IndexError = IndexError;
3415
+ exports.PACKAGE_NAME = PACKAGE_NAME;
3430
3416
  exports.TypeORMAdapter = TypeORMAdapter;
3431
3417
  exports.TypeORMConst = TypeORMConst;
3432
3418
  exports.TypeORMDispatch = TypeORMDispatch;
@@ -3447,4 +3433,4 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3447
3433
  exports.translateOperators = translateOperators;
3448
3434
 
3449
3435
  }));
3450
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvT25lVG9PbmUudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9NYW55VG9NYW55LnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9FbnRpdHkudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpZmllciBzdHJpbmcgZm9yIHRoZSBUeXBlT1JNIGFkYXB0ZXIgZmxhdm91ci5cbiAqIEBzdW1tYXJ5IFVzZWQgdG8gcmVnaXN0ZXIgYW5kIHJlc29sdmUgdGhlIFR5cGVPUk0gaW1wbGVtZW50YXRpb24gd2l0aGluIHRoZSBEZWNhZi50cyBhZGFwdGVyIGZhY3Rvcnkgc3lzdGVtLlxuICogQGNvbnN0IFR5cGVPUk1GbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNRmxhdm91ciA9IFwidHlwZS1vcm1cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2hhcGUgb2YgdGhlIFR5cGVPUk1LZXlzIGNvbnN0YW50LlxuICogQHN1bW1hcnkgRGVzY3JpYmVzIHRoZSBrZXlzIGFuZCB0aGVpciBtZWFuaW5ncyB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAdHlwZWRlZiBUeXBlT1JNS2V5c0RlZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUEFSQVRPUiBTZXBhcmF0b3IgdXNlZCB0byBqb2luIHRhYmxlIGFuZCBjb2x1bW4gaWRlbnRpZmllcnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUQgRGVmYXVsdCBwcmltYXJ5IGtleSBmaWVsZCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFZFUlNJT04gVmVyc2lvbiBmaWVsZCB1c2VkIGZvciBvcHRpbWlzdGljIGxvY2tpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREVMRVRFRCBTb2Z0LWRlbGV0ZSB0aW1lc3RhbXAgZmllbGQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEFCTEUgRGF0YWJhc2UgdGFibGUgaWRlbnRpZmllciBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0NIRU1BIERhdGFiYXNlIHNjaGVtYSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRVFVRU5DRSBEYXRhYmFzZSBzZXF1ZW5jZSBuYW1lIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkRFWCBJbmRleCBpZGVudGlmaWVyIGtleS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5IGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBDb2xsZWN0aW9uIG9mIHN0cmluZyBjb25zdGFudHMgdGhhdCBpZGVudGlmeSBjb21tb24gZGF0YWJhc2UgcHJvcGVydGllcyBhbmQgYWRhcHRlci1zcGVjaWZpYyBrZXlzLlxuICogQGNvbnN0IFR5cGVPUk1LZXlzXG4gKiBAdHlwZSB7VHlwZU9STUtleXNEZWZ9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNS2V5cyA9IHtcbiAgU0VQQVJBVE9SOiBcIi5cIixcbiAgSUQ6IFwiaWRcIixcbiAgVkVSU0lPTjogXCJ2ZXJzaW9uXCIsXG4gIERFTEVURUQ6IFwiZGVsZXRlZF9hdFwiLFxuICBUQUJMRTogXCJ0YWJsZV9uYW1lXCIsXG4gIFNDSEVNQTogXCJzY2hlbWFfbmFtZVwiLFxuICBTRVFVRU5DRTogXCJzZXF1ZW5jZV9uYW1lXCIsXG4gIElOREVYOiBcImluZGV4XCIsXG59O1xuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggVHlwZU9STSBpbmRleGVzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBlcnJvciByZWxhdGVkIHRvIGluZGV4IGdlbmVyYXRpb24gb3IgaGFuZGxpbmcgd2l0aGluIHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdC5cbiAqIEBjbGFzc1xuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgdXNpbmcgSW5kZXhFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gU29tZSBjb2RlIHRoYXQgbWlnaHQgdGhyb3cgYW4gaW5kZXggZXJyb3JcbiAqICAgdGhyb3cgbmV3IEluZGV4RXJyb3IoXCJJbmRleCBub3QgZm91bmRcIik7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBJbmRleEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihcIkluZGV4IGVycm9yIG9jY3VycmVkOlwiLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY2xhc3MgSW5kZXhFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihJbmRleEVycm9yLm5hbWUsIG1zZywgNDA0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeUJ1aWxkZXIgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNRTCBvcGVyYXRvcnMgYXZhaWxhYmxlIGZvciBidWlsZGluZyBUeXBlT1JNIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBjb21tb24gU1FMIG9wZXJhdG9ycyBpbnRlbmRlZCBmb3IgdXNlIHdpdGhpbiBUeXBlT1JNIHF1ZXJ5IGNvbnN0cnVjdGlvbiBhbmQgdHJhbnNsYXRpb24gbGF5ZXJzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBlbnVtIFNRTE9wZXJhdG9yIHtcbiAgLyoqIEV4YWN0IGVxdWFsaXR5IGNvbXBhcmlzb24gKD0pICovXG4gIEVRVUFMID0gXCI9XCIsXG4gIC8qKiBJbmVxdWFsaXR5IGNvbXBhcmlzb24gKDw+KSAqL1xuICBOT1RfRVFVQUwgPSBcIjw+XCIsXG4gIC8qKiBMZXNzLXRoYW4gY29tcGFyaXNvbiAoPCkgKi9cbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIC8qKiBMZXNzLXRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPD0pICovXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgLyoqIEdyZWF0ZXItdGhhbiBjb21wYXJpc29uICg+KSAqL1xuICBHUkVBVEVSX1RIQU4gPSBcIj5cIixcbiAgLyoqIEdyZWF0ZXItdGhhbiBvciBlcXVhbCBjb21wYXJpc29uICg+PSkgKi9cbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMID0gXCI+PVwiLFxuICAvKiogTWVtYmVyc2hpcCBpbiBhIHNldCAoSU4pICovXG4gIElOID0gXCJJTlwiLFxuICAvKiogTm9uLW1lbWJlcnNoaXAgaW4gYSBzZXQgKE5PVCBJTikgKi9cbiAgTk9UX0lOID0gXCJOT1QgSU5cIixcbiAgLyoqIFBhdHRlcm4gbWF0Y2ggdXNpbmcgTElLRSAqL1xuICBMSUtFID0gXCJMSUtFXCIsXG4gIC8qKiBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2ggdXNpbmcgSUxJS0UgKFBvc3RncmVzKSAqL1xuICBJTElLRSA9IFwiSUxJS0VcIixcbiAgLyoqIFJhbmdlIGNvbXBhcmlzb24gdXNpbmcgQkVUV0VFTiAqL1xuICBCRVRXRUVOID0gXCJCRVRXRUVOXCIsXG4gIC8qKiBOdWxsIGNoZWNrIChJUyBOVUxMKSAqL1xuICBJU19OVUxMID0gXCJJUyBOVUxMXCIsXG4gIC8qKiBOb3QtbnVsbCBjaGVjayAoSVMgTk9UIE5VTEwpICovXG4gIElTX05PVF9OVUxMID0gXCJJUyBOT1QgTlVMTFwiLFxuICAvKiogRXhpc3RlbmNlIG9mIHJvd3MgKEVYSVNUUykgKi9cbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgLyoqIE5vbi1leGlzdGVuY2Ugb2Ygcm93cyAoTk9UIEVYSVNUUykgKi9cbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICAvKiogQ29tcGFyZSB0byBhbnkgdmFsdWUgaW4gYW4gYXJyYXkgKEFOWSkgKi9cbiAgQU5ZID0gXCJBTllcIixcbiAgLyoqIENvbXBhcmUgdG8gYWxsIHZhbHVlcyBpbiBhbiBhcnJheSAoQUxMKSAqL1xuICBBTEwgPSBcIkFMTFwiLFxuICAvKiogQ29tcGFyZSB0byBzb21lIHZhbHVlcyBpbiBhbiBhcnJheSAoU09NRSkgKi9cbiAgU09NRSA9IFwiU09NRVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBRdWVyeSBjb250YWluZXIgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlaXRoZXIgYSByYXcgU1FMIHN0cmluZyBvciBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGFsb25nIHdpdGggb3B0aW9uYWwgYm91bmQgdmFsdWVzIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBhZGFwdGVyLlxuICogQHRlbXBsYXRlIE0gVGhlIE1vZGVsIHR5cGUgZm9yIHdoaWNoIHRoZSBTZWxlY3RRdWVyeUJ1aWxkZXIgaXMgcGFyYW1ldGVyaXplZC5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSB1bmRlcmx5aW5nIHF1ZXJ5IHR5cGUsIGVpdGhlciBhIHN0cmluZyBvciBhIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPi5cbiAqIEBpbnRlcmZhY2UgVHlwZU9STVF1ZXJ5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZU9STVF1ZXJ5PFxuICBNIGV4dGVuZHMgTW9kZWwgPSBNb2RlbCxcbiAgVCBleHRlbmRzIHN0cmluZyB8IFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPiA9IHN0cmluZyxcbj4ge1xuICBxdWVyeTogVDtcbiAgdmFsdWVzPzogYW55W107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZmxhZ3MgZm9yIFR5cGVPUk0gb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IEV4dGVuZGVkIHJlcG9zaXRvcnkgZmxhZ3MgaW5jbHVkaW5nIGNvbm5lY3Rpb24vdXNlciBjb250ZXh0IHRoYXQgY2FuIGJlIGxldmVyYWdlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGludGVyZmFjZSBUeXBlT1JNRmxhZ3NcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNRmxhZ3MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3Mge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVzZXIgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZm9yIFBvc3RncmVzIGRhdGFiYXNlIGNvbm5lY3Rpb25zXG4gICAqL1xuICB1c2VyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmljYXRpb24gZm9yIGEgdGFibGUgY3JlYXRpb24vY2hhbmdlIHN0YXRlbWVudCB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIGEgVHlwZU9STVF1ZXJ5IHdpdGggdGFibGUgbWV0YWRhdGEgc3VjaCBhcyBwcmltYXJ5IGtleSBmbGFnLCBjb25zdHJhaW50cywgYW5kIGZvcmVpZ24ga2V5cy5cbiAqIEB0eXBlZGVmIFR5cGVPUk1UYWJsZVNwZWNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpbWFyeUtleSBJbmRpY2F0ZXMgaWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBjb25zdHJhaW50cyBBIGxpc3Qgb2YgcmF3IFNRTCBjb25zdHJhaW50cyB0byBhcHBseSB0byB0aGUgdGFibGUvY29sdW1uLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZm9yZWlnbktleXMgQSBsaXN0IG9mIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVPUk1UYWJsZVNwZWMgPSBUeXBlT1JNUXVlcnkgJiB7XG4gIHByaW1hcnlLZXk6IGJvb2xlYW47XG4gIGNvbnN0cmFpbnRzOiBzdHJpbmdbXTtcbiAgZm9yZWlnbktleXM6IHN0cmluZ1tdO1xufTtcbiIsImltcG9ydCB7IFNRTE9wZXJhdG9yIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgcXVlcnkgbGltaXQgZm9yIFR5cGVPUk0tYmFja2VkIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybiBpbiBhIHNpbmdsZSBwYWdlIHdoZW4gcGFnaW5hdGluZyByZXN1bHRzLlxuICogQGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNUXVlcnlMaW1pdCA9IDI1MDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBvcGVyYXRvciBuYW1lcyB0byBTUUwgb3BlcmF0b3JzLlxuICogQHN1bW1hcnkgQ29uc3RhbnRzIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycyB1c2VkIHdoZW4gdHJhbnNsYXRpbmcgaGlnaC1sZXZlbCBmaWx0ZXJzIGludG8gU1FMIHZpYSBUeXBlT1JNLlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zdGdyZVNRTE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVRVUFMIEVxdWFsaXR5IG9wZXJhdG9yICg9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERJRkZFUkVOVCBJbmVxdWFsaXR5IG9wZXJhdG9yICg8PilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdHRVIgR3JlYXRlciB0aGFuIG9wZXJhdG9yICg+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUl9FUSBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKD49KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNNQUxMRVIgTGVzcyB0aGFuIG9wZXJhdG9yICg8KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNNQUxMRVJfRVEgTGVzcyB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yICg8PSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOT1QgTmVnYXRpb24gb3BlcmF0b3IgKE5PVClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTiBJbiBhcnJheSBvcGVyYXRvciAoSU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVHRVhQIFJlZ3VsYXIgZXhwcmVzc2lvbiBvcGVyYXRvciAofilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJUkVHRVhQIENhc2UtaW5zZW5zaXRpdmUgcmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMSUtFIFBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKExJS0UpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUxJS0UgQ2FzZS1pbnNlbnNpdGl2ZSBwYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdG9yIChJTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCRVRXRUVOIFJhbmdlIG9wZXJhdG9yIChCRVRXRUVOKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05VTEwgTlVMTCBjaGVjayBvcGVyYXRvciAoSVMgTlVMTClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJU19OT1RfTlVMTCBOT1QgTlVMTCBjaGVjayBvcGVyYXRvciAoSVMgTk9UIE5VTEwpXG4gKiBAY29uc3QgVHlwZU9STU9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTE9wZXJhdG9yVHlwZX1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1PcGVyYXRvcjogUmVjb3JkPHN0cmluZywgU1FMT3BlcmF0b3IgfCBzdHJpbmc+ID0ge1xuICBFUVVBTDogU1FMT3BlcmF0b3IuRVFVQUwsXG4gIERJRkZFUkVOVDogU1FMT3BlcmF0b3IuTk9UX0VRVUFMLFxuICBCSUdHRVI6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTixcbiAgQklHR0VSX0VROiBTUUxPcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsXG4gIFNNQUxMRVI6IFNRTE9wZXJhdG9yLkxFU1NfVEhBTixcbiAgU01BTExFUl9FUTogU1FMT3BlcmF0b3IuTEVTU19USEFOX09SX0VRVUFMLFxuICBCRVRXRUVOOiBTUUxPcGVyYXRvci5CRVRXRUVOLFxuICBOT1Q6IFwiTk9UXCIsXG4gIElOOiBTUUxPcGVyYXRvci5JTixcbiAgSVNfTlVMTDogU1FMT3BlcmF0b3IuSVNfTlVMTCxcbiAgSVNfTk9UX05VTEw6IFNRTE9wZXJhdG9yLklTX05PVF9OVUxMLFxuICBSRUdFWFA6IFwiflwiLFxuICBJUkVHRVhQOiBcIn4qXCIsXG4gIExJS0U6IFNRTE9wZXJhdG9yLkxJS0UsXG4gIElMSUtFOiBTUUxPcGVyYXRvci5JTElLRSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2YgbG9naWNhbCBvcGVyYXRvciBuYW1lcyB0byBTUUwgb3BlcmF0b3JzLlxuICogQHN1bW1hcnkgQ29uc3RhbnRzIGZvciBsb2dpY2FsIG9wZXJhdG9ycyB1c2VkIHdoZW4gYnVpbGRpbmcgV0hFUkUgY2xhdXNlIGdyb3VwcyBpbiBUeXBlT1JNIHF1ZXJpZXMuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBTkQgTG9naWNhbCBBTkQgb3BlcmF0b3IgKEFORClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPUiBMb2dpY2FsIE9SIG9wZXJhdG9yIChPUilcbiAqIEBjb25zdCBUeXBlT1JNR3JvdXBPcGVyYXRvclxuICogQHR5cGUge1Bvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZX1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBBTkQ6IFwiQU5EXCIsXG4gIE9SOiBcIk9SXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWFsIGNvbnN0YW50IHZhbHVlcyB1c2VkIGluIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBTdHJpbmcgY29uc3RhbnRzIHJlcHJlc2VudGluZyBzcGVjaWFsIHZhbHVlcyB1c2VkIHdoaWxlIGNvbXBvc2luZyBTUUwgd2l0aCBUeXBlT1JNLlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zdGdyZVNRTENvbnN0VHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTEwgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG51bGwgdmFsdWUuXG4gKiBAY29uc3QgVHlwZU9STUNvbnN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNQ29uc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIE5VTEw6IFwiTlVMTFwiLFxufTtcbiIsImltcG9ydCB7IFBhZ2luYXRvciwgUGFnaW5nRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgRmluZE1hbnlPcHRpb25zLCBSZXBvc2l0b3J5IGFzIFJlcG8gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFnaW5hdG9yIGZvciBUeXBlT1JNIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHBhZ2luYXRpb24gZm9yIFR5cGVPUk0tYnVpbHQgcXVlcmllcyB1c2luZyB0YWtlL3NraXAgZm9yIGVmZmljaWVudCBuYXZpZ2F0aW9uIHRocm91Z2ggcmVzdWx0IHNldHMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IGNvbnRhaW5lciB0byBwYWdpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAY2xhc3MgVHlwZU9STVBhZ2luYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgdXNpbmcgVHlwZU9STVBhZ2luYXRvclxuICogY29uc3QgcGFnaW5hdG9yID0gbmV3IFR5cGVPUk1QYWdpbmF0b3IoYWRhcHRlciwgeyBxdWVyeTogcWIgfSwgMTAsIFVzZXIpO1xuICogY29uc3QgcGFnZTEgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqIGNvbnN0IHBhZ2UyID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMik7XG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIFIsXG4gIFR5cGVPUk1RdWVyeVxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBiYXNlZCBvbiB0aGUgcmVjb3JkIGNvdW50IGFuZCBwYWdlIHNpemVcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqL1xuICBvdmVycmlkZSBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxQYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgcmVjb3JkIGNvdW50XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZWNvcmRDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgX19yZXBvPzogUmVwbzxhbnk+O1xuXG4gIHByb3RlY3RlZCBnZXQgcmVwbygpIHtcbiAgICBpZiAoIXRoaXMuX19yZXBvKSB7XG4gICAgICB0aGlzLl9fcmVwbyA9ICh0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXIpLmNsaWVudC5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBKYXZhU2NyaXB0IFJlZ0V4cCBwYXR0ZXJuIHRvIGEgUG9zdGdyZVNRTCBQT1NJWCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBzdW1tYXJ5IEFjY2VwdHMgZWl0aGVyIGEgUmVnRXhwIG9iamVjdCBvciBhIHN0cmluZyByZXByZXNlbnRhdGlvbiAoL3BhdHRlcm4vZmxhZ3MpIGFuZCByZXR1cm5zIHRoZSByYXcgcGF0dGVybiBjb21wYXRpYmxlIHdpdGggUG9zdGdyZVNRTCdzIH4gYW5kIH4qIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30ganNSZWdleCBKYXZhU2NyaXB0IFJlZ0V4cCBvYmplY3Qgb3IgcGF0dGVybiBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFBvc3RncmVTUUwtY29tcGF0aWJsZSByZWdleCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFV0aWxzIGFzIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlc1xuICogICBBcHAtPj5VdGlsczogY29udmVydEpzUmVnZXhUb1Bvc3RncmVzKFJlZ0V4cChcImZvby4qXCIsXCJpXCIpKVxuICogICBVdGlscy0+PlV0aWxzOiBQYXJzZSBzdHJpbmcgb3IgdXNlIFJlZ0V4cC5zb3VyY2VcbiAqICAgVXRpbHMtLT4+QXBwOiBcImZvby4qXCJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcyhqc1JlZ2V4OiBSZWdFeHAgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByeHAgPSBuZXcgUmVnRXhwKC9eXFwvKC4rKVxcLyhcXHcrKSQvZyk7XG4gIGlmICh0eXBlb2YganNSZWdleCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1hdGNoID0gcnhwLmV4ZWMoanNSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBwXSA9IG1hdGNoO1xuICAgICAganNSZWdleCA9IHA7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKGpzUmVnZXgpIDoganNSZWdleDtcblxuICBjb25zdCBwYXR0ZXJuID0gcmVnZXguc291cmNlO1xuXG4gIHJldHVybiBwYXR0ZXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRFYWdlclJlbGF0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPixcbiAgY2FjaGU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuKTogeyBub25FYWdlcjogc3RyaW5nW107IHJlbGF0aW9uczogc3RyaW5nW10gfSB7XG4gIGxldCBpbnN0YW5jZTogTTtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZSA9IG5ldyBtKCk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgaW5zdGFudGlhdGUgbW9kZWwgJHttLm5hbWV9IGZvciBlYWdlciByZWxhdGlvbiBjYWxjdWxhdGlvbjogJHtlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlbHMgPSBSZXBvc2l0b3J5LnJlbGF0aW9ucyhtKTtcbiAgY2FjaGVbbS5uYW1lXSA9IGNhY2hlW20ubmFtZV0gfHwgdW5kZWZpbmVkO1xuICBpZiAoY2FjaGVbbS5uYW1lXSkge1xuICAgIHJldHVybiBjYWNoZVttLm5hbWVdO1xuICB9XG4gIGNvbnN0IHJlbGF0aW9ucyA9IHJlbHMucmVkdWNlKFxuICAgIChhY2N1bTogeyByZWxhdGlvbnM6IHN0cmluZ1tdOyBub25FYWdlcjogc3RyaW5nW10gfSwgYXR0cikgPT4ge1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT04pLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgYXR0cixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRlY29yYXRvcnMgfHxcbiAgICAgICAgIWRlY29yYXRvcnMuZGVjb3JhdG9ycyB8fFxuICAgICAgICAhZGVjb3JhdG9ycy5kZWNvcmF0b3JzLmxlbmd0aFxuICAgICAgKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gZGVjb3JhdG9ycyBmb3VuZCBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG4gICAgICBpZiAoZGVjb3JhdG9ycy5kZWNvcmF0b3JzLmxlbmd0aCA+IDEpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBkZWNvcmF0b3JzIGZvdW5kIGZvciBwcm9wZXJ0eSAke2F0dHJ9IG9uIG1vZGVsICR7bS5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZGVjb3JhdG9ycy5kZWNvcmF0b3JzWzBdO1xuICAgICAgY29uc3QgZWFnZXIgPSBkZWNvcmF0b3IucHJvcHMucG9wdWxhdGU7XG4gICAgICBsZXQgY2xhenogPSBkZWNvcmF0b3IucHJvcHMuY2xhc3M7XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiKSBjbGF6eiA9IE1vZGVsLmdldChjbGF6eikgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpIGNsYXp6ID0gY2xhenooKTtcbiAgICAgIGlmICghY2xhenopXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBjbGFzcyBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG5cbiAgICAgIGlmICghZWFnZXIpIHtcbiAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaChhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKGF0dHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWNjdW0ucmVsYXRpb25zLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgIGNvbnN0IHsgbm9uRWFnZXIsIHJlbGF0aW9ucyB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyhjbGF6eiwgY2FjaGUpO1xuICAgICAgICBpZiAobm9uRWFnZXIubGVuZ3RoICYmIGFjY3VtLnJlbGF0aW9ucy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgIGNvbnN0IG5vbkVhZ2VyUmVsYXRpb25zID0gbm9uRWFnZXIubWFwKChuZSkgPT4gYCR7YXR0cn0uJHtuZX1gKTtcbiAgICAgICAgICBhY2N1bS5ub25FYWdlci5wdXNoKC4uLm5vbkVhZ2VyUmVsYXRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVscyA9IHJlbGF0aW9ucy5tYXAoKG5lKSA9PiBgJHthdHRyfS4ke25lfWApO1xuICAgICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKC4uLnJlbHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHsgbm9uRWFnZXI6IFtdLCByZWxhdGlvbnM6IFtdIH1cbiAgKTtcbiAgY2FjaGVbbS5uYW1lXSA9IHJlbGF0aW9ucztcbiAgcmV0dXJuIHJlbGF0aW9ucztcbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFJlcG9zaXRvcnksXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgdHJhbnNsYXRlT3BlcmF0b3JzIH0gZnJvbSBcIi4vdHJhbnNsYXRlXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnlMaW1pdCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVHlwZU9STVBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucywgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zV2hlcmUgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNXaGVyZVwiO1xuaW1wb3J0IHsgc3BsaXRFYWdlclJlbGF0aW9ucyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuY2xpZW50XG4gICAgICAgIC5nZXRSZXBvc2l0b3J5KFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuZnJvbVNlbGVjdG9yXVxuICAgICAgICApXG4gICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIodGFibGVOYW1lKSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4sXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLm1hcCgocykgPT4gYCR7dGFibGVOYW1lfS4ke3MgYXMgc3RyaW5nfWApXG4gICAgICApO1xuICAgIGVsc2UgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KCk7XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbilcbiAgICAgIHEucXVlcnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT5cbiAgICAgICkucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT47XG5cbiAgICBsZXQgb3JkZXJCeUFyZ3M6IFtzdHJpbmcsIFwiREVTQ1wiIHwgXCJBU0NcIl07XG4gICAgaWYgKCF0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgIG9yZGVyQnlBcmdzID0gW1xuICAgICAgICBgJHt0YWJsZU5hbWV9LiR7ZmluZFByaW1hcnlLZXkobSkuaWQgYXMgc3RyaW5nfWAsXG4gICAgICAgIE9yZGVyRGlyZWN0aW9uLkFTQy50b1VwcGVyQ2FzZSgpIGFzIFwiQVNDXCIsXG4gICAgICBdO1xuICAgIGVsc2VcbiAgICAgIG9yZGVyQnlBcmdzID0gW1xuICAgICAgICBgJHt0YWJsZU5hbWV9LiR7dGhpcy5vcmRlckJ5U2VsZWN0b3JbMF0gYXMgc3RyaW5nfWAsXG4gICAgICAgIHRoaXMub3JkZXJCeVNlbGVjdG9yWzFdLnRvVXBwZXJDYXNlKCkgYXMgXCJERVNDXCIgfCBcIkFTQ1wiLFxuICAgICAgXTtcblxuICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55Pikub3JkZXJCeSguLi5vcmRlckJ5QXJncyk7XG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdCh0aGlzLmxpbWl0U2VsZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGxpbWl0IG9mICR7VHlwZU9STVF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikubGltaXQoVHlwZU9STVF1ZXJ5TGltaXQpO1xuICAgIH1cblxuICAgIC8vIEFkZCBvZmZzZXRcbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55Pikuc2tpcCh0aGlzLm9mZnNldFNlbGVjdG9yKTtcblxuICAgIHJldHVybiBxIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHBhZ2luYXRvciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhIFR5cGVPUk1QYWdpbmF0b3IgZm9yIHBhZ2luYXRlZCByZXN1bHRzLlxuICAgKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHBhZ2luYXRvci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUncyBhbiBlcnJvciBidWlsZGluZyB0aGUgcXVlcnkuXG4gICAqL1xuICBhc3luYyBwYWdpbmF0ZTxSPihzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBUeXBlT1JNUXVlcnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrQXR0ciBUaGUgcHJpbWFyeSBrZXkgYXR0cmlidXRlIG9mIHRoZSBtb2RlbC5cbiAgICogQHJldHVybiB7YW55fSBUaGUgcHJvY2Vzc2VkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1JlY29yZChyOiBhbnksIHBrQXR0cjoga2V5b2YgTSkge1xuICAgIGlmICh0eXBlb2Ygcltwa0F0dHJdICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmZyb21TZWxlY3RvciwgcGtBdHRyLCByW3BrQXR0cl0pO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgVHlwZU9STSBxdWVyeSBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBTZW5kcyB0aGUgYnVpbHQgU2VsZWN0UXVlcnlCdWlsZGVyIHRvIHRoZSBkYXRhYmFzZSB2aWEgVHlwZU9STSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy5cbiAgICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcmF3SW5wdXQgVGhlIHF1ZXJ5IGNvbnRhaW5lciB0byBleGVjdXRlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0cy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogVHlwZU9STVF1ZXJ5PE0+KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmF3KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRXhlY3V0aW5nIHJhdyBxdWVyeTogJHsocmF3SW5wdXQucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4pLmdldFNxbCgpfWBcbiAgICApO1xuXG4gICAgY29uc3QgeyBub25FYWdlciB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgLy8gZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICByYXdJbnB1dC5xdWVyeSA9IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5zZXRGaW5kT3B0aW9ucyh7XG4gICAgICBsb2FkRWFnZXJSZWxhdGlvbnM6IHRydWUsXG4gICAgICBsb2FkUmVsYXRpb25JZHM6IHtcbiAgICAgICAgcmVsYXRpb25zOiBub25FYWdlcixcbiAgICAgIH0sXG4gICAgfSkgYXMgYW55O1xuICAgIC8vIH1cbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb3VudGVyID0gMCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBGaW5kT3B0aW9uc1doZXJlPE0+W10gfCBGaW5kT3B0aW9uc1doZXJlPE0+IHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gUG9zdGdyZVNRTCBjb25kaXRpb25zXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uIHN0cnVjdHVyZXNcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWJsZU5hbWVdIC0gdGhlIHBvc2l0aW9uYWwgaW5kZXggb2YgdGhlIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBQb3N0Z3Jlc1NRTCBjb25kaXRpb25cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgdHJhbnNsYXRlT3BlcmF0b3JzXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICpcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBFeHRyYWN0IGNvbmRpdGlvbiBwYXJ0c1xuICAgKlxuICAgKiAgIGFsdCBTaW1wbGUgY29tcGFyaXNvbiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+dHJhbnNsYXRlT3BlcmF0b3JzOiB0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXG4gICAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+U3RhdGVtZW50OiBSZXR1cm4gUG9zdGdyZVNRTCBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDcmVhdGUgY29uZGl0aW9uIHdpdGggY29sdW1uLCBvcGVyYXRvciwgYW5kIHZhbHVlXG4gICAqICAgZWxzZSBOT1Qgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oYXR0cjEpXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBOT1QgdG8gY29uZGl0aW9uc1xuICAgKiAgIGVsc2UgQU5EL09SIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb21wYXJpc29uKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDb21iaW5lIGNvbmRpdGlvbnMgd2l0aCBBTkQvT1JcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gY29uZGl0aW9ucyBhcnJheVxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlQ29uZGl0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICBjb3VudGVyID0gMCxcbiAgICBjb25kaXRpb25hbE9wPzogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4gICk6IFR5cGVPUk1RdWVyeTxNPiB7XG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwYXJzZSgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgICAgY29uc3Qgc3FsT3BlcmF0b3IgPSB0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpO1xuICAgICAgY29uc3QgYXR0clJlZiA9IGAke2F0dHIxfSR7Y291bnRlcn1gO1xuICAgICAgY29uc3QgcXVlcnlTdHIgPSBgJHt0YWJsZU5hbWV9LiR7YXR0cjF9ICR7c3FsT3BlcmF0b3J9IDoke2F0dHJSZWZ9YDtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgICAgW2F0dHJSZWZdOiBjb21wYXJpc29uLFxuICAgICAgfTtcbiAgICAgIHN3aXRjaCAoY29uZGl0aW9uYWxPcCkge1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIuYW5kV2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5PUjpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLm9yV2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgT3BlcmF0b3IuTk9UOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi53aGVyZShxdWVyeVN0ciwgdmFsdWVzKSBhcyBhbnksXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJzZSgpO1xuICAgIH1cbiAgICAvLyBGb3IgTk9UIG9wZXJhdG9yXG4gICAgZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9UIG9wZXJhdG9yIG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9XG4gICAgLy8gRm9yIEFORC9PUiBvcGVyYXRvcnNcbiAgICBlbHNlIHtcbiAgICAgIHFiID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4sIHRhYmxlTmFtZSwgcWIsICsrY291bnRlcilcbiAgICAgICAgLnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIGNvbXBhcmlzb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcWIsXG4gICAgICAgICsrY291bnRlcixcbiAgICAgICAgb3BlcmF0b3JcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuLi9UeXBlT1JNQWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRhdGFiYXNlIHNlcXVlbmNlIGZvciBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yIHtAbGluayBTZXF1ZW5jZX1zLCBkZWxlZ2F0aW5nIHRvIHRoZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9IHRvIGZldGNoIGFuZCBpbmNyZW1lbnQgdmFsdWVzIHdoaWxlIGhhbmRsaW5nIHR5cGUgcGFyc2luZyBhbmQgZXJyb3IgdHJhbnNsYXRpb24uXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zIChuYW1lLCB0eXBlLCBzdGFydFdpdGgsIGluY3JlbWVudEJ5LCBldGMuKS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIGV4ZWN1dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucy5cbiAqIEBjbGFzcyBUeXBlT1JNU2VxdWVuY2VcbiAqIEBpbXBsZW1lbnRzIFNlcXVlbmNlXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFuZCB1c2UgYSBUeXBlT1JNLWJhY2tlZCBzZXF1ZW5jZVxuICogY29uc3Qgc2VxID0gbmV3IFR5cGVPUk1TZXF1ZW5jZSh7IG5hbWU6IFwidXNlcl9pZF9zZXFcIiwgdHlwZTogXCJOdW1iZXJcIiwgc3RhcnRXaXRoOiAxLCBpbmNyZW1lbnRCeTogMSB9LCBhZGFwdGVyKTtcbiAqIGNvbnN0IG5leHRJZCA9IGF3YWl0IHNlcS5uZXh0KCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VxIGFzIFR5cGVPUk1TZXF1ZW5jZVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gKiAgIEFwcC0+PlNlcTogbmV4dCgpXG4gKiAgIFNlcS0+PlNlcTogY3VycmVudCgpXG4gKiAgIFNlcS0+PkFkYXB0ZXI6IHJhdyhTRUxFQ1QgY3VycmVudF92YWx1ZSAuLi4pXG4gKiAgIEFkYXB0ZXItPj5EQjogUXVlcnkgY3VycmVudCB2YWx1ZVxuICogICBEQi0tPj5BZGFwdGVyOiBjdXJyZW50X3ZhbHVlXG4gKiAgIEFkYXB0ZXItLT4+U2VxOiB2YWx1ZVxuICogICBTZXEtPj5TZXE6IGluY3JlbWVudChjdXJyZW50KVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcobmV4dHZhbChuYW1lKSlcbiAqICAgQWRhcHRlci0+PkRCOiBuZXh0dmFsKClcbiAqICAgREItLT4+QWRhcHRlcjogbmV4dCB2YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLS0+PkFwcDogcGFyc2VkIG5leHQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1TZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zLFxuICAgIHByb3RlY3RlZCBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlclxuICApIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBhc3luYyBjdXJyZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIHNlcXVlbmNlX25hbWUsIHN0YXJ0X3ZhbHVlLCBtaW5pbXVtX3ZhbHVlLCBpbmNyZW1lbnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2VxdWVuY2VzIFdIRVJFIHNlcXVlbmNlX25hbWUgPSAkMWAsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgICAvLyBJZiBubyBzZXF1ZW5jZSBleGlzdHMsIGZvcmNlIGEgY2xlYXIsIGNvbnNpc3RlbnQgZXJyb3IgZm9yIGNhbGxlcnNcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb3dzKSB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFNlcXVlbmNlICR7bmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAvLyBpbmZvcm1hdGlvbl9zY2hlbWEgZG9lcyBub3QgZXhwb3NlIHRoZSBjdXJyZW50IHJ1bnRpbWUgdmFsdWUgcmVsaWFibHk7IGZhbGwgYmFjayB0byBzdGFydF92YWx1ZVxuICAgICAgY29uc3Qgcm93ID0gcm93c1swXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgcm93W1wiY3VycmVudF92YWx1ZVwiXSA/PyByb3dbXCJsYXN0X3ZhbHVlXCJdID8/IHJvd1tcInN0YXJ0X3ZhbHVlXCJdO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2UoY2FuZGlkYXRlIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5hZGFwdGVyLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFBhcnNlcyB0aGUge0BsaW5rIFNlcXVlbmNlfSB2YWx1ZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICByZXR1cm4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLm9wdGlvbnMudHlwZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGluY3JlbWVudHMgdGhlIHNlcXVlbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTZXF1ZW5jZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gY3VycmVudFxuICAgKiBAcGFyYW0gY291bnRcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbmNyZW1lbnQoXG4gICAgY3VycmVudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIGNvdW50PzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyB0eXBlLCBpbmNyZW1lbnRCeSwgbmFtZSwgc3RhcnRXaXRoIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHR5cGUgIT09IFwiTnVtYmVyXCIgJiYgdHlwZSAhPT0gXCJCaWdJbnRcIilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ2Fubm90IGluY3JlbWVudCBzZXF1ZW5jZSBvZiB0eXBlICR7dHlwZX0gd2l0aCAke2NvdW50fWBcbiAgICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBTRUxFQ1QgbmV4dHZhbCgkMSkgQVMgbmV4dHZhbDtgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdmFsID0gQXJyYXkuaXNBcnJheShyb3dzKSAmJiByb3dzWzBdID8gcm93c1swXVtcIm5leHR2YWxcIl0gOiByb3dzO1xuICAgICAgcmV0dXJuIHZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgaWYgKCFuYW1lKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGluY3JlbWVudCBzZXF1ZW5jZSB3aXRob3V0IGEgbmFtZTogJHtuYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc2VxdWVuY2UgaWYgbWlzc2luZy4gSWRlbnRpZmllcnMgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQsIHNvIHF1b3RlIHRoZSBuYW1lLlxuICAgICAgY29uc3QgcXVvdGVkID0gYFwiJHtuYW1lLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgQ1JFQVRFIFNFUVVFTkNFIElGIE5PVCBFWElTVFMgJHtxdW90ZWR9IFNUQVJUIFdJVEggJHtzdGFydFdpdGh9IElOQ1JFTUVOVCBCWSAke2luY3JlbWVudEJ5fSBOTyBDWUNMRTtgLFxuICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByb3dzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBuZXh0dmFsKCQxKSBBUyBuZXh0dmFsO2AsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB2YWwgPSBBcnJheS5pc0FycmF5KHJvd3MpICYmIHJvd3NbMF0gPyByb3dzWzBdW1wibmV4dHZhbFwiXSA6IHJvd3M7XG4gICAgICByZXR1cm4gdmFsIGFzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIHRoZSBuZXh0IHZhbHVlIGluIHRoIHNlcXVlbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBjYWxscyB7QGxpbmsgU2VxdWVuY2UjcGFyc2V9IG9uIHRoZSBjdXJyZW50IHZhbHVlXG4gICAqIGZvbGxvd2VkIGJ5IHtAbGluayBTZXF1ZW5jZSNpbmNyZW1lbnR9XG4gICAqXG4gICAqL1xuICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuY3VycmVudCgpO1xuICAgIHJldHVybiB0aGlzLmluY3JlbWVudChjdXJyZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gKGF3YWl0IHRoaXMuY3VycmVudCgpKSBhcyBudW1iZXI7XG4gICAgY29uc3QgaW5jcmVtZW50QnkgPSB0aGlzLnBhcnNlKHRoaXMub3B0aW9ucy5pbmNyZW1lbnRCeSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCA9IGF3YWl0IHRoaXMuaW5jcmVtZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgICh0aGlzLnBhcnNlKGNvdW50KSBhcyBudW1iZXIpICogaW5jcmVtZW50QnlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlOiAobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICByYW5nZS5wdXNoKGN1cnJlbnQgKyBpbmNyZW1lbnRCeSAqICh0aGlzLnBhcnNlKGkpIGFzIG51bWJlcikpO1xuICAgIH1cbiAgICBpZiAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT09IG5leHQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc2NhbGN1bGF0aW9uIG9mIHJhbmdlXCIpO1xuICAgIHJldHVybiByYW5nZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5kZXhNZXRhZGF0YSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVwb3NpdG9yeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBuYW1lIGZvciBhIENvdWNoREIgaW5kZXhcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4IGJ5IGNvbWJpbmluZyBuYW1lIHBhcnRzLCBjb21wb3NpdGlvbnMsIGFuZCBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWUgLSBBcnJheSBvZiBuYW1lIHBhcnRzIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtkaXJlY3Rpb25dIC0gT3B0aW9uYWwgc29ydCBkaXJlY3Rpb24gZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gaW5jbHVkZSBpbiB0aGUgaW5kZXggbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBUaGUgc2VwYXJhdG9yIHRvIHVzZSBiZXR3ZWVuIHBhcnRzIG9mIHRoZSBpbmRleCBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgaW5kZXggbmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUluZGV4TmFtZShcbiAgbmFtZTogc3RyaW5nW10sXG4gIGRpcmVjdGlvbj86IE9yZGVyRGlyZWN0aW9uLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmFtZS5tYXAoKG4pID0+IChuID09PSBUeXBlT1JNS2V5cy5UQUJMRSA/IFwidGFibGVcIiA6IG4pKSxcbiAgICAuLi4oY29tcG9zaXRpb25zIHx8IFtdKSxcbiAgICAuLi4oZGlyZWN0aW9uID8gW2RpcmVjdGlvbl0gOiBbXSksXG4gICAgVHlwZU9STUtleXMuSU5ERVgsXG4gIF0uam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgQ291Y2hEQiBpbmRleCBjb25maWd1cmF0aW9ucyBmb3IgbW9kZWxzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc2V0IG9mIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgYmFzZWQgb24gdGhlIG1ldGFkYXRhIG9mIHRoZSBwcm92aWRlZCBtb2RlbHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0gbW9kZWxzIC0gQXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzIHRvIGdlbmVyYXRlIGluZGV4ZXMgZm9yXG4gKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IEFycmF5IG9mIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhlc1xuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4TmFtZVxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5nZW5lcmF0ZUluZGV4ZXM6IG1vZGVsc1xuICpcbiAqICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGJhc2UgdGFibGUgaW5kZXhcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleE5hbWU6IFtDb3VjaERCS2V5cy5UQUJMRV1cbiAqICAgZ2VuZXJhdGVJbmRleE5hbWUtLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgdGFibGUgaW5kZXggY29uZmlnXG4gKlxuICogICBsb29wIEZvciBlYWNoIG1vZGVsXG4gKiAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IGluZGV4ZXMgbWV0YWRhdGFcbiAqICAgICBSZXBvc2l0b3J5LS0+PmdlbmVyYXRlSW5kZXhlczogaW5kZXggbWV0YWRhdGFcbiAqXG4gKiAgICAgbG9vcCBGb3IgZWFjaCBpbmRleCBpbiBtZXRhZGF0YVxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogRXh0cmFjdCBpbmRleCBwcm9wZXJ0aWVzXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5SZXBvc2l0b3J5OiBHZXQgdGFibGUgbmFtZVxuICogICAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IHRhYmxlTmFtZVxuICpcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IERlZmluZSBuZXN0ZWQgZ2VuZXJhdGUgZnVuY3Rpb25cbiAqXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoKSBmb3IgZGVmYXVsdCBvcmRlclxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGluZGV4IG5hbWUgYW5kIGNvbmZpZ1xuICpcbiAqICAgICAgIGFsdCBIYXMgZGlyZWN0aW9uc1xuICogICAgICAgICBsb29wIEZvciBlYWNoIGRpcmVjdGlvblxuICogICAgICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ2FsbCBnZW5lcmF0ZShkaXJlY3Rpb24pXG4gKiAgICAgICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIG9yZGVyZWQgaW5kZXggY29uZmlnXG4gKiAgICAgICAgIGVuZFxuICogICAgICAgZW5kXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICpcbiAqICAgZ2VuZXJhdGVJbmRleGVzLS0+PkNhbGxlcjogQXJyYXkgb2YgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbik6IFR5cGVPUk1RdWVyeVtdIHtcbiAgY29uc3QgdGFibGVOYW1lID0gZ2VuZXJhdGVJbmRleE5hbWUoW1R5cGVPUk1LZXlzLlRBQkxFXSk7XG4gIGNvbnN0IGluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVPUk1RdWVyeT4gPSB7fTtcbiAgaW5kZXhlc1t0YWJsZU5hbWVdID0ge1xuICAgIHF1ZXJ5OiBgYCxcbiAgICB2YWx1ZXM6IFtdLFxuICB9O1xuXG4gIG1vZGVscy5mb3JFYWNoKChtKSA9PiB7XG4gICAgY29uc3QgaW5kOiBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPiA9IFJlcG9zaXRvcnkuaW5kZXhlcyhtKTtcbiAgICBPYmplY3QuZW50cmllcyhpbmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgayA9IE9iamVjdC5rZXlzKHZhbHVlKVswXTtcblxuICAgICAgbGV0IHsgY29tcG9zaXRpb25zIH0gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobSk7XG4gICAgICBjb21wb3NpdGlvbnMgPSBjb21wb3NpdGlvbnMgfHwgW107XG5cbiAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlKCkge1xuICAgICAgICBjb25zdCBuYW1lID0gW2tleSwgLi4uKGNvbXBvc2l0aW9ucyBhcyBbXSksIFBlcnNpc3RlbmNlS2V5cy5JTkRFWF0uam9pbihcbiAgICAgICAgICBEZWZhdWx0U2VwYXJhdG9yXG4gICAgICAgICk7XG5cbiAgICAgICAgaW5kZXhlc1tuYW1lXSA9IHtcbiAgICAgICAgICBxdWVyeTogYENSRUFURSBJTkRFWCAkMSBPTiAkMiAoJDMpO2AsXG4gICAgICAgICAgdmFsdWVzOiBbbmFtZSwgdGFibGVOYW1lLCBrZXldLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBnZW5lcmF0ZSgpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoaW5kZXhlcyk7XG59XG4iLCJpbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgSVJlcG9zaXRvcnksXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIsIFJlcG9zaXRvcnkgYXMgTmF0aXZlUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmZvcmNlRGJEZWNvcmF0b3JzUmVjdXJzaXZlPFxuICBNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPixcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KFxuICByZXBvOiBSLFxuICBjb250ZXh0OiBDLFxuICBtb2RlbDogTSxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHByZWZpeDogc3RyaW5nLFxuICBvbGRNb2RlbD86IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFIsIFYsIEYsIEM+KFxuICAgIHJlcG8sXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBvcGVyYXRpb24sXG4gICAgcHJlZml4LFxuICAgIG9sZE1vZGVsXG4gICk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJMb29wPE4gZXh0ZW5kcyBNb2RlbD4obTogTiwgb2xkTW9kZWw/OiBOKSB7XG4gICAgY29uc3QgciA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobS5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxOPik7XG4gICAgYXdhaXQgZW5mb3JjZURiRGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICAgIHIsXG4gICAgICBjb250ZXh0LFxuICAgICAgbSxcbiAgICAgICFvbGRNb2RlbCAmJiBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICAgID8gT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgICAgOiBvcGVyYXRpb24sXG4gICAgICBwcmVmaXgsXG4gICAgICBvbGRNb2RlbFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbCkpIHtcbiAgICBpZiAoXG4gICAgICBNb2RlbC5pc1Byb3BlcnR5TW9kZWwobW9kZWwsIGtleSkgJiZcbiAgICAgIHR5cGVvZiBtb2RlbFtrZXkgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgYXdhaXQgaW5uZXJMb29wKFxuICAgICAgICBtb2RlbFtrZXkgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSBhcyBhbnksXG4gICAgICAgIG9sZE1vZGVsID8gKG9sZE1vZGVsW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2xkTW9kZWxdIGFzIGFueSkgOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZGVjID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0cnVlLFxuICAgICAgdHJ1ZVxuICAgICkuZGVjb3JhdG9ycy5maW5kKChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCk7XG5cbiAgICBpZiAoXG4gICAgICAhZGVjIHx8XG4gICAgICAhbW9kZWxba2V5IGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHxcbiAgICAgICFBcnJheS5pc0FycmF5KG1vZGVsW2tleSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAobW9kZWxba2V5IGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gYXMgTW9kZWxbXSkubWFwKChtLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBpbm5lckxvb3AoXG4gICAgICAgICAgbSxcbiAgICAgICAgICBvbGRNb2RlbCAmJiBvbGRNb2RlbFtrZXkgYXMga2V5b2YgdHlwZW9mIG9sZE1vZGVsXVxuICAgICAgICAgICAgPyAob2xkTW9kZWxba2V5IGFzIGtleW9mIHR5cGVvZiBvbGRNb2RlbF0gYXMgYW55KVtpXVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zIGZvciBhIGdpdmVuIE1vZGVsIHVzaW5nIHRoZSBUeXBlT1JNQWRhcHRlciwgaW5jbHVkaW5nIGJ1bGsgb3BlcmF0aW9ucyBhbmQgcXVlcnkgYnVpbGRlciBhY2Nlc3Mgd2hpbGUgcHJlc2VydmluZyBEZWNhZi50cyByZXBvc2l0b3J5IHNlbWFudGljcy5cbiAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsIHRoYXQgdGhpcyByZXBvc2l0b3J5IHdpbGwgbWFuYWdlLlxuICogQHBhcmFtIHtBZGFwdGVyPERhdGFTb3VyY2VPcHRpb25zLCBhbnksIFR5cGVPUk1RdWVyeSwgVHlwZU9STUZsYWdzLCBDb250ZXh0PFR5cGVPUk1GbGFncz4+fSBhZGFwdGVyIFRoZSBhZGFwdGVyIHVzZWQgdG8gZXhlY3V0ZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGhlIE1vZGVsIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGJhc2UgUmVwb3NpdG9yeS5cbiAqIEBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeVxuICogY29uc3QgcmVwbyA9IG5ldyBUeXBlT1JNUmVwb3NpdG9yeTxVc2VyPihhZGFwdGVyLCBVc2VyKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGNyZWF0ZWQuaWQpO1xuICpcbiAqIC8vIEJ1bGsgY3JlYXRlXG4gKiBhd2FpdCByZXBvLmNyZWF0ZUFsbChbbmV3IFVzZXIoeyBuYW1lOiBcIkFcIiB9KSwgbmV3IFVzZXIoeyBuYW1lOiBcIkJcIiB9KV0pO1xuICpcbiAqIC8vIFVzaW5nIHRoZSBxdWVyeSBidWlsZGVyXG4gKiBjb25zdCBxYiA9IHJlcG8ucXVlcnlCdWlsZGVyKCk7XG4gKiBjb25zdCByb3dzID0gYXdhaXQgcWIud2hlcmUoXCJuYW1lID0gOm5hbWVcIiwgeyBuYW1lOiBcIkFsaWNlXCIgfSkuZ2V0TWFueSgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBUeXBlT1JNL0RhdGFTb3VyY2VcbiAqXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHByZXBhcmUobW9kZWwsIHBrKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH1cbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCAuLi5hcmdzKVxuICogICBBZGFwdGVyLT4+REI6IElOU0VSVCAuLi5cbiAqICAgREItLT4+QWRhcHRlcjogcm93XG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcm93XG4gKiAgIFJlcG8tPj5BZGFwdGVyOiByZXZlcnQocm93LCBjbGF6eiwgcGssIGlkKVxuICogICBBZGFwdGVyLS0+PlJlcG86IG1vZGVsXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdXNlcyhUeXBlT1JNRmxhdm91cilcbmV4cG9ydCBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+IGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgTSxcbiAgVHlwZU9STVF1ZXJ5PE0sIGFueT4sXG4gIEFkYXB0ZXI8XG4gICAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgYW55LFxuICAgIFR5cGVPUk1RdWVyeSxcbiAgICBUeXBlT1JNRmxhZ3MsXG4gICAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4gID4sXG4gIFR5cGVPUk1GbGFncyxcbiAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogQWRhcHRlcjxcbiAgICAgIERhdGFTb3VyY2VPcHRpb25zLFxuICAgICAgYW55LFxuICAgICAgVHlwZU9STVF1ZXJ5LFxuICAgICAgVHlwZU9STUZsYWdzLFxuICAgICAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4gICAgPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgVHlwZU9STSBxdWVyeSBidWlsZGVyIGZvciB0aGUgcmVwb3NpdG9yeSBlbnRpdHkuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBTZWxlY3RRdWVyeUJ1aWxkZXIgYm91bmQgdG8gdGhpcyByZXBvc2l0b3J5J3MgZW50aXR5IGZvciBhZHZhbmNlZCBxdWVyeWluZy5cbiAgICogQHJldHVybiB7UXVlcnlCdWlsZGVyPE0+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCk6IFF1ZXJ5QnVpbGRlcjxNPiB7XG4gICAgY29uc3QgcmVwbyA9ICh0aGlzLmFkYXB0ZXIgYXMgYW55KS5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkoXG4gICAgICB0aGlzLmNsYXNzW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhc3NdXG4gICAgKTtcbiAgICByZXR1cm4gcmVwby5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIFR5cGVPUk0gUmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIGVudGl0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIFJlcG9zaXRvcnkgYm91bmQgdG8gdGhpcyByZXBvc2l0b3J5J3MgZW50aXR5IGZvciBuYXRpdmUgZnVuY3Rpb25hbGl0eS5cbiAgICogQHJldHVybiB7TmF0aXZlUmVwbzxNPn0gQSBUeXBlT1JNIFJlcG9zaXRvcnkgaW5zdGFuY2UuXG4gICAqL1xuICB0eXBlb3JtUmVwbygpOiBOYXRpdmVSZXBvPE0+IHtcbiAgICByZXR1cm4gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIHRoaXMuY2xhc3NbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGFzc11cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxcbiAgICAgIE0sXG4gICAgICBDb250ZXh0PFR5cGVPUk1GbGFncz4sXG4gICAgICBUeXBlT1JNRmxhZ3NcbiAgICA+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURiRGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuZCBwZXJzaXN0cyBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwsIGRlbGVnYXRlcyBpbnNlcnRpb24gdG8gdGhlIGFkYXB0ZXIsIGFuZCByZWh5ZHJhdGVzIHRoZSBwZXJzaXN0ZWQgc3RhdGUgYmFjayBpbnRvIGEgTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhc3NdLFxuICAgICAgaWQsXG4gICAgICBtb2RlbCBhcyBhbnksXG4gICAgICB0aGlzLnBrLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgbGV0IGM6IENvbnRleHQ8VHlwZU9STUZsYWdzPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIGMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgQ29udGV4dDxUeXBlT1JNRmxhZ3M+O1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KFxuICAgICAgcmVjb3JkLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIHRoaXMucGssXG4gICAgICBpZCxcbiAgICAgIGMgJiYgYy5nZXQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSA/IHRyYW5zaWVudCA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQoXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZ1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlRGJEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIHVwZGF0ZSB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCxcbiAgICAgIHRoaXMucGssXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkLCB0cmFuc2llbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhbmQgcHJlcGFyZXMgbW9kZWxzIGZvciBidWxrIGNyZWF0aW9uLlxuICAgKiBAc3VtbWFyeSBBcHBsaWVzIGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9ucyBhbmQgcmV0dXJucyB0cmFuc2Zvcm1lZCBtb2RlbHMgd2l0aCBjb250ZXh0IGFyZ3MgZm9yIGNyZWF0ZUFsbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGJlIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEYkRlY29yYXRvcnNSZWN1cnNpdmUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRCBhcyBUeXBlT1JNRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgVHlwZU9STUV2ZW50U3Vic2NyaWJlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICogICBELT4+RFM6IG9ic2VydmUoYWRhcHRlciwgb3B0aW9ucylcbiAqICAgRFMtPj5EOiBpbml0aWFsaXplKClcbiAqICAgRC0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFMpXG4gKiAgIFMtLT4+RDogZW1pdHMgaW5zZXJ0L3VwZGF0ZS9yZW1vdmVcbiAqICAgRC0+Pk86IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaCB7XG4gIHByaXZhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlPzogc3RyaW5nO1xuICBwcml2YXRlIGF0dGVtcHRDb3VudGVyOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGltZW91dCA9IDUwMDApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgVHlwZU9STSBub3RpZmljYXRpb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGNoYW5nZSBub3RpZmljYXRpb25zICh0cmFuc2xhdGVkIGZyb20gVHlwZU9STSBldmVudHMpIGFuZCBub3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgcmVjb3JkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWRzIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIFBvc3RncmVTUUxEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAgICogICBOb3RlIG92ZXIgRDogUmVjZWl2ZSBub3RpZmljYXRpb24gZnJvbSBQb3N0Z3JlU1FMXG4gICAqICAgRC0+PkQ6IFBhcnNlIG5vdGlmaWNhdGlvbiBwYXlsb2FkXG4gICAqICAgRC0+PkQ6IEV4dHJhY3QgdGFibGUsIG9wZXJhdGlvbiwgYW5kIGlkc1xuICAgKiAgIEQtPj5POiB1cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKVxuICAgKiAgIEQtPj5EOiBVcGRhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlXG4gICAqICAgRC0+Pkw6IExvZyBzdWNjZXNzZnVsIGRpc3BhdGNoXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBpZHM6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIpO1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3RpZnkgb2JzZXJ2ZXJzXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpO1xuICAgICAgdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBsb2cudmVyYm9zZShgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7b3BlcmF0aW9ufSBmb3IgJHt0YWJsZX1gKTtcbiAgICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIG5vdGlmaWNhdGlvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoZXIgYW5kIHN1YnNjcmliZXMgdG8gVHlwZU9STSBub3RpZmljYXRpb25zLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgb24gdGhlIERhdGFTb3VyY2UgYW5kIGxvZ3MgdGhlIHN1YnNjcmlwdGlvbiBsaWZlY3ljbGUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBUeXBlT1JNRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIHBhcnRpY2lwYW50IERTIGFzIFR5cGVPUk0gRGF0YVNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgRC0+PlM6IENhbGwgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAqICAgUy0+PlM6IENoZWNrIGFkYXB0ZXIgYW5kIG5hdGl2ZVxuICAgKiAgIGFsdCBObyBhZGFwdGVyIG9yIG5hdGl2ZVxuICAgKiAgICAgUy0tPj5TOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUy0+PkRTOiBpbml0aWFsaXplKClcbiAgICogICBTLT4+RFM6IHN1YnNjcmliZXJzLnB1c2goVHlwZU9STUV2ZW50U3Vic2NyaWJlcilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgRFMtLT4+UzogU3Vic2NyaXB0aW9uIGVzdGFibGlzaGVkXG4gICAqICAgICBTLS0+PkQ6IFByb21pc2UgcmVzb2x2ZXNcbiAgICogICAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBzdWJzY3JpcHRpb25cbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEUy0tPj5TOiBFcnJvclxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlamVjdHNcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHN1YnNjcmliZVRvVHlwZU9STSh0aGlzOiBUeXBlT1JNRGlzcGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlci9uYXRpdmUgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyLmNsaWVudC5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgIHRoaXMuYWRhcHRlci5jbGllbnQuc3Vic2NyaWJlcnMucHVzaChcbiAgICAgICAgICBuZXcgVHlwZU9STUV2ZW50U3Vic2NyaWJlcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIuYmluZCh0aGlzKSlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAgICAuY2FsbCh0aGlzKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWJzY3JpYmVkIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9uc2ApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHN1YnNjcmliZSB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnM6ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBpZHM6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFdoZW4gbm8gYWRhcHRlciBpcyBvYnNlcnZlZCAoZS5nLiwgaW4gdW5pdCB0ZXN0cyBpbnZva2luZyB0aGUgaGFuZGxlciBkaXJlY3RseSksXG4gICAgLy8gc2tpcCBub3RpZnlpbmcgb2JzZXJ2ZXJzIGluc3RlYWQgb2YgdGhyb3dpbmcsIHNvIHRoZSBkaXNwYXRjaGVyIGNhbiBwcm9jZWVkLlxuICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgc2VtYW50aWNzIG9mIFwiYmVzdCBlZmZvcnRcIiBub3RpZmljYXRpb25zLlxuICAgIC8vIERlbGVnYXRlIHRvIGJhc2UgaW1wbGVtZW50YXRpb24gd2hlbiBhbiBhZGFwdGVyIGlzIHByZXNlbnQuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3RhYmxlfToke29wZXJhdGlvbn1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbHVtbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvQ29sdW1uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0luZGV4TWV0YWRhdGFBcmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW10sXG4gIGluZGV4ZXM/OiBJbmRleE1ldGFkYXRhQXJnc1tdXG4pIHtcbiAgY29uc3QgY29scyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgIChjOiBDb2x1bW5NZXRhZGF0YUFyZ3MpID0+XG4gICAgICBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eVxuICApO1xuXG4gIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgIChjOiBSZWxhdGlvbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgaWYgKGluZGV4ZXMpIHtcbiAgICBjb25zdCBpbmR4ID0gaW5kZXhlcy5maWx0ZXIoXG4gICAgICAoYzogSW5kZXhNZXRhZGF0YUFyZ3MpID0+XG4gICAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgKGMuY29sdW1ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcGVydHkpXG4gICAgKTtcbiAgICBpbmR4LmZvckVhY2goKGkpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oaSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpc1xuICogZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRvIG1hcmsgYSBjbGFzcyBwcm9wZXJ0eSBhcyBhIGRhdGFiYXNlIGNvbHVtbi5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIG11bHRpcGxlIG92ZXJsb2FkcyB0byBkZWZpbmUgY29sdW1uIG1ldGFkYXRhIHN1Y2ggYXMgdHlwZSwgbGVuZ3RoLCBwcmVjaXNpb24sIHdpZHRoLCBlbnVtLCBzZXQsIGhzdG9yZSwgYW5kIGVtYmVkZGVkIHR5cGVzLiBBZ2dyZWdhdGVzIHdpdGggZXhpc3RpbmcgbWV0YWRhdGEgdG8gYXZvaWQgZHVwbGljYXRlcyBhbmQgZGVsZWdhdGVzIHRvIFR5cGVPUk0gbWV0YWRhdGEgc3RvcmFnZS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbigpOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihvcHRpb25zOiBDb2x1bW5PcHRpb25zKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNpbXBsZUNvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogU3BhdGlhbENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgU3BhdGlhbENvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoTGVuZ3RoQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge0NvbHVtblR5cGV9IHR5cGUgVHlwZSBvZiB0aGUgY29sdW1uLlxuICogQHBhcmFtIHtDb2x1bW5XaXRoV2lkdGhPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aFdpZHRoQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5XaXRoV2lkdGhPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Q29sdW1uVHlwZX0gdHlwZSBUeXBlIG9mIHRoZSBjb2x1bW4uXG4gKiBAcGFyYW0ge0NvbHVtbk51bWVyaWNPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aFByZWNpc2lvbkNvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfSB0eXBlIFR5cGUgb2YgdGhlIGNvbHVtbi5cbiAqIEBwYXJhbSB7Q29sdW1uRW51bU9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIGZvciB0aGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImVudW1cIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge0NvbHVtblR5cGV9IHR5cGUgVHlwZSBvZiB0aGUgY29sdW1uLlxuICogQHBhcmFtIHtDb2x1bW5FbnVtT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwic2ltcGxlLWVudW1cIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge0NvbHVtblR5cGV9IHR5cGUgVHlwZSBvZiB0aGUgY29sdW1uLlxuICogQHBhcmFtIHtDb2x1bW5FbnVtT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwic2V0XCIsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uRW51bU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfSB0eXBlIFR5cGUgb2YgdGhlIGNvbHVtbi5cbiAqIEBwYXJhbSB7Q29sdW1uSHN0b3JlT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oYW55KTogRnVuY3Rpb259IHR5cGUgVHlwZSBvZiB0aGUgZW1iZWRkZWQuXG4gKiBAcGFyYW0ge0NvbHVtbkVtYmVkZGVkT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBlbWJlZGRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfENvbHVtbk9wdGlvbnN8ZnVuY3Rpb24oYW55KTogRnVuY3Rpb259IFt0eXBlT3JPcHRpb25zXSBFaXRoZXIgYW4gZXhwbGljaXQgY29sdW1uIHR5cGUgb3IgdGhlIGNvbHVtbiBvcHRpb25zLlxuICogQHBhcmFtIHtDb2x1bW5PcHRpb25zfSBbb3B0aW9uc10gVGhlIGNvbHVtbiBvcHRpb25zIHdoZW4gYSB0eXBlIGlzIHNwZWNpZmllZC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZU9yT3B0aW9ucz86IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgfCAoKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uKVxuICAgIHwgQ29sdW1uVHlwZVxuICAgIHwgKENvbHVtbk9wdGlvbnMgJiBDb2x1bW5FbWJlZGRlZE9wdGlvbnMpLFxuICBvcHRpb25zPzogQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogb2JqZWN0LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgIHR5cGUgPSA8Q29sdW1uVHlwZT50eXBlT3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAodHlwZU9yT3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IDxDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnM7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucy50eXBlO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBDb2x1bW5PcHRpb25zO1xuXG4gICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgIGxldCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpXG4gICAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgICB0eXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZTtcbiAgICBjb25zdCBmb3JjZVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlRZUEUpLFxuICAgICAgb2JqZWN0LFxuICAgICAgcHJvcGVydHlOYW1lXG4gICAgKTtcbiAgICBpZiAoZm9yY2VUeXBlcykge1xuICAgICAgY29uc3QgeyBjdXN0b21UeXBlcyB9ID0gZm9yY2VUeXBlcztcbiAgICAgIGNvbnN0IHByaW1hcnlUeXBlID0gQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcylcbiAgICAgICAgPyBjdXN0b21UeXBlc1swXVxuICAgICAgICA6IGN1c3RvbVR5cGVzO1xuICAgICAgbGV0IGRiVHlwZTogYW55O1xuICAgICAgc3dpdGNoIChwcmltYXJ5VHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICBkYlR5cGUgPSBTdHJpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICBkYlR5cGUgPSBOdW1iZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICBkYlR5cGUgPSBCaWdJbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgZGJUeXBlID0gRGF0ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkYlR5cGUgPSBwcmltYXJ5VHlwZTtcbiAgICAgIH1cblxuICAgICAgdHlwZSA9IGRiVHlwZTtcbiAgICAgIHJlZmxlY3RNZXRhZGF0YVR5cGUgPSBkYlR5cGU7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIHNwZWNpZnkgSFNUT1JFIHR5cGUgaWYgY29sdW1uIGlzIEhTVE9SRVxuICAgIGlmIChvcHRpb25zLnR5cGUgPT09IFwiaHN0b3JlXCIgJiYgIW9wdGlvbnMuaHN0b3JlVHlwZSlcbiAgICAgIG9wdGlvbnMuaHN0b3JlVHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGUgPT09IE9iamVjdCA/IFwib2JqZWN0XCIgOiBcInN0cmluZ1wiO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGFuIGVtYmVkZGVkXG4gICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW1iZWRkZWRzLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIGlzQXJyYXk6IHJlZmxlY3RNZXRhZGF0YVR5cGUgPT09IEFycmF5IHx8IG9wdGlvbnMuYXJyYXkgPT09IHRydWUsXG4gICAgICAgIHByZWZpeDogb3B0aW9ucy5wcmVmaXggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZml4IDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIHR5cGU6IHR5cGVPck9wdGlvbnMgYXMgKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uLFxuICAgICAgfSBhcyBFbWJlZGRlZE1ldGFkYXRhQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGEgcmVndWxhciBjb2x1bW5cblxuICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICAgIGlmICghb3B0aW9ucy50eXBlKVxuICAgICAgICB0aHJvdyBuZXcgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcblxuICAgICAgLy8gY3JlYXRlIHVuaXF1ZVxuICAgICAgaWYgKG9wdGlvbnMudW5pcXVlID09PSB0cnVlKVxuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkudW5pcXVlcy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBjb2x1bW5zOiBbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBcInJlZ3VsYXJcIixcbiAgICAgICAgbWV0YWRhdGEucmVsYXRpb25zLFxuICAgICAgICBvcHRpb25zLnVuaXF1ZSA/IG1ldGFkYXRhLmluZGljZXMgOiB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgc3RyYXRlZ3k6XG4gICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgICA6IFwiaW5jcmVtZW50XCIsXG4gICAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRvIG1hcmsgYSBwcm9wZXJ0eSBhcyBhbiBhdXRvLW1hbmFnZWQgdXBkYXRlIHRpbWVzdGFtcCBjb2x1bW4uXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBjb2x1bW4gdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgZGF0YWJhc2UvT1JNIHdoZW5ldmVyIHRoZSByb3cgaXMgbW9kaWZpZWQuIFdyYXBzIFR5cGVPUk0gbWV0YWRhdGEgcmVnaXN0cmF0aW9uIHRvIGFnZ3JlZ2F0ZSB3aXRoIGV4aXN0aW5nIGNvbHVtbiBtZXRhZGF0YSB3aGVuIHByZXNlbnQuXG4gKiBAcGFyYW0ge0NvbHVtbk9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBUeXBlT1JNIGNvbHVtbiBvcHRpb25zLlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgb24gYW4gZW50aXR5IGZpZWxkLlxuICogQGZ1bmN0aW9uIFVwZGF0ZURhdGVDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IERlY29yIGFzIFVwZGF0ZURhdGVDb2x1bW5cbiAqICAgcGFydGljaXBhbnQgTWV0YSBhcyBUeXBlT1JNIE1ldGFkYXRhXG4gKiAgIERldi0+PkRlY29yOiBAVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zKVxuICogICBEZWNvci0+PkRldjogcmV0dXJucyBQcm9wZXJ0eURlY29yYXRvclxuICogICBEZXYtPj5EZWNvcjogYXBwbHkgb24gdGFyZ2V0IHByb3BlcnR5XG4gKiAgIERlY29yLT4+TWV0YTogYWdncmVnYXRlT3JOZXdDb2x1bW4oLi4uLCBcInVwZGF0ZURhdGVcIiwgLi4uKVxuICogICBNZXRhLS0+PkRlY29yOiBjb2x1bW4gbWV0YWRhdGEgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJ1cGRhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgcHJvcGVydHkgYXMgYW4gYXV0by1tYW5hZ2VkIGNyZWF0aW9uIHRpbWVzdGFtcCBjb2x1bW4uXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBjb2x1bW4gdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBkYXRhYmFzZS9PUk0gd2hlbiB0aGUgcm93IGlzIGZpcnN0IGNyZWF0ZWQuIFdyYXBzIFR5cGVPUk0gbWV0YWRhdGEgcmVnaXN0cmF0aW9uIHRvIGFnZ3JlZ2F0ZSB3aXRoIGV4aXN0aW5nIGNvbHVtbiBtZXRhZGF0YSB3aGVuIHByZXNlbnQuXG4gKiBAcGFyYW0ge0NvbHVtbk9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBUeXBlT1JNIGNvbHVtbiBvcHRpb25zLlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgb24gYW4gZW50aXR5IGZpZWxkLlxuICogQGZ1bmN0aW9uIENyZWF0ZURhdGVDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IERlY29yIGFzIENyZWF0ZURhdGVDb2x1bW5cbiAqICAgcGFydGljaXBhbnQgTWV0YSBhcyBUeXBlT1JNIE1ldGFkYXRhXG4gKiAgIERldi0+PkRlY29yOiBAQ3JlYXRlRGF0ZUNvbHVtbihvcHRpb25zKVxuICogICBEZWNvci0+PkRldjogcmV0dXJucyBQcm9wZXJ0eURlY29yYXRvclxuICogICBEZXYtPj5EZWNvcjogYXBwbHkgb24gdGFyZ2V0IHByb3BlcnR5XG4gKiAgIERlY29yLT4+TWV0YTogYWdncmVnYXRlT3JOZXdDb2x1bW4oLi4uLCBcImNyZWF0ZURhdGVcIiwgLi4uKVxuICogICBNZXRhLS0+PkRlY29yOiBjb2x1bW4gbWV0YWRhdGEgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJjcmVhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdCh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3Qge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICAgKiBXZSBjYW5ub3QgdXNlIGluc3RhbmNlb2YgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgd2hlbiBydW5uaW5nIG9uIGRpZmZlcmVudCBjb250ZXh0cy5cbiAgICogQW5kIHdlIGRvbid0IHNpbXBseSB1c2UgdHlwZW9mIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09IFwib2JqZWN0XCIuXG4gICAqL1xuICBzdGF0aWMgaXNPYmplY3RXaXRoTmFtZSh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3QgJiB7IG5hbWU6IHN0cmluZyB9IHtcbiAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UxIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMiBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTMgVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFYsIFc+KFxuICAgIHRhcmdldDogVCxcbiAgICBzb3VyY2UxOiBVLFxuICAgIHNvdXJjZTI6IFYsXG4gICAgc291cmNlMzogV1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2VzIE9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgYXNzaWduKHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UpKSB7XG4gICAgICAgICh0YXJnZXQgYXMgYW55KVtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9cbiAgLy8gLyoqXG4gIC8vICAqIENvbnZlcnRzIE1peGVkTGlzdDxUPiB0byBzdHJpY3RseSBhbiBhcnJheSBvZiBpdHMgVCBpdGVtcy5cbiAgLy8gICovXG4gIC8vIHN0YXRpYyBtaXhlZExpc3RUb0FycmF5PFQ+KGxpc3Q6IE1peGVkTGlzdDxUPik6IFRbXSB7XG4gIC8vICAgaWYgKGxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxpc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgLy8gICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoXG4gIC8vICAgICAgIChrZXkpID0+IChsaXN0IGFzIHsgW2tleTogc3RyaW5nXTogVCB9KVtrZXldXG4gIC8vICAgICApO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICByZXR1cm4gbGlzdDtcbiAgLy8gICB9XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7IFJlbGF0aW9uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSwgT2JqZWN0VHlwZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGV4dHJhY3RGb3JSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmcgfCBmdW5jdGlvbihhbnkpOiBPYmplY3RUeXBlPFQ+fSB0eXBlRnVuY3Rpb25PclRhcmdldFxuICogQHBhcmFtIHtzdHJpbmcgfCBmdW5jdGlvbihUKTogYW55fSBpbnZlcnNlU2lkZU9yT3B0aW9uc1xuICogQHBhcmFtIHtSZWxhdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZU9yT3B0aW9ucz86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpIHwgUmVsYXRpb25PcHRpb25zLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIG5vdyB0cnkgdG8gZGV0ZXJtaW5lIGl0IGl0cyBsYXp5IHJlbGF0aW9uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tb25lXCIsXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIEEgb25lLXRvLW1hbnkgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsXG4gKiBidXQgRW50aXR5MiBoYXMgb25seSBvbmUgRW50aXR5MS4gRW50aXR5MiBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2YgRW50aXR5MSBvbiBpdHNcbiAqIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oYW55KTogT2JqZWN0VHlwZTxUPn0gdHlwZUZ1bmN0aW9uT3JUYXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oVCk6IGFueX0gaW52ZXJzZVNpZGVcbiAqIEBwYXJhbSB7UmVsYXRpb25PcHRpb25zfSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBOb3cgdHJ5IHRvIGRldGVybWluZSBpZiBpdCBpcyBhIGxhenkgcmVsYXRpb24uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tbWFueVwiLFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBBIG1hbnktdG8tb25lIHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIEVudGl0eTIsIGJ1dFxuICogRW50aXR5MiBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gRW50aXR5MSBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2ZcbiAqIEVudGl0eTIgb24gaXRzIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oYW55KTogT2JqZWN0VHlwZTxUPn0gdHlwZUZ1bmN0aW9uT3JUYXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oVCk6IGFueX0gaW52ZXJzZVNpZGVPck9wdGlvbnNcbiAqIEBwYXJhbSB7UmVsYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gTm9ybWFsaXplIHBhcmFtZXRlcnMuXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW9uZVwiLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogTWFueS10by1tYW55IGlzIGEgdHlwZSBvZiByZWxhdGlvbnNoaXAgd2hlbiBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLCBhbmQgRW50aXR5MiBjYW4gaGF2ZVxuICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIFRvIGFjaGlldmUgaXQsIHRoaXMgdHlwZSBvZiByZWxhdGlvbiBjcmVhdGVzIGEganVuY3Rpb24gdGFibGUsIHdoZXJlIGl0IHN0b3JhZ2VcbiAqIGVudGl0eTEgYW5kIGVudGl0eTIgaWRzLiBUaGlzIGlzIG93bmVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKGFueSk6IE9iamVjdFR5cGU8VD59IHR5cGVGdW5jdGlvbk9yVGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKFQpOiBhbnl9IGludmVyc2VTaWRlT3JPcHRpb25zXG4gKiBAcGFyYW0ge1JlbGF0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBsZXQgaW52ZXJzZVNpZGVQcm9wZXJ0eTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSk7XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChpbnZlcnNlU2lkZU9yT3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0gPFJlbGF0aW9uT3B0aW9ucz5pbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBpbnZlcnNlU2lkZVByb3BlcnR5ID0gaW52ZXJzZVNpZGVPck9wdGlvbnMgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBub3cgdHJ5IHRvIGRldGVybWluZSBpdCBpdHMgbGF6eSByZWxhdGlvblxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW1hbnlcIixcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIFJlbGF0aW9uTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgcHJvcGVydHkgYXMgYSBwcmltYXJ5IGtleSB3aXRoIGdlbmVyYXRlZCB2YWx1ZS5cbiAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIHByaW1hcnkgY29sdW1uIHRoYXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGRhdGFiYXNlL09STS4gT3ZlcmxvYWRzIGFsbG93IHNlbGVjdGluZyB0aGUgZ2VuZXJhdGlvbiBzdHJhdGVneSBhbmQgb3B0aW9ucy5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBvcHRpb25zOiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInV1aWRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInJvd2lkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaWRlbnRpdHlcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdG8gbWFyayBhIHByb3BlcnR5IGFzIGEgZ2VuZXJhdGVkIHByaW1hcnkga2V5IHdpdGggc3BlY2lmaWMgc3RyYXRlZ3kuXG4gKiBAc3VtbWFyeSBOb3JtYWxpemVzIG92ZXJsb2FkcywgaW5mZXJzIGNvbHVtbiB0eXBlIGZyb20gc3RyYXRlZ3kgd2hlbiBhYnNlbnQsIHNldHMgcHJpbWFyeSBmbGFnLCBhZ2dyZWdhdGVzIGNvbHVtbiBtZXRhZGF0YSwgYW5kIHJlZ2lzdGVycyBnZW5lcmF0aW9uIHN0cmF0ZWd5IGluIFR5cGVPUk0gbWV0YWRhdGEuXG4gKiBAcGFyYW0geygnaW5jcmVtZW50J3wndXVpZCd8J3Jvd2lkJ3wnaWRlbnRpdHknfFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc3xQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnN8UHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyl9IFtzdHJhdGVneU9yT3B0aW9uc10gVGhlIGdlbmVyYXRpb24gc3RyYXRlZ3kgb3IgYW4gb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc3xQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnN8UHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc30gW21heWJlT3B0aW9uc10gT3B0aW9ucyB0byBjb21wbGVtZW50IHRoZSBjaG9zZW4gc3RyYXRlZ3kuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdG8gYmUgYXBwbGllZCBvbiBhbiBlbnRpdHkgZmllbGQuXG4gKiBAZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtblxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBEZXYgYXMgRGV2ZWxvcGVyIENvZGVcbiAqICAgcGFydGljaXBhbnQgRGVjb3IgYXMgUHJpbWFyeUdlbmVyYXRlZENvbHVtblxuICogICBwYXJ0aWNpcGFudCBNZXRhIGFzIFR5cGVPUk0gTWV0YWRhdGFcbiAqICAgRGV2LT4+RGVjb3I6IEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHN0cmF0ZWd5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpXG4gKiAgIERlY29yLT4+RGV2OiByZXR1cm5zIFByb3BlcnR5RGVjb3JhdG9yXG4gKiAgIERldi0+PkRlY29yOiBhcHBseSBvbiB0YXJnZXQgcHJvcGVydHlcbiAqICAgRGVjb3ItPj5EZWNvcjogZGVyaXZlIG9wdGlvbnMsIGluZmVyIHR5cGUgYnkgc3RyYXRlZ3lcbiAqICAgRGVjb3ItPj5NZXRhOiBhZ2dyZWdhdGVPck5ld0NvbHVtbiguLi4pXG4gKiAgIERlY29yLT4+TWV0YTogZ2VuZXJhdGlvbnMucHVzaCh7IHN0cmF0ZWd5IH0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneU9yT3B0aW9ucz86XG4gICAgfCBcImluY3JlbWVudFwiXG4gICAgfCBcInV1aWRcIlxuICAgIHwgXCJyb3dpZFwiXG4gICAgfCBcImlkZW50aXR5XCJcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zLFxuICBtYXliZU9wdGlvbnM/OlxuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgY29uc3Qgb3B0aW9uczogQ29sdW1uT3B0aW9ucyA9IHt9O1xuICBsZXQgc3RyYXRlZ3k6IFwiaW5jcmVtZW50XCIgfCBcInV1aWRcIiB8IFwicm93aWRcIiB8IFwiaWRlbnRpdHlcIjtcbiAgaWYgKHN0cmF0ZWd5T3JPcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJhdGVneU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHN0cmF0ZWd5ID0gc3RyYXRlZ3lPck9wdGlvbnMgYXNcbiAgICAgICAgfCBcImluY3JlbWVudFwiXG4gICAgICAgIHwgXCJ1dWlkXCJcbiAgICAgICAgfCBcInJvd2lkXCJcbiAgICAgICAgfCBcImlkZW50aXR5XCI7XG5cbiAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qoc3RyYXRlZ3lPck9wdGlvbnMpKSB7XG4gICAgICBzdHJhdGVneSA9IFwiaW5jcmVtZW50XCI7XG4gICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHN0cmF0ZWd5T3JPcHRpb25zKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICB9XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChtYXliZU9wdGlvbnMpKSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIG1heWJlT3B0aW9ucyk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICAvLyBpZiBjb2x1bW4gdHlwZSBpcyBub3QgZXhwbGljaXRseSBzZXQgdGhlbiBkZXRlcm1pbmUgaXQgYmFzZWQgb24gZ2VuZXJhdGlvbiBzdHJhdGVneVxuICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIgfHwgc3RyYXRlZ3kgPT09IFwiaWRlbnRpdHlcIikge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBOdW1iZXI7XG4gICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInV1aWRcIikge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcInV1aWRcIjtcbiAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicm93aWRcIikge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcImludFwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4cGxpY2l0bHkgc2V0IGEgcHJpbWFyeSBhbmQgZ2VuZXJhdGVkIHRvIGNvbHVtbiBvcHRpb25zXG4gICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBcInJlZ3VsYXJcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG4gICAgLy8gcmVnaXN0ZXIgZ2VuZXJhdGVkIG1ldGFkYXRhIGFyZ3NcbiAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIENvbHVtbk9wdGlvbnMsXG4gIENvbHVtblR5cGUsXG4gIENvbHVtblR5cGVVbmRlZmluZWRFcnJvcixcbiAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSxcbiAgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvcixcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVkTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9HZW5lcmF0ZWRNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXNjcmliZXMgYWxsIHByaW1hcnkga2V5IGNvbHVtbidzIG9wdGlvbnMuXG4gKiBJZiBzcGVjaWZpZWQsIHRoZSBudWxsYWJsZSBmaWVsZCBtdXN0IGJlIHNldCB0byBmYWxzZS5cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3B0aW9ucyBmb3IgYSBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAc3VtbWFyeSBFeHRlbmRzIFR5cGVPUk0gQ29sdW1uT3B0aW9ucyBlbmZvcmNpbmcgdGhhdCBwcmltYXJ5IGNvbHVtbnMgY2Fubm90IGJlIG51bGxhYmxlLlxuICogQHRlbXBsYXRlIFQgRXh0ZW5kcyBDb2x1bW5PcHRpb25zIHRvIGRlZmluZSBwcmltYXJ5LXNwZWNpZmljIG9wdGlvbnMuXG4gKiBAaW50ZXJmYWNlIFByaW1hcnlDb2x1bW5PcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCB0eXBlIFByaW1hcnlDb2x1bW5PcHRpb25zID0gQ29sdW1uT3B0aW9ucyAmIHsgbnVsbGFibGU/OiBmYWxzZSB9O1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdG8gbWFyayBhIHByb3BlcnR5IGFzIGEgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbm9uLW51bGxhYmxlIGNvbHVtbiBhcyBQUklNQVJZIEtFWSBpbiB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4gU3VwcG9ydHMgb3B0aW9uYWwgdHlwZSBhbmQgZ2VuZXJhdGlvbiBzdHJhdGVnaWVzIHZpYSBDb2x1bW5PcHRpb25zLlxuICogQHBhcmFtIHtQcmltYXJ5Q29sdW1uT3B0aW9uc30gW29wdGlvbnNdIENvbHVtbiBvcHRpb25zIHdoZW4gbm8gZXhwbGljaXQgdHlwZSBpcyBwcm92aWRlZC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgdHlwZT86IENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBQcmltYXJ5IGNvbHVtbnMgYWxzbyBjcmVhdGVzIGEgUFJJTUFSWSBLRVkgZm9yIHRoaXMgY29sdW1uIGluIGEgZGIuXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgcHJvcGVydHkgYXMgYSBwcmltYXJ5IGtleSBjb2x1bW4gd2l0aCBvcHRpb25hbCBleHBsaWNpdCB0eXBlLlxuICogQHN1bW1hcnkgTm9ybWFsaXplcyBwYXJhbWV0ZXJzLCBlbmZvcmNlcyBub24tbnVsbGFiaWxpdHksIHNldHMgcHJpbWFyeSBmbGFnLCBhZ2dyZWdhdGVzIGNvbHVtbiBtZXRhZGF0YSwgYW5kIHJlZ2lzdGVycyBnZW5lcmF0aW9uIHN0cmF0ZWd5IHdoZW4gc3BlY2lmaWVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfFByaW1hcnlDb2x1bW5PcHRpb25zfSBbdHlwZU9yT3B0aW9uc10gRWl0aGVyIGFuIGV4cGxpY2l0IGNvbHVtbiB0eXBlIG9yIHRoZSBjb2x1bW4gb3B0aW9ucy5cbiAqIEBwYXJhbSB7UHJpbWFyeUNvbHVtbk9wdGlvbnN9IFtvcHRpb25zXSBUaGUgY29sdW1uIG9wdGlvbnMgd2hlbiBhIHR5cGUgaXMgc3BlY2lmaWVkLlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgb24gYW4gZW50aXR5IGZpZWxkLlxuICogQGZ1bmN0aW9uIFByaW1hcnlDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IERlY29yIGFzIFByaW1hcnlDb2x1bW5cbiAqICAgcGFydGljaXBhbnQgTWV0YSBhcyBUeXBlT1JNIE1ldGFkYXRhXG4gKiAgIERldi0+PkRlY29yOiBAUHJpbWFyeUNvbHVtbih0eXBlT3JPcHRpb25zLCBvcHRpb25zKVxuICogICBEZWNvci0+PkRldjogcmV0dXJucyBQcm9wZXJ0eURlY29yYXRvclxuICogICBEZXYtPj5EZWNvcjogYXBwbHkgb24gdGFyZ2V0IHByb3BlcnR5XG4gKiAgIERlY29yLT4+RGVjb3I6IG5vcm1hbGl6ZSBwYXJhbXMsIGVuZm9yY2Ugbm9uLW51bGxhYmxlXG4gKiAgIERlY29yLT4+TWV0YTogYWdncmVnYXRlT3JOZXdDb2x1bW4oLi4uKVxuICogICBhbHQgb3B0aW9ucy5nZW5lcmF0ZWRcbiAqICAgICBEZWNvci0+Pk1ldGE6IGdlbmVyYXRpb25zLnB1c2goeyBzdHJhdGVneSB9KVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGVPck9wdGlvbnM/OiBDb2x1bW5UeXBlIHwgUHJpbWFyeUNvbHVtbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVPck9wdGlvbnMgPT09IFN0cmluZyB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gQm9vbGVhbiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gTnVtYmVyXG4gICAgKSB7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucyBhcyBDb2x1bW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgPFByaW1hcnlDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBQcmltYXJ5Q29sdW1uT3B0aW9ucztcblxuICAgIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICBjb25zdCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSB0eXBlIHRoZW4gd2UgbmVlZCB0byBnaXZlIGVycm9yIHRvIHVzZXIgdGhhdCB0eXBlIGlzIHJlcXVpcmVkXG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gY2hlY2sgaWYgY29sdW1uIGlzIG5vdCBudWxsYWJsZSwgYmVjYXVzZSB3ZSBjYW5ub3QgYWxsb3cgYSBwcmltYXJ5IGtleSB0byBiZSBudWxsYWJsZVxuICAgIGlmIChvcHRpb25zLm51bGxhYmxlKVxuICAgICAgdGhyb3cgbmV3IFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IHRvIGNvbHVtbiBvcHRpb25zXG4gICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBcInJlZ3VsYXJcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG5cbiAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gb3B0aW9ucy5nZW5lcmF0ZWRcbiAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlPcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgVGFibGVNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1RhYmxlTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KFxuICBuYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgRW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzogRW50aXR5T3B0aW9uc1xuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBvcHRpb25zID1cbiAgICAoT2JqZWN0VXRpbHMuaXNPYmplY3QobmFtZU9yT3B0aW9ucylcbiAgICAgID8gKG5hbWVPck9wdGlvbnMgYXMgRW50aXR5T3B0aW9ucylcbiAgICAgIDogbWF5YmVPcHRpb25zKSB8fCB7fTtcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiID8gbmFtZU9yT3B0aW9ucyA6IG9wdGlvbnMubmFtZTtcblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGNvbnN0IHRhYmxlcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXM7XG4gICAgdGFibGVzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogXCJyZWd1bGFyXCIsXG4gICAgICBvcmRlckJ5OiBvcHRpb25zLm9yZGVyQnkgPyBvcHRpb25zLm9yZGVyQnkgOiB1bmRlZmluZWQsXG4gICAgICBlbmdpbmU6IG9wdGlvbnMuZW5naW5lID8gb3B0aW9ucy5lbmdpbmUgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhYmFzZTogb3B0aW9ucy5kYXRhYmFzZSA/IG9wdGlvbnMuZGF0YWJhc2UgOiB1bmRlZmluZWQsXG4gICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hID8gb3B0aW9ucy5zY2hlbWEgOiB1bmRlZmluZWQsXG4gICAgICBzeW5jaHJvbml6ZTogb3B0aW9ucy5zeW5jaHJvbml6ZSxcbiAgICAgIHdpdGhvdXRSb3dpZDogb3B0aW9ucy53aXRob3V0Um93aWQsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQgPyBvcHRpb25zLmNvbW1lbnQgOiB1bmRlZmluZWQsXG4gICAgfSBhcyBUYWJsZU1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWxLZXlzLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHBhdGggc3BsaXR0ZXIgdXNlZCB0byBuYXZpZ2F0ZSBuZXN0ZWQgbWV0YWRhdGEgb2JqZWN0cy5cbiAqIEBzdW1tYXJ5IEtleXMgaW4gbmVzdGVkIG1ldGFkYXRhIGFyZSBqb2luZWQgdXNpbmcgdGhpcyBzdHJpbmcgdG8gYWxsb3cgc2FmZSByZWFkL3dyaXRlIGJ5IHBhdGguXG4gKiBAY29uc3QgT2JqZWN0S2V5U3BsaXR0ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IE9iamVjdEtleVNwbGl0dGVyID0gXCIuXCI7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSb290IGtleSB1c2VkIHRvIG1pcnJvciBtb2RlbC1hc3NvY2lhdGVkIG1ldGFkYXRhIG9uIHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFdoZW4gbWlycm9yaW5nIGlzIGVuYWJsZWQsIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgd2l0aCB0aGlzIGtleSBpcyBhdHRhY2hlZCB0byB0aGUgbW9kZWwgY29uc3RydWN0b3IgdG8gZXhwb3NlIGNvbGxlY3RlZCBtZXRhZGF0YS5cbiAqIEBjb25zdCBCYXNlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBCYXNlS2V5ID0gXCJkZWNhZlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTYWZlbHkgcmV0cmlldmVzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGEgcGF0aCBhbmQgc3BsaXR0ZXIuXG4gKiBAc3VtbWFyeSBTcGxpdHMgdGhlIHByb3ZpZGVkIHBhdGggYnkgdGhlIHNwbGl0dGVyIGFuZCB3YWxrcyB0aGUgb2JqZWN0LCByZXR1cm5pbmcgdW5kZWZpbmVkIGlmIGFueSBpbnRlcm1lZGlhdGUga2V5IGlzIG1pc3NpbmcsIG51bGwsIG9yIHVuZGVmaW5lZC4gSW50ZW5kZWQgZm9yIGludGVybmFsIG1ldGFkYXRhIGFjY2Vzcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIHJlc29sdmUgKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBUaGUgY2hhcmFjdGVyKHMpIHVzZWQgdG8gc3BsaXQgdGhlIHBhdGguXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZXNvbHZlZCB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuICogQGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlclxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRm4gYXMgZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE9iaiBhcyBPYmplY3RcbiAqICAgRm4tPj5PYmo6IHNwbGl0KHBhdGgpXG4gKiAgIGxvb3Aga2V5c1xuICogICAgIEZuLT4+T2JqOiBoYXNPd25Qcm9wZXJ0eShrZXkpP1xuICogICAgIGFsdCBtaXNzaW5nL251bGwvdW5kZWZpbmVkXG4gKiAgICAgICBGbi0tPj5PYmo6IHJldHVybiB1bmRlZmluZWRcbiAqICAgICBlbHNlIHByZXNlbnRcbiAqICAgICAgIEZuLT4+T2JqOiBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBGbi0tPj5PYmo6IHJldHVybiBjdXJyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gV3JpdGVzIGEgbmVzdGVkIHZhbHVlIG9uIGFuIG9iamVjdCB1c2luZyBhIHBhdGggYW5kIHNwbGl0dGVyLCBjcmVhdGluZyBtaXNzaW5nIG9iamVjdHMgYWxvbmcgdGhlIHdheS5cbiAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhhdCBhbGwgcGF0aCBzZWdtZW50cyBleGlzdCBhbmQgYXNzaWducyB0aGUgcHJvdmlkZWQgdmFsdWUgYXQgdGhlIHRlcm1pbmFsIGtleS4gSW50ZW5kZWQgZm9yIGludGVybmFsIG1ldGFkYXRhIG11dGF0aW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogVGhlIHRhcmdldCBvYmplY3QgdG8gbXV0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gc2V0IChlLmcuLCBcImEuYi5jXCIpLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBUaGUgY2hhcmFjdGVyKHMpIHVzZWQgdG8gc3BsaXQgdGhlIHBhdGguXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlclxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRm4gYXMgc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE9iaiBhcyBPYmplY3RcbiAqICAgRm4tPj5PYmo6IHNwbGl0KHBhdGgpXG4gKiAgIGxvb3Aga2V5c1xuICogICAgIGFsdCBrZXkgbWlzc2luZ1xuICogICAgICAgRm4tPj5PYmo6IGN1cnJlbnRba2V5XSA9IHt9XG4gKiAgICAgZW5kXG4gKiAgICAgRm4tPj5PYmo6IGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAqICAgZW5kXG4gKiAgIEZuLS0+Pk9iajogY3VycmVudFtsYXN0S2V5XSA9IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcik7XG4gIGxldCBjdXJyZW50OiBSZWNvcmQ8YW55LCBhbnk+ID0gb2JqO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgY3VycmVudFtrZXlzW2tleXMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cnVjdHVyZSBvZiBjb2xsZWN0ZWQgbW9kZWwgbWV0YWRhdGEgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyIGRlY29yYXRvcnMuXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBwcm9wZXJ0eSBkZXNpZ24gdHlwZXMsIHZhbGlkYXRpb24gbWV0YWRhdGEsIHJlbGF0aW9uIG1hcHBpbmdzLCBnZW5lcmF0ZWQgZmllbGRzLCBwcmltYXJ5L2ZvcmVpZ24ga2V5cywgYW5kIGluZGV4IHNwZWNpZmljYXRpb25zLCB3aGljaCBhcmUgbWlycm9yZWQgb250byB0aGUgbW9kZWwgY29uc3RydWN0b3Igd2hlbiBlbmFibGVkLlxuICogQHR5cGVkZWYgTW9kZWxNZXRhZGF0YVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wZXJ0aWVzIE1hcCBvZiBwcm9wZXJ0eSBuYW1lcyB0byB0aGVpciBkZXNpZ24tdGltZSB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55W10+fSBbdmFsaWRhdGlvbl0gT3B0aW9uYWwgdmFsaWRhdGlvbiBydWxlcyBncm91cGVkIGJ5IHZhbGlkYXRpb24ga2V5LlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcmVsYXRpb25zXSBPcHRpb25hbCByZWxhdGlvbiBtZXRhZGF0YSBrZXllZCBieSBwcm9wZXJ0eS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2dlbmVyYXRlZF0gT3B0aW9uYWwgbWFwIG9mIGdlbmVyYXRlZCBjb2x1bW4gc3RyYXRlZ2llcyBwZXIgcHJvcGVydHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGsgUHJpbWFyeSBrZXkgZmllbGQgbmFtZSBmb3IgdGhlIG1vZGVsLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbZmtzXSBPcHRpb25hbCBmb3JlaWduIGtleSBkZWZpbml0aW9ucyBrZXllZCBieSBwcm9wZXJ0eS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2luZGV4ZXNdIE9wdGlvbmFsIGluZGV4IGRlZmluaXRpb25zIGtleWVkIGJ5IGluZGV4IG5hbWUuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsTWV0YWRhdGEgPSB7XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHZhbGlkYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XG4gIHJlbGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGdlbmVyYXRlZD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHBrOiBzdHJpbmc7XG4gIGZrcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGluZGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbCByZWdpc3RyeSBmb3IgbW9kZWwgbWV0YWRhdGEgdXNlZCBieSBkZWNvcmF0b3JzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgc3RhdGljIGhlbHBlcnMgdG8gY29sbGVjdCwgbWlycm9yLCBhbmQgcXVlcnkgbWV0YWRhdGEgZm9yIG1vZGVscyBhbmQgdGhlaXIgcHJvcGVydGllcy4gSXQgc3VwcG9ydHMgbmVzdGVkIGtleSBhY2Nlc3MgdmlhIGEgc3BsaXR0ZXIsIG9wdGlvbmFsIG1pcnJvcmluZyBvZiBtZXRhZGF0YSBvbnRvIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciwgYW5kIHV0aWxpdGllcyB0byBpbmZlciBkZXNpZ24gdHlwZXMgY29tYmluZWQgd2l0aCB2YWxpZGF0aW9uIGhpbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHNwbGl0dGVyIFRoZSBwYXRoIHNwbGl0dGVyIHVzZWQgdG8gbmF2aWdhdGUgbmVzdGVkIG1ldGFkYXRhIChzZWUgT2JqZWN0S2V5U3BsaXR0ZXIpLlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VLZXkgVGhlIG5vbi1lbnVtZXJhYmxlIGtleSB1c2VkIHRvIG1pcnJvciBtZXRhZGF0YSBvbnRvIHRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbWlycm9yIElmIHRydWUsIG1ldGFkYXRhIGlzIG1pcnJvcmVkIG9uIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1bmRlciBiYXNlS2V5LlxuICogQGNsYXNzIE1ldGFkYXRhXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlciB7fVxuICogLy8gcmVnaXN0ZXIgYSBwcm9wZXJ0eSB0eXBlXG4gKiBNZXRhZGF0YS5zZXQoVXNlciBhcyBhbnksIGBwcm9wZXJ0aWVzLmlkYCwgU3RyaW5nKTtcbiAqIC8vIHJlYWQgYmFja1xuICogY29uc3QgcHJvcHMgPSBNZXRhZGF0YS5nZXRQcm9wZXJ0aWVzKFVzZXIgYXMgYW55KTsgLy8gWydpZCddXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBEZWNvciBhcyBEZWNvcmF0b3JzXG4gKiAgIHBhcnRpY2lwYW50IFN0b3JlIGFzIE1ldGFkYXRhIFN0b3JlXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIE1vZGVsIEN0b3JcbiAqICAgRGVjb3ItPj5TdG9yZTogc2V0KE1vZGVsLCBcInByb3BlcnRpZXMuZW1haWxcIiwgU3RyaW5nKVxuICogICBhbHQgbWlycm9yIGVuYWJsZWRcbiAqICAgICBTdG9yZS0+Pk1vZGVsOiBkZWZpbmVQcm9wZXJ0eShCYXNlS2V5LCBtZXRhZGF0YSlcbiAqICAgZW5kXG4gKiAgIERlY29yLT4+U3RvcmU6IGdldFByb3BlcnRpZXMoTW9kZWwpXG4gKiAgIFN0b3JlLS0+PkRlY29yOiBbXCJlbWFpbFwiXVxuICovXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICBwcml2YXRlIHN0YXRpYyBfbWV0YWRhdGE6IFJlY29yZDxzeW1ib2wsIE1vZGVsTWV0YWRhdGE+ID0ge307XG5cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIHN0YXRpYyBiYXNlS2V5ID0gQmFzZUtleTtcbiAgc3RhdGljIG1pcnJvcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyBhbGwgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBuYW1lcyBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIHN0b3JlIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIHJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3BlcnRpZXMgbWFwIG9yIHVuZGVmaW5lZCBpZiBub25lIGV4aXN0LlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfHVuZGVmaW5lZH0gQXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb3IgdW5kZWZpbmVkIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcHJpbWFyeSBrZXkgZmllbGQgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZmlyc3Qga2V5IG9mIHRoZSBwayBtYXAgaW4gbWV0YWRhdGEsIG9yIHVuZGVmaW5lZCBpZiBubyBtZXRhZGF0YSBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH0gVGhlIHByaW1hcnkga2V5IGZpZWxkIG5hbWUgb3IgdW5kZWZpbmVkLlxuICAgKi9cbiAgc3RhdGljIHBrKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucGspWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmaXJzdCByZXNvbHZlZCB0eXBlIGZvciBhIGdpdmVuIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBDb21iaW5lcyBkZXNpZ24tdGltZSBtZXRhZGF0YSB3aXRoIG9wdGlvbmFsIHZhbGlkYXRpb24tcHJvdmlkZWQgdHlwZSBoaW50cyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzb2x2ZWQgdHlwZS5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHJlc29sdmUgdGhlIHR5cGUgZm9yLlxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSBmaXJzdCByZXNvbHZlZCB0eXBlLlxuICAgKi9cbiAgc3RhdGljIHR5cGUobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnR5cGVzKG1vZGVsLCBwcm9wKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgYWxsIGtub3duIHR5cGVzIGZvciBhIGdpdmVuIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRlc2lnbi10aW1lIHR5cGUgZm9sbG93ZWQgYnkgYW55IGFkZGl0aW9uYWwgdHlwZXMgZGVyaXZlZCBmcm9tIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byByZXNvbHZlIHR5cGVzIGZvci5cbiAgICogQHJldHVybiB7YW55W119IE9yZGVyZWQgbGlzdCBvZiByZXNvbHZlZCB0eXBlcyB3aXRoIGZhbHN5IHZhbHVlcyByZW1vdmVkLlxuICAgKi9cbiAgc3RhdGljIHR5cGVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICBsZXQgZGVzaWduVHlwZTogYW55ID0gdGhpcy5nZXQobW9kZWwsIGBwcm9wZXJ0aWVzLiR7cHJvcH1gKTtcbiAgICBpZiAoIWRlc2lnblR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5ICR7cHJvcH0gbm90IGZvdW5kIGluICR7bW9kZWwubmFtZX1gKTtcbiAgICBkZXNpZ25UeXBlID0gW2Rlc2lnblR5cGVdO1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgICAgaWYgKG1ldGEudmFsaWRhdGlvbikge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gbWV0YS52YWxpZGF0aW9uO1xuICAgICAgICBpZiAodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSlcbiAgICAgICAgICBkZXNpZ25UeXBlID0gZGVzaWduVHlwZS5jb25jYXQodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXNpZ25UeXBlLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIG9yIGEgbmVzdGVkIHZhbHVlIGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIG9ubHkgdGhlIG1vZGVsLCByZXR1cm5zIHRoZSBlbnRpcmUgTW9kZWxNZXRhZGF0YSBpZiBpdCBleGlzdHM7IHdoZW4gYSBrZXkgcGF0aCBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgbmVzdGVkIHZhbHVlIHJlc29sdmVkIHZpYSB0aGUgc3BsaXR0ZXIuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gT3B0aW9uYWwgZG90LXNlcGFyYXRlZCBwYXRoIHRvIGEgbmVzdGVkIHZhbHVlIHdpdGhpbiB0aGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge01vZGVsTWV0YWRhdGF8YW55fHVuZGVmaW5lZH0gVGhlIGZ1bGwgbWV0YWRhdGEgb2JqZWN0LCB0aGUgbmVzdGVkIHZhbHVlIGF0IGtleSwgb3IgdW5kZWZpbmVkIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBNb2RlbE1ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZyk6IGFueTtcbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFrZXkpIHJldHVybiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgIHJldHVybiBnZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB0aGlzLnNwbGl0dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNzaWducyBhIHZhbHVlIGludG8gdGhlIG1vZGVsJ3MgbWV0YWRhdGEgYXQgdGhlIHByb3ZpZGVkIGtleSBwYXRoLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbWV0YWRhdGEgY29udGFpbmVyIGlmIG5lZWRlZCwgbWlycm9ycyBpdCBvbnRvIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciB3aGVuIGVuYWJsZWQsIGFuZCBzZXRzIHRoZSBuZXN0ZWQgdmFsdWUgdXNpbmcgdGhlIGN1cnJlbnQgc3BsaXR0ZXIuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERvdC1zZXBhcmF0ZWQgcGF0aCB3aXRoaW4gdGhlIG1ldGFkYXRhIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24gYXQgdGhlIHBhdGguXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdID0ge30gYXMgYW55O1xuICAgIGlmIChcbiAgICAgIHRoaXMubWlycm9yICYmXG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCB0aGlzLmJhc2VLZXkpXG4gICAgKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIHRoaXMuYmFzZUtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB2YWx1ZSwgdGhpcy5zcGxpdHRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBhc3NpZ25zIGEgdmFsdWUgaW50byBtb2RlbCBtZXRhZGF0YSBhdCBhIGdpdmVuIGtleS5cbiAqIEBzdW1tYXJ5IFJldHVybnMgYSBkZWNvcmF0b3IgdXNhYmxlIG9uIGNsYXNzZXMgb3IgcHJvcGVydGllcyB0aGF0IHdyaXRlcyB0aGUgcHJvdmlkZWQgdmFsdWUgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXkgcGF0aCBmb3IgdGhlIG93bmluZyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGRvdC1zZXBhcmF0ZWQgbWV0YWRhdGEgcGF0aCB0byBhc3NpZ24uXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKG9iamVjdCwgYW55LCBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBUaGUgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uIGFzc2lnblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEZuIGFzIGFzc2lnbihrZXksIHZhbHVlKVxuICogICBwYXJ0aWNpcGFudCBEZWNvciBhcyBEZWNvcmF0b3JcbiAqICAgRGV2LT4+Rm46IGNhbGwgd2l0aCBrZXksIHZhbHVlXG4gKiAgIEZuLS0+PkRldjogcmV0dXJucyBEZWNvcmF0b3JcbiAqICAgRGV2LT4+RGVjb3I6IGFwcGx5IG9uIGNsYXNzL3Byb3BlcnR5XG4gKiAgIERlY29yLT4+TWV0YWRhdGE6IE1ldGFkYXRhLnNldChtb2RlbCwga2V5LCB2YWx1ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbihrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gYXNzaWduKFxuICAgIG1vZGVsOiBvYmplY3QsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3A/OiBhbnksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgTWV0YWRhdGEuc2V0KG1vZGVsIGFzIGFueSwga2V5LCB2YWx1ZSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmYWN0b3J5IHRvIHJlZ2lzdGVyIGEgcHJvcGVydHkgZGVzaWduIHR5cGUgaW4gbW9kZWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBVc2VzIFJlZmxlY3QgbWV0YWRhdGEgdG8gZGlzY292ZXIgdGhlIHByb3BlcnR5J3MgZGVzaWduIHR5cGUsIHRoZW4gZGVsZWdhdGVzIHRvIGFzc2lnbiB0byBwZXJzaXN0IGl0IHVuZGVyIHByb3BlcnRpZXMuPHByb3A+LlxuICogQHJldHVybiB7ZnVuY3Rpb24ob2JqZWN0LCBhbnkpOiB2b2lkfSBUaGUgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uIHByb3BlcnR5XG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcm9wZXJ0eShtb2RlbDogb2JqZWN0LCBwcm9wOiBhbnkpIHtcbiAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShNb2RlbEtleXMuVFlQRSwgbW9kZWwsIHByb3ApO1xuICAgIHJldHVybiBhc3NpZ24oYHByb3BlcnR5LiR7cHJvcH1gLCBkZXNpZ25UeXBlKShtb2RlbCwgcHJvcCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDYXNjYWRlLFxuICBDYXNjYWRlTWV0YWRhdGEsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgZmluYWwsXG4gIEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBTZXF1ZW5jZSxcbiAgc2VxdWVuY2VOYW1lRm9yTW9kZWwsXG4gIHR5cGUgU2VxdWVuY2VPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHJlc2VydmVkQXR0cmlidXRlcywgVHlwZU9STUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTIGFzIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIHJlYWRvbmx5LFxuICBVcGRhdGVWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBsaXN0LFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVHlwZU1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STVN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyBUeXBlT1JNU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhlcyB9IGZyb20gXCIuL2luZGV4ZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNVGFibGVTcGVjIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5LCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUmVwb3NpdG9yeSB9IGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBUeXBlT1JNRGlzcGF0Y2ggfSBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmltcG9ydCB7IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcywgc3BsaXRFYWdlclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBEYXRhU291cmNlLFxuICBGaW5kT25lT3B0aW9ucyxcbiAgSW4sXG4gIEluZGV4LFxuICBJbnNlcnRSZXN1bHQsXG4gIEpvaW5Db2x1bW4sXG4gIEpvaW5Db2x1bW5PcHRpb25zLFxuICBKb2luVGFibGUsXG4gIFJlbGF0aW9uT3B0aW9ucyxcbiAgU2VsZWN0UXVlcnlCdWlsZGVyLFxuICBWZXJzaW9uQ29sdW1uLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NvbHVtblwiO1xuaW1wb3J0IHsgVXBkYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBDcmVhdGVEYXRlQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NyZWF0ZURhdGVDb2x1bW5cIjtcbmltcG9ydCB7IE9uZVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvT25lXCI7XG5pbXBvcnQgeyBPbmVUb01hbnkgfSBmcm9tIFwiLi9vdmVycmlkZXMvT25lVG9NYW55XCI7XG5pbXBvcnQgeyBNYW55VG9PbmUgfSBmcm9tIFwiLi9vdmVycmlkZXMvTWFueVRvT25lXCI7XG5pbXBvcnQgeyBNYW55VG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb01hbnlcIjtcbmltcG9ydCB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUdlbmVyYXRlZENvbHVtblwiO1xuaW1wb3J0IHsgUHJpbWFyeUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvRW50aXR5XCI7XG5pbXBvcnQgeyBhc3NpZ24sIE1ldGFkYXRhLCBwcm9wZXJ0eSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvcG9zdGdyZXMvUG9zdGdyZXNDb25uZWN0aW9uT3B0aW9uc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25UeXBlT1JNQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBUeXBlT1JNUmVwb3NpdG9yeTxNPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8VHlwZU9STUZsYWdzPixcbiAgZGF0YTogYW55LFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyID0gY29udGV4dC5nZXQoXCJ1c2VyXCIpO1xuICAgIG1vZGVsW2tleV0gPSB1c2VyIGFzIE1bdHlwZW9mIGtleV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBcIk5vIFVzZXIgZm91bmQgaW4gY29udGV4dC4gUGxlYXNlIHByb3ZpZGUgYSB1c2VyIGluIHRoZSBjb250ZXh0XCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIFR5cGVPUk0tYmFja2VkIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHRoZSBEZWNhZi50cyBBZGFwdGVyIG92ZXIgYSBUeXBlT1JNIERhdGFTb3VyY2UsIHByb3ZpZGluZyBDUlVEIG9wZXJhdGlvbnMsIHF1ZXJ5L3N0YXRlbWVudCBmYWN0b3JpZXMsIHNlcXVlbmNlIG1hbmFnZW1lbnQsIGVycm9yIHBhcnNpbmcsIGFuZCBkZWNvcmF0aW9uIGhlbHBlcnMuXG4gKiBAdGVtcGxhdGUgWSBUaGUgbmF0aXZlIGNvbmZpZ3VyYXRpb24gdHlwZSAoVHlwZU9STSBEYXRhU291cmNlT3B0aW9ucykuXG4gKiBAdGVtcGxhdGUgRiBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgVGhlIGNvbnRleHQgdHlwZS5cbiAqIEBwYXJhbSB7RGF0YVNvdXJjZU9wdGlvbnN9IHNjb3BlIFRoZSBEYXRhU291cmNlIG9wdGlvbnMgZm9yIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgVGhlIGZsYXZvdXIgb2YgdGhlIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIuXG4gKiBAY2xhc3MgVHlwZU9STUFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFR5cGVPUk1BZGFwdGVyKHsgdHlwZTogJ3Bvc3RncmVzJywgLyogLi4uICpcXC8gfSk7XG4gKiBhd2FpdCBhZGFwdGVyLmluaXRpYWxpemUoKTtcbiAqIGNvbnN0IHJlcG8gPSBuZXcgKGFkYXB0ZXIucmVwb3NpdG9yeTxVc2VyPigpKShhZGFwdGVyLCBVc2VyKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6ICdBbGljZScgfSkpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAqXG4gKiAgIEFwcC0+PkFkYXB0ZXI6IG5ldyBUeXBlT1JNQWRhcHRlcihvcHRzKVxuICogICBBZGFwdGVyLT4+RFM6IGluaXRpYWxpemUoKVxuICogICBBcHAtPj5BZGFwdGVyOiByZXBvc2l0b3J5KClcbiAqICAgQWRhcHRlci0tPj5BcHA6IFR5cGVPUk1SZXBvc2l0b3J5XG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHByZXBhcmUvY3JlYXRlL3JldmVydFxuICogICBBZGFwdGVyLS0+PlJlcG86IE1vZGVsXG4gKiAgIFJlcG8tLT4+QXBwOiBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBEYXRhU291cmNlT3B0aW9ucyxcbiAgRGF0YVNvdXJjZSxcbiAgVHlwZU9STVF1ZXJ5LFxuICBUeXBlT1JNRmxhZ3MsXG4gIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuPiB7XG4gIG92ZXJyaWRlIGdldENsaWVudCgpOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBtb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmFsaWFzKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IG1vZGVscy5tYXAoKGMpID0+IGNbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY10pO1xuICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCB7IGVudGl0aWVzOiBlbnRpdGllcyB9KVxuICAgICk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEYXRhU291cmNlT3B0aW9ucywgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihvcHRpb25zLCBUeXBlT1JNRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24oKTtcbiAgICBpZiAodGhpcy5fY2xpZW50KSB7XG4gICAgICBhd2FpdCB0aGlzLl9jbGllbnQuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8VHlwZU9STUZsYWdzPlxuICApOiBQcm9taXNlPFR5cGVPUk1GbGFncz4ge1xuICAgIGNvbnN0IGYgPSBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyk7XG4gICAgY29uc3QgbmV3T2JqOiBhbnkgPSB7XG4gICAgICB1c2VyOiAodGhpcy5jb25maWcgYXMgUG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucykudXNlcm5hbWUsXG4gICAgfTtcbiAgICBjb25zdCBtID0gbmV3IG1vZGVsKCk7XG5cbiAgICBjb25zdCBleGNlcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFKSB7XG4gICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG0pLmlkO1xuICAgICAgZXhjZXB0aW9ucy5wdXNoKHBrIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSB8fFxuICAgICAgb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICkge1xuICAgICAgY29uc3QgZGVjcyA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRlYyA9IGRlY3MuZGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgIChkZWM6IGFueSkgPT5cbiAgICAgICAgICAgIGRlYy5rZXkgPT09IERCS2V5cy5USU1FU1RBTVAgJiZcbiAgICAgICAgICAgIGRlYy5wcm9wcy5vcGVyYXRpb24uaW5kZXhPZihvcGVyYXRpb24pICE9PSAtMVxuICAgICAgICApO1xuICAgICAgICBpZiAoZGVjKSB7XG4gICAgICAgICAgYWNjdW1ba2V5XSA9IGRlYy5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGV4Y2VwdGlvbnMucHVzaCguLi5PYmplY3Qua2V5cyhkZWNzKSk7XG4gICAgfVxuXG4gICAgbmV3T2JqLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA9IChcbiAgICAgIGYuaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzID8gZi5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgOiBbXVxuICAgICkuY29uY2F0KC4uLmV4Y2VwdGlvbnMpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGYsIG5ld09iaikgYXMgVHlwZU9STUZsYWdzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIERpc3BhdGNoKCk6IFR5cGVPUk1EaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPigpOiBDb25zdHJ1Y3RvcjxUeXBlT1JNUmVwb3NpdG9yeTxNPj4ge1xuICAgIHJldHVybiBUeXBlT1JNUmVwb3NpdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBQb3N0Z3JlcyBzdGF0ZW1lbnQgZm9yIHF1ZXJ5aW5nXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBQb3N0Z3Jlc1N0YXRlbWVudCBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1R5cGVPUk1TdGF0ZW1lbnQ8TSwgYW55Pn0gQSBuZXcgUG9zdGdyZXNTdGF0ZW1lbnQgaW5zdGFuY2VcbiAgICovXG4gIEBmaW5hbCgpXG4gIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFR5cGVPUk1TdGF0ZW1lbnQ8TSwgYW55PiB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNU3RhdGVtZW50KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFBvc3RncmVTUUwgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFBvc3RncmVTUUxTZXF1ZW5jZSBpbnN0YW5jZSBmb3IgbWFuYWdpbmcgc2VxdWVuY2VzXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBuZXcgU2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIEBmaW5hbCgpXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1TZXF1ZW5jZShvcHRpb25zLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgYnkgY3JlYXRpbmcgaW5kZXhlcyBmb3IgYWxsIG1hbmFnZWQgbW9kZWxzXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIG5lY2Vzc2FyeSBkYXRhYmFzZSBpbmRleGVzIGZvciBhbGwgbW9kZWxzIG1hbmFnZWQgYnkgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmNsaWVudDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHMuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgbG9nLnZlcmJvc2UoYCR7dGhpcy50b1N0cmluZygpfSBpbml0aWFsaXplZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgZGF0YWJhc2UgaW5kZXhlcyBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbHNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0gey4uLkNvbnN0cnVjdG9yPE0+fSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogVHlwZU9STVF1ZXJ5W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeShcIkJFR0lOXCIpO1xuXG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoaW5kZXgucXVlcnksIGluZGV4LnZhbHVlcyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBTUUwgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBleGVjdXRlIHJhdyBTUUwgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcSAtIFRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihxOiBUeXBlT1JNUXVlcnkpOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yYXcpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuY2xpZW50LmlzSW5pdGlhbGl6ZWQpIGF3YWl0IHRoaXMuY2xpZW50LmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHF1ZXJ5LCB2YWx1ZXMgfSA9IHE7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBleGVjdXRpbmcgcXVlcnk6ICR7KHF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmdldFNxbCgpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KHF1ZXJ5LCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTSxcbiAgICBjaGlsZCA9IGZhbHNlXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHN1cGVyLnByZXBhcmUobW9kZWwsIHBrKTtcblxuICAgIHByZXBhcmVkLnJlY29yZCA9IE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBIHx8IHRoaXMuaXNSZXNlcnZlZChrZXkpKVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKE1vZGVsLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnByZXBhcmUodmFsdWUsIGZpbmRQcmltYXJ5S2V5KHZhbHVlKS5pZCwgdHJ1ZSkucmVjb3JkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy9kbyBub3RoaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KFxuICAgICAgbW9kZWwuY29uc3RydWN0b3IubmFtZVxuICAgICk7XG4gICAgaWYgKCFjb25zdHIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gbm90IGZvdW5kIGluIHJlZ2lzdHJ5YFxuICAgICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBjaGlsZFxuICAgICAgPyBuZXcgKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0oKVxuICAgICAgOiBuZXcgY29uc3RyKCk7XG4gICAgaWYgKGNoaWxkKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkuZm9yRWFjaChcbiAgICAgIChba2V5LCB2YWxdKSA9PiAocmVzdWx0W2tleSBhcyBrZXlvZiB0eXBlb2YgcmVzdWx0XSA9IHZhbClcbiAgICApO1xuICAgIHByZXBhcmVkLnJlY29yZCA9IHJlc3VsdDtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBNIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZXZlcnQpO1xuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBvYmopXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke3R5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IGNsYXp6IDogY2xhenoubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBhIG5ldyByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLmNsaWVudC5nZXRSZXBvc2l0b3J5KG0pO1xuICAgIGlmICh0eXBlb2YgaWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVwby5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICBbcGtdOiBpZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAgIGBSZWNvcmQgYWxyZWFkeSBleGlzdHMgaW4gdGFibGUgJHtSZXBvc2l0b3J5LnRhYmxlKG0pfSB3aXRoIGlkOiAke2lkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXBvLnNhdmUobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gcmVhZCBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBwcmltYXJ5IGtleSBjb2x1bVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVhZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwazogc3RyaW5nXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmNsaWVudC5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgeyBub25FYWdlciwgcmVsYXRpb25zIH0gPSBzcGxpdEVhZ2VyUmVsYXRpb25zKG0pO1xuXG4gICAgICBjb25zdCBxOiBGaW5kT25lT3B0aW9ucyA9IHtcbiAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICBbcGtdOiBpZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpb25zOiByZWxhdGlvbnMsXG4gICAgICAgIGxvYWRSZWxhdGlvbklkczoge1xuICAgICAgICAgIHJlbGF0aW9uczogbm9uRWFnZXIsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmVzdWx0ID0gKGF3YWl0IHJlcG8uZmluZE9uZU9yRmFpbChxKSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gdXBkYXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLnJlYWQodGFibGVOYW1lLCBpZCwgcGspO1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVsZXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQodGFibGVOYW1lLCBpZCwgcGspO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlcG8uZGVsZXRlKGlkKTtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogSW5zZXJ0UmVzdWx0ID0gYXdhaXQgcmVwby5pbnNlcnQobW9kZWwpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICByZXN1bHQuaWRlbnRpZmllcnMubWFwKChpZCkgPT4gaWQuaWQpLFxuICAgICAgICBcImlkXCJcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoIWlkLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIHJldHVybiByZXBvLmZpbmRCeSh7IFtwa106IEluKGlkKSB9KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbW9kZWwpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGF3YWl0IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgbVtwa10sIG0sIHBrLCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm4gW107XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbCh0YWJsZU5hbWUsIGlkcywgcGspO1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWRzKTtcbiAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGFuZCBjb252ZXJ0cyBpdCB0byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB2YXJpb3VzIGVycm9yIHR5cGVzIHRvIGFwcHJvcHJpYXRlIEJhc2VFcnJvciBzdWJ0eXBlc1xuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvciBhcyBhIEJhc2VFcnJvclxuICAgKi9cbiAgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIHJldHVybiBUeXBlT1JNQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkIGluIFBvc3RncmVTUUxcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWF0dHIubWF0Y2gocmVzZXJ2ZWRBdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1ldGhvZCB0byBwYXJzZSBhbiBlcnJvciBhbmQgY29udmVydCBpdCB0byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB2YXJpb3VzIGVycm9yIHR5cGVzIHRvIGFwcHJvcHJpYXRlIEJhc2VFcnJvciBzdWJ0eXBlcyBiYXNlZCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlc1xuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvciBhcyBhIEJhc2VFcnJvclxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBwYXJzZUVycm9yXG4gICAqICAgcGFydGljaXBhbnQgRXJyb3JUeXBlc1xuICAgKlxuICAgKiAgIENhbGxlci0+PnBhcnNlRXJyb3I6IGVyciwgcmVhc29uXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IENoZWNrIGlmIGVyciBpcyBhbHJlYWR5IGEgQmFzZUVycm9yXG4gICAqICAgYWx0IGVyciBpcyBCYXNlRXJyb3JcbiAgICogICAgIHBhcnNlRXJyb3ItLT4+Q2FsbGVyOiByZXR1cm4gZXJyXG4gICAqICAgZWxzZSBlcnIgaXMgc3RyaW5nXG4gICAqICAgICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogRXh0cmFjdCBjb2RlIGZyb20gc3RyaW5nXG4gICAqICAgICBhbHQgY29kZSBtYXRjaGVzIFwiZHVwbGljYXRlIGtleXxhbHJlYWR5IGV4aXN0c1wiXG4gICAqICAgICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKVxuICAgKiAgICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJkb2VzIG5vdCBleGlzdHxub3QgZm91bmRcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgZXJyIGhhcyBjb2RlIHByb3BlcnR5XG4gICAqICAgICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogRXh0cmFjdCBjb2RlIGFuZCByZWFzb25cbiAgICogICBlbHNlXG4gICAqICAgICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogVXNlIGVyci5tZXNzYWdlIGFzIGNvZGVcbiAgICogICBlbmRcbiAgICpcbiAgICogICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogU3dpdGNoIG9uIFBvc3RncmVTUUwgZXJyb3IgY29kZVxuICAgKiAgIGFsdCBjb2RlIGlzIDIzNTA1ICh1bmlxdWVfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDIzNTAzIChmb3JlaWduX2tleV92aW9sYXRpb24pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDEgKHVuZGVmaW5lZF90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MjcwMyAodW5kZWZpbmVkX2NvbHVtbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAwNyAoZHVwbGljYXRlX3RhYmxlKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDE2IChpbnZhbGlkX3RhYmxlX2RlZmluaXRpb24pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IEluZGV4RXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IEluZGV4RXJyb3JcbiAgICogICBlbHNlIGNvZGUgbWF0Y2hlcyBcIkVDT05OUkVGVVNFRFwiXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29ubmVjdGlvbkVycm9yXG4gICAqICAgZWxzZVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbnRlcm5hbEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyIGFzIGFueTtcbiAgICBjb25zdCBjb2RlOiBzdHJpbmcgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG5cbiAgICBpZiAoY29kZS5tYXRjaCgvZHVwbGljYXRlIGtleXxhbHJlYWR5IGV4aXN0cy9nKSlcbiAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICBpZiAoY29kZS5tYXRjaCgvZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kfENvdWxkIG5vdCBmaW5kL2cpKVxuICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpO1xuXG4gICAgLy8gUG9zdGdyZVNRTCBlcnJvciBjb2RlczogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2VycmNvZGVzLWFwcGVuZGl4Lmh0bWxcbiAgICBzd2l0Y2ggKGNvZGUudG9TdHJpbmcoKSkge1xuICAgICAgLy8gSW50ZWdyaXR5IGNvbnN0cmFpbnQgdmlvbGF0aW9uc1xuICAgICAgY2FzZSBcIjIzNTA1XCI6IC8vIHVuaXF1ZV92aW9sYXRpb25cbiAgICAgIGNhc2UgXCIyMzUwM1wiOiAvLyBmb3JlaWduX2tleV92aW9sYXRpb25cbiAgICAgIGNhc2UgXCI0MlAwN1wiOiAvLyBkdXBsaWNhdGVfdGFibGVcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAvLyBPYmplY3Qgbm90IGZvdW5kIGVycm9yc1xuICAgICAgY2FzZSBcIjQyUDAxXCI6IC8vIHVuZGVmaW5lZF90YWJsZVxuICAgICAgY2FzZSBcIjQyNzAzXCI6IC8vIHVuZGVmaW5lZF9jb2x1bW5cbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAvLyBJbnZhbGlkIG9iamVjdCBkZWZpbml0aW9uXG4gICAgICBjYXNlIFwiNDJQMTZcIjogLy8gaW52YWxpZF90YWJsZV9kZWZpbml0aW9uXG4gICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuXG4gICAgICAvLyBDb25uZWN0aW9uIGVycm9yc1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjb25uZWN0KGNvbmZpZzogRGF0YVNvdXJjZU9wdGlvbnMpOiBQcm9taXNlPERhdGFTb3VyY2U+IHtcbiAgICBjb25zdCBjb24gPSBuZXcgRGF0YVNvdXJjZShjb25maWcpO1xuICAgIGlmICghY29uLmlzSW5pdGlhbGl6ZWQpIGF3YWl0IGNvbi5pbml0aWFsaXplKCk7XG4gICAgcmV0dXJuIGNvbjtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuY3JlYXRlRGF0YWJhc2UpO1xuICAgIGxvZy52ZXJib3NlKGBDcmVhdGluZyBkYXRhYmFzZSAke2RiTmFtZX1gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgQ1JFQVRFIERBVEFCQVNFICR7ZGJOYW1lfWApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVOb3RpZnlGdW5jdGlvbihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIHVzZXI6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZU5vdGlmeUZ1bmN0aW9uKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpXG5SRVRVUk5TIHRyaWdnZXIgQVMgJCRcbkJFR0lOXG4gICAgUEVSRk9STSBwZ19ub3RpZnkoXG4gICAgICAgICd0YWJsZV9jaGFuZ2VzJyxcbiAgICAgICAganNvbl9idWlsZF9vYmplY3QoXG4gICAgICAgICAgICAndGFibGUnLCBUR19UQUJMRV9OQU1FLFxuICAgICAgICAgICAgJ2FjdGlvbicsIFRHX09QLFxuICAgICAgICAgICAgJ2RhdGEnLCByb3dfdG9fanNvbihORVcpLFxuICAgICAgICAgICAgJ29sZF9kYXRhJywgcm93X3RvX2pzb24oT0xEKVxuICAgICAgICApOjp0ZXh0XG4gICAgKTtcbiAgICBSRVRVUk4gTkVXO1xuRU5EO1xuJCQgTEFOR1VBR0UgcGxwZ3NxbCBTRUNVUklUWSBERUZJTkVSXG47YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpIE9XTkVSIFRPICR7dXNlcn07YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYFxuICAgICAgICAgICAgR1JBTlQgRVhFQ1VURSBPTiBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpIFRPIHB1YmxpYztcbiAgICAgICAgYCk7XG4gICAgICBsb2cuaW5mbyhgQ3JlYXRlZCBub3RpZnkgZnVuY3Rpb25gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZURhdGFiYXNlKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcj86IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHVzZXIpIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgT1dORUQgQlkgJHt1c2VyfSBDQVNDQURFO2ApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgRFJPUCBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVVzZXIoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZyxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgQ1JFQVRFIFVTRVIgJHt1c2VyfSBXSVRIIFBBU1NXT1JEICcke3Bhc3N3b3JkfSdgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIENPTk5FQ1QgT04gREFUQUJBU0UgJHtkYk5hbWV9IFRPICR7dXNlcn1gKTtcblxuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgVVNBR0UgT04gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDUkVBVEUgT04gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFRBQkxFUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBTRVFVRU5DRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgRlVOQ1RJT05TIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSBwdWJsaWMgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gVEFCTEVTIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFNFUVVFTkNFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZVVzZXIoXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIHVzZXI6IHN0cmluZyxcbiAgICBhZG1pbjogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFJFQVNTSUdOIE9XTkVEIEJZICR7dXNlcn0gVE8gJHthZG1pbn1gKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYFJFVk9LRSBBTEwgT04gQUxMIFRBQkxFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFJFVk9LRSBBTEwgT04gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYFJFVk9LRSBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYFJFVk9LRSBBTEwgUFJJVklMRUdFUyBPTiBBTEwgRlVOQ1RJT05TIElOIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBGT1IgUk9MRSAke2FkbWlufSBJTiBTQ0hFTUEgcHVibGljIFJFVk9LRSBBTEwgT04gVEFCTEVTIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFNFUVVFTkNFUyBGUk9NICR7dXNlcn07YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBGT1IgUk9MRSAke2FkbWlufSBJTiBTQ0hFTUEgcHVibGljIFJFVk9LRSBBTEwgT04gRlVOQ1RJT05TIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYERST1AgT1dORUQgQlkgJHt1c2VyfSBDQVNDQURFYCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYERST1AgVVNFUiBJRiBFWElTVFMgXCIke3VzZXJ9XCJgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBpc0ZrID0gZmFsc2VcbiAgKSB7XG4gICAgc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlRFWFQgUFJJTUFSWSBLRVlcIiA6IGlzRmsgPyBcIlRFWFRcIiA6IFwiVkFSQ0hBUlwiO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gaXNQayA/IFwiU0VSSUFMIFBSSU1BUlkgS0VZXCIgOiBcIklOVEVHRVJcIjtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBcIkJPT0xFQU5cIjtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBcIlRJTUVTVEFNUFwiO1xuICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICByZXR1cm4gaXNQayA/IFwiQklHSU5UIFBSSU1BUlkgS0VZXCIgOiBcIkJJR0lOVFwiO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtID0gTW9kZWwuZ2V0KHR5cGUpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgIGNvbnN0IG1tID0gbmV3IG0oKTtcbiAgICAgICAgICBjb25zdCB0eXBlID0gUmVmbGVjdGlvbi5nZXRUeXBlRnJvbURlY29yYXRvcihcbiAgICAgICAgICAgIG1tLFxuICAgICAgICAgICAgZmluZFByaW1hcnlLZXkobW0pLmlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW9kZWw6IG0sXG4gICAgICAgICAgICBwa1R5cGU6IHR5cGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgcHJvcDogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBpc1BrOiBib29sZWFuLFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFZhbGlkYXRvck9wdGlvbnNcbiAgKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUkVRVUlSRUQ6XG4gICAgICAgIHJldHVybiBcIk5PVCBOVUxMXCI7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEg6XG4gICAgICAgIGlmIChpc1BrIHx8ICFvcHRpb25zIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgKCR7KG9wdGlvbnMgYXMgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEg6XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9X21pbl9sZW5ndGhfY2hlY2sgQ0hFQ0sgKExFTkdUSCgke3Byb3B9KSA+PSAkeyhvcHRpb25zIGFzIE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5QQVRURVJOOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5VUkw6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkVNQUlMOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9wYXR0ZXJuX2NoZWNrIENIRUNLICgke3Byb3B9IH4gJyR7Y29udmVydEpzUmVnZXhUb1Bvc3RncmVzKChvcHRpb25zIGFzIFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXSBhcyBzdHJpbmcpfScpYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVFlQRTpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuREFURTpcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1JTjpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9ID49ICR7KG9wdGlvbnMgYXMgTWluVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUlOXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuTUFYOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV8ke2tleX1fY2hlY2sgQ0hFQ0sgKCR7cHJvcH0gPD0gJHsob3B0aW9ucyBhcyBNYXhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NQVhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5QQVNTV09SRDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke2tleX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVJlbGF0aW9uc1RvUG9zdGdyZXMoXG4gICAgcHJvcDogc3RyaW5nLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNb2RlbD4sXG4gICAgcGs6IHN0cmluZyxcbiAgICBrZXk6IFBlcnNpc3RlbmNlS2V5cyxcbiAgICBvcHRpb25zOiBSZWxhdGlvbnNNZXRhZGF0YVxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNsYXp6KTtcbiAgICBjb25zdCB7IGNhc2NhZGUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY2FzY2FkZVN0ciA9IGAke2Nhc2NhZGUudXBkYXRlID8gXCIgT04gVVBEQVRFIENBU0NBREVcIiA6IFwiXCJ9JHtjYXNjYWRlLmRlbGV0ZSA/IFwiIE9OIERFTEVURSBDQVNDQURFXCIgOiBcIlwifWA7XG4gICAgc3dpdGNoIChgcmVsYXRpb25zJHtrZXl9YCkge1xuICAgICAgY2FzZSBQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORTpcbiAgICAgICAgcmV0dXJuIGBGT1JFSUdOIEtFWSAoJHtwcm9wfSkgUkVGRVJFTkNFUyAke3RhYmxlTmFtZX0oJHtwa30pJHtjYXNjYWRlU3RyfWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAke2tleX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlVGFibGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGllbnQ6IERhdGFTb3VyY2UsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgVHlwZU9STVRhYmxlU3BlYz4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+ID0ge307XG4gICAgY29uc3QgbSA9IG5ldyBtb2RlbCh7fSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShtb2RlbCk7XG4gICAgY29uc3QgeyBpZCB9ID0gZmluZFByaW1hcnlLZXkobSk7XG5cbiAgICBsZXQgaXNQazogYm9vbGVhbiwgY29sdW1uOiBzdHJpbmc7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pIGFzIChrZXlvZiBNKVtdO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiAodGhpcyBhcyBhbnkpW3Byb3BdID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgcHJvcC50b1N0cmluZygpLnN0YXJ0c1dpdGgoXCJfXCIpIHx8XG4gICAgICAgIHByb3AgPT09IFwiY29uc3RydWN0b3JcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpc1BrID0gcHJvcCA9PT0gaWQ7XG4gICAgICBjb2x1bW4gPSBSZXBvc2l0b3J5LmNvbHVtbihtLCBwcm9wLnRvU3RyaW5nKCkpO1xuXG4gICAgICBjb25zdCBhbGxEZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvckRhdGEgPSBhbGxEZWNzLmRlY29yYXRvcnMucmVkdWNlKFxuICAgICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBlbDtcbiAgICAgICAgICBpZiAoa2V5ID09PSBNb2RlbEtleXMuVFlQRSAmJiAhYWNjdW1bVmFsaWRhdGlvbktleXMuVFlQRV0pIHtcbiAgICAgICAgICAgIGFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0ge1xuICAgICAgICAgICAgICBjdXN0b21UeXBlczogW3Byb3BzLm5hbWUgYXMgc3RyaW5nXSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJkZWZpbmVzIHRoZSBhY2NlcHRlZCB0eXBlcyBmb3IgdGhlIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gVmFsaWRhdGlvbktleXMuVFlQRSkge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZy4gd2UgY2FuIG9ubHkgc3VwcG9ydCBiYXNpcyBjdHlwZXMgYXQgdGhpcyB0aW1lXG4gICAgICAgICAgICBhY2N1bVtrZXldID0gcHJvcHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRiRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBSZXBvc2l0b3J5LmtleShcInJlbGF0aW9uc1wiKSxcbiAgICAgICAgbSxcbiAgICAgICAgcHJvcC50b1N0cmluZygpLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBxdWVyeTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZm9yZWlnbktleXM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgdHlwZURhdGE6IFR5cGVNZXRhZGF0YSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIGxldCBjaGlsZENsYXNzOiBDb25zdHJ1Y3RvcjxNb2RlbD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRQazogYW55O1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZGVjb3JhdG9yRGF0YSkubGVuZ3RoKSB7XG4gICAgICAgIHR5cGVEYXRhID0gZGVjb3JhdG9yRGF0YVtWYWxpZGF0aW9uS2V5cy5UWVBFXSBhcyBUeXBlTWV0YWRhdGE7XG5cbiAgICAgICAgaWYgKCF0eXBlRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyc2VkVHlwZTpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgdGhpcy5wYXJzZVR5cGVUb1Bvc3RncmVzKFxuICAgICAgICAgICAgdHlwZW9mICh0eXBlRGF0YS5jdXN0b21UeXBlcyBhcyBhbnlbXSlbMF0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICA/ICh0eXBlRGF0YS5jdXN0b21UeXBlcyBhcyBhbnkpWzBdKClcbiAgICAgICAgICAgICAgOiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSxcbiAgICAgICAgICAgIGlzUGtcbiAgICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHBhcnNlZFR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBwYXJzZWRUeXBlID0geyBtb2RlbDogcGFyc2VkVHlwZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlU3RyOlxuICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgfCB7IG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbD4gfCBzdHJpbmc7IHBrVHlwZT86IHN0cmluZyB9ID1cbiAgICAgICAgICBwYXJzZWRUeXBlLm1vZGVsIGFzXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCB7IG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbD4gfCBzdHJpbmc7IHBrVHlwZT86IHN0cmluZyB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHlwZVN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGVTdHIpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0eXBlU3RyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBjb250aW51ZTtcbiAgICAgICAgICAvLyBjb25zdCByZXM6IFJlY29yZDxzdHJpbmcsIFBvc3RncmVzVGFibGVTcGVjPiA9IGF3YWl0IHRoaXMuY3JlYXRlVGFibGUocG9vbCwgdHlwZVN0cik7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgPSBwYXJzZWRUeXBlLm1vZGVsIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgY2hpbGRDbGFzcygpO1xuICAgICAgICAgICAgY2hpbGRQayA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuICAgICAgICAgICAgdHlwZVN0ciA9IHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgICAgcGFyc2VkVHlwZS5wa1R5cGUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoY2xpZW50LCBjaGlsZENsYXNzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQ29uZmxpY3RFcnJvcikpIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRwID0gQXJyYXkuaXNBcnJheSh0eXBlRGF0YS5jdXN0b21UeXBlcylcbiAgICAgICAgICA/IHR5cGVEYXRhLmN1c3RvbVR5cGVzWzBdXG4gICAgICAgICAgOiB0eXBlRGF0YS5jdXN0b21UeXBlcztcbiAgICAgICAgdHAgPSB0eXBlb2YgdHAgPT09IFwiZnVuY3Rpb25cIiAmJiAhdHAubmFtZSA/IHRwKCkgOiB0cDtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblN0ciA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgdHAgYXMgYW55LFxuICAgICAgICAgIGlzUGssXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCxcbiAgICAgICAgICAoZGVjb3JhdG9yRGF0YVtcbiAgICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhcbiAgICAgICAgICBdIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpIHx8IHtcbiAgICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXTogMjU1LFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBxID0gYCR7Y29sdW1ufSAke3R5cGVTdHJ9JHt2YWxpZGF0aW9uU3RyfWA7XG5cbiAgICAgICAgaWYgKGlzUGspIHtcbiAgICAgICAgICBxdWVyeS51bnNoaWZ0KHEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXJ5LnB1c2gocSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHByb3BzXSBvZiBPYmplY3QuZW50cmllcyhkZWNvcmF0b3JEYXRhKS5maWx0ZXIoXG4gICAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICAgICFbVmFsaWRhdGlvbktleXMuVFlQRSwgVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF0uaW5jbHVkZXMoayBhcyBhbnkpXG4gICAgICAgICkpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy5wYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgdHAgYXMgYW55LFxuICAgICAgICAgICAgaXNQayxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiQ09OU1RSQUlOVFwiKSkge1xuICAgICAgICAgICAgY29uc3RyYWludHMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgcXVlcnkucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyBpZ25vcmUgZm9yIG5vdy4gdGhpcyBsZWF2ZXMgZm9yZWlnbiBrZXlzIG91dFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWJpbmFyeS1leHByZXNzaW9uXG4gICAgICBpZiAoZmFsc2UgfHwgKGRiRGVjcyAmJiBkYkRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpKSB7XG4gICAgICAgIGlmICghdHlwZURhdGEpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uYCk7XG4gICAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRiRGVjcy5kZWNvcmF0b3JzKSB7XG4gICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBkZWNvcmF0b3I7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgY2hpbGRDbGFzcyBhcyBDb25zdHJ1Y3RvcjxNb2RlbD4sXG4gICAgICAgICAgICBjaGlsZFBrLmlkLFxuICAgICAgICAgICAga2V5IGFzIFBlcnNpc3RlbmNlS2V5cyxcbiAgICAgICAgICAgIHByb3BzIGFzIHVua25vd24gYXMgUmVsYXRpb25zTWV0YWRhdGFcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uLnN0YXJ0c1dpdGgoXCJGT1JFSUdOXCIpKSB7XG4gICAgICAgICAgICBmb3JlaWduS2V5cy5wdXNoKHZhbGlkYXRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgcmVsYXRpb246ICR7a2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXN1bHRbcHJvcC50b1N0cmluZygpXSA9IHtcbiAgICAgICAgcXVlcnk6IHF1ZXJ5LmpvaW4oXCIgXCIpLFxuICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICBwcmltYXJ5S2V5OiBpc1BrLFxuICAgICAgICBjb25zdHJhaW50czogY29uc3RyYWludHMsXG4gICAgICAgIGZvcmVpZ25LZXlzOiBmb3JlaWduS2V5cyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdmFsdWVzLm1hcCgocikgPT4gci5xdWVyeSkuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoKGMpID0+ICEhYy5jb25zdHJhaW50cy5sZW5ndGgpXG4gICAgICAubWFwKChyKSA9PiByLmNvbnN0cmFpbnRzKVxuICAgICAgLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGZvcmVpZ25LZXlzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuZm9yZWlnbktleXMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5mb3JlaWduS2V5cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCB2YWxzID0gW3F1ZXJ5LCBjb25zdHJhaW50c107XG4gICAgaWYgKGZvcmVpZ25LZXlzKSB7XG4gICAgICB2YWxzLnB1c2goZm9yZWlnbktleXMpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBDUkVBVEUgVEFCTEUgJHt0YWJsZU5hbWV9ICgke3ZhbHMuZmlsdGVyKCh2KSA9PiAhIXYpLmpvaW4oXCIsXFxuXCIpfSlgO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIFRSSUdHRVIgbm90aWZ5X2NoYW5nZXNfJHt0YWJsZU5hbWV9XG5BRlRFUiBJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSBPTiAke3RhYmxlTmFtZX1cbiAgICBGT1IgRUFDSCBST1dcbiAgICBFWEVDVVRFIEZVTkNUSU9OIG5vdGlmeV90YWJsZV9jaGFuZ2VzKCk7YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0Q3VycmVudFVzZXIoY2xpZW50OiBEYXRhU291cmNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBTRUxFQ1QgQ1VSUkVOVF9VU0VSO2A7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeVN0cmluZyk7XG4gICAgICByZXR1cm4gcmVzdWx0WzBdLmN1cnJlbnRfdXNlcjtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKSB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuXG4gICAgLy8gQHRhYmxlKCkgPT4gQEVudGl0eSgpXG4gICAgY29uc3QgdGFibGVLZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHRhYmxlS2V5KVxuICAgICAgLmV4dGVuZCgob3JpZ2luYWw6IGFueSkgPT5cbiAgICAgICAgRW50aXR5KCkob3JpZ2luYWxbTW9kZWxLZXlzLkFOQ0hPUl0gfHwgb3JpZ2luYWwpXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBwaygpID0+IEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCkgfCBAUHJpbWFyeUNvbHVtbigpXG4gICAgY29uc3QgcGtLZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpO1xuXG4gICAgZnVuY3Rpb24gcGtEZWMob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gcGtEZWMob3JpZ2luYWw6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvcnM6IGFueVtdID0gW1xuICAgICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgICBwcm9wTWV0YWRhdGEocGtLZXksIG9wdGlvbnMpLFxuICAgICAgICAgIGFzc2lnbihgcGsuJHtwcm9wfWAsIG9wdGlvbnMpLFxuICAgICAgICBdO1xuICAgICAgICBsZXQgdHlwZSA9XG4gICAgICAgICAgb3B0aW9ucy50eXBlIHx8IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3Iob3JpZ2luYWwsIHByb3ApO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uIGZvciBwcm9wZXJ0eSAke3Byb3B9IG9mICR7b3JpZ2luYWwubmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubmFtZSB8fCBzZXF1ZW5jZU5hbWVGb3JNb2RlbChvcmlnaW5hbCwgXCJwa1wiKTtcbiAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgICAgICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHtcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJudW1lcmljXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJ2YXJjaGFyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJiaWdpbnRcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHt0eXBlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgICAgICBQcmltYXJ5Q29sdW1uKHtcbiAgICAgICAgICAgICAgdHlwZTogdHlwZSBhcyBDb2x1bW5UeXBlLFxuICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocGtLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBwa0RlYyxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKE1vZGVsS2V5cy5BVFRSSUJVVEUpXG4gICAgICAuZXh0ZW5kKHByb3BlcnR5KCkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBjb2x1bW4oXCJjb2x1bW5OYW1lXCIpID0+IEBDb2x1bW4oe25hbWU6IFwiY29sdW1uTmFtZVwifSlcbiAgICBjb25zdCBjb2x1bW5LZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjb2x1bW5LZXkpXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW0obmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbHVtbihvYmo6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzOiBDb2x1bW5PcHRpb25zID0ge307XG4gICAgICAgICAgICBpZiAobmFtZSkgb3B0cy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHBrID0gTWV0YWRhdGEuZ2V0KG9iaiwgXCJwa1wiKTtcbiAgICAgICAgICAgIGlmIChwayAhPT0gcHJvcCkge1xuICAgICAgICAgICAgICBvcHRzLm51bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDb2x1bW4ob3B0cykob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IChhcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBhcmdzWzFdO1xuICAgICAgICAgIHJldHVybiBbY29sdW1uTmFtZV07XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAdW5pcXVlID0+IEBDb2x1bW4oe3VuaXF1ZTogdHJ1ZX0pXG4gICAgY29uc3QgdW5pcXVlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodW5pcXVlS2V5KVxuICAgICAgLmRlZmluZShwcm9wTWV0YWRhdGEodW5pcXVlS2V5LCB7fSkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IHVuaXF1ZTogdHJ1ZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHJlcXVpcmVkID0+IEBDb2x1bW4oeyBudWxsYWJsZTogZmFsc2UgfSlcbiAgICBjb25zdCByZXF1aXJlZEtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihyZXF1aXJlZEtleSlcbiAgICAgIC5leHRlbmQoQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAdmVyc2lvbiA9PiBAVmVyc2lvbkNvbHVtbigpXG4gICAgY29uc3QgdmVyc2lvbktleSA9IFJlcG9zaXRvcnkua2V5KERCS2V5cy5WRVJTSU9OKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih2ZXJzaW9uS2V5KVxuICAgICAgLmRlZmluZSh0eXBlKE51bWJlci5uYW1lKSwgVmVyc2lvbkNvbHVtbigpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBmdW5jdGlvbiBWYWxpZGF0aW9uVXBkYXRlS2V5KGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gVXBkYXRlVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbiAgICB9XG5cbiAgICAvLyBAdGltZXN0YW1wKG9wKSA9PiBAQ3JlYXRlRGF0ZUNvbHVtbigpIHx8IEBVcGRhdGVEYXRlQ29sdW1uKClcbiAgICBjb25zdCB0aW1lc3RhbXBLZXkgPSBWYWxpZGF0aW9uVXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApO1xuXG4gICAgZnVuY3Rpb24gdHMob3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzW10sIGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgZGF0ZShmb3JtYXQsIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLkRBVEUpLFxuICAgICAgICByZXF1aXJlZChEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5SRVFVSVJFRCksXG4gICAgICAgIHByb3BNZXRhZGF0YShWYWxpZGF0aW9uLmtleShEQktleXMuVElNRVNUQU1QKSwge1xuICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgICB9KSxcbiAgICAgIF07XG4gICAgICBpZiAob3BlcmF0aW9uLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgIHByb3BNZXRhZGF0YSh0aW1lc3RhbXBLZXksIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIGVsc2UgZGVjb3JhdG9ycy5wdXNoKHJlYWRvbmx5KCkpO1xuICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHRpbWVzdGFtcEtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IHRzLFxuICAgICAgfSlcbiAgICAgIC5leHRlbmQoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHRpbWVzdGFtcCguLi5vcHM6IE9wZXJhdGlvbktleXNbXSkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiB0aW1lc3RhbXAob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgaWYgKG9wcy5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgICAgICAgIHJldHVybiBVcGRhdGVEYXRlQ29sdW1uKCkob2JqLCBwcm9wKTtcbiAgICAgICAgICAgIHJldHVybiBDcmVhdGVEYXRlQ29sdW1uKCkob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IChhcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhcmdzWzBdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG9uZVRvT25lKGNsYXp6KSA9PiBAT25lVG9PbmUoKCkgPT4gY2xhenopXG4gICAgY29uc3Qgb25lVG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3Iob25lVG9PbmVLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvbmVUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgam9pbkNvbHVtbk9wdHM/OiBKb2luQ29sdW1uT3B0aW9ucyxcbiAgICAgICAgICBmaz86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pbkNvbHVtbk9wdHMpIG1ldGFkYXRhLmpvaW5UYWJsZSA9IGpvaW5Db2x1bW5PcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgdHlwZShbXG4gICAgICAgICAgICAgICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZVxuICAgICAgICAgICAgICAgID8gY2xhenpcbiAgICAgICAgICAgICAgICA6IGNsYXp6Lm5hbWUpIGFzIGFueSxcbiAgICAgICAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvT25lS2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBPbmVUb09uZShcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKSkuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW3BrXTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEpvaW5Db2x1bW4oXG4gICAgICAgICAgICAgIGpvaW5Db2x1bW5PcHRzIHx8IG1ldGFkYXRhLm5hbWVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleUNvbnN0cmFpbnROYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKHVuZGVmaW5lZCBhcyBhbnkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb01hbnkoY2xhenopID0+IEBPbmVUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3Qgb25lVG9NYW55S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihvbmVUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvbmVUb01hbnkoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICAgICAgICBmaz86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhLmpvaW5UYWJsZSA9IGpvaW5UYWJsZU9wdHM7XG4gICAgICAgICAgaWYgKGZrKSBtZXRhLm5hbWUgPSBmaztcblxuICAgICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgbGlzdChjbGF6eiksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEob25lVG9NYW55S2V5LCBtZXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9uZVRvTWFueVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZXR1cm4gT25lVG9NYW55KFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWMgPSBkZWNzLmRlY29yYXRvcnNbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXp6ID1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZGVjLnByb3BzLmNsYXNzID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZGVjLnByb3BzLmNsYXNzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZGVjLnByb3BzLmNsYXNzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZGVjLnByb3BzLmNsYXNzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenoubmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgYENyb3NzIHJlbGF0aW9uIG5vdCBmb3VuZC4gRGlkIHlvdSB1c2UgQG1hbnlUb09uZSBvbiB0aGUgJHtjbGF6ei5uYW1lfT9gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbY3Jvc3NSZWxhdGlvbktleV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICAgICkob2JqLCBwcm9wKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycyk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAbWFueVRvT25lKGNsYXp6KSA9PiBATWFueVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG1hbnlUb09uZUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IobWFueVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWFueVRvT25lKFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IChjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IGNsYXp6KSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGpvaW5UYWJsZU9wdHMpIG1ldGFkYXRhLmpvaW5UYWJsZSA9IGpvaW5UYWJsZU9wdHM7XG4gICAgICAgICAgaWYgKGZrKSBtZXRhZGF0YS5uYW1lID0gZms7XG4gICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIk5PIEFDVElPTlwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIk5PIEFDVElPTlwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgdHlwZShbXG4gICAgICAgICAgICAgICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZVxuICAgICAgICAgICAgICAgID8gY2xhenpcbiAgICAgICAgICAgICAgICA6IGNsYXp6Lm5hbWUpIGFzIGFueSxcbiAgICAgICAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG1hbnlUb09uZUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgZnVuY3Rpb24gTWFueVRvT25lV3JhcHBlcihvYmo6IGFueSwgcHJvcDogYW55KTogYW55IHtcbiAgICAgICAgICAgICAgcmV0dXJuIE1hbnlUb09uZShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKTtcbiAgICAgICAgICAgICAgICAgIGxldCBjcm9zc1JlbGF0aW9uS2V5ID0gT2JqZWN0LmtleXMobSkuZmluZCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGssXG4gICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY3MgfHwgIWRlY3MuZGVjb3JhdG9ycyB8fCAhZGVjcy5kZWNvcmF0b3JzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxJU1QpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAga1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3REZWMpXG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgTm8gVHlwZSBEZWZpbml0aW9uIGZvdW5kIGZvciAke2t9IGluICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gbGlzdERlYy5jbGF6elswXSgpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSBvYmouY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjcm9zc1JlbGF0aW9uS2V5KVxuICAgICAgICAgICAgICAgICAgICBjcm9zc1JlbGF0aW9uS2V5ID0gZmluZFByaW1hcnlLZXkoXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpXG4gICAgICAgICAgICAgICAgICAgICkuaWQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW2Nyb3NzUmVsYXRpb25LZXldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBtYW55VG9NYW55KGNsYXp6KSA9PiBATWFueVRvTWFueSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9NYW55S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IobWFueVRvTWFueUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb01hbnkoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgbGlzdChjbGF6eiksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEobWFueVRvTWFueUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgTWFueVRvTWFueShcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKSkuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW3BrXTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEpvaW5UYWJsZShqb2luVGFibGVPcHRzIGFzIGFueSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQGluZGV4KCkgPT4gQEluZGV4KClcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuSU5ERVgpXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBpbmRleChcbiAgICAgICAgICBkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSB8IHN0cmluZ1tdIHwgc3RyaW5nLFxuICAgICAgICAgIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdIHwgc3RyaW5nLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBuYW1lPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBpbmRleChvYmo6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRpcmVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbmFtZSA9IGRpcmVjdGlvbnM7XG4gICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGNvbXBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9zaXRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSBjb21wb3NpdGlvbnM7XG4gICAgICAgICAgICAgIGNvbXBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25zICYmIGRpcmVjdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgIChkKSA9PlxuICAgICAgICAgICAgICAgICAgICAhW09yZGVyRGlyZWN0aW9uLkFTQywgT3JkZXJEaXJlY3Rpb24uRFNDXS5pbmNsdWRlcyhkIGFzIGFueSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9ucyA9IGRpcmVjdGlvbnMgYXMgc3RyaW5nW107XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25zICYmIGNvbXBvc2l0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEluZGV4KFtwcm9wLCAuLi5jb21wb3NpdGlvbnNdKShvYmopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gSW5kZXgoKShvYmosIHByb3ApO1xuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZSwge30pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgICAgLy8gYXNzaWduKGBway4ke3Byb3B9YCwgb3B0aW9ucylcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25UeXBlT1JNQ3JlYXRlVXBkYXRlLCB7fSksXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cblR5cGVPUk1BZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChUeXBlT1JNRmxhdm91cik7XG4iLCJpbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCB7IFR5cGVPUk1BZGFwdGVyIH07XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gaW50ZWdyYXRpb24gZm9yIERlY2FmLnRzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFR5cGVPUk0tYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNhZi50cyBkYXRhIGFjY2VzcyBhYnN0cmFjdGlvbnMsIGluY2x1ZGluZyB0aGUgYWRhcHRlciwgcmVwb3NpdG9yeSwgc3RhdGVtZW50IGJ1aWxkZXIsIHBhZ2luYXRpb24gdXRpbGl0aWVzLCBpbmRleCBoZWxwZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucy4gS2V5IGV4cG9ydHMgaW5jbHVkZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCB7QGxpbmsgVHlwZU9STVJlcG9zaXRvcnl9LCB7QGxpbmsgVHlwZU9STVN0YXRlbWVudH0sIHtAbGluayBUeXBlT1JNUGFnaW5hdG9yfSwgYW5kIGluZGV4IGdlbmVyYXRpb24gdXRpbGl0aWVzLlxuICogQG1vZHVsZSBmb3ItdHlwZW9ybVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJCYXNlRXJyb3IiLCJTUUxPcGVyYXRvciIsIlBhZ2luYXRvciIsIk1vZGVsS2V5cyIsIlBhZ2luZ0Vycm9yIiwiZmluZFByaW1hcnlLZXkiLCJRdWVyeUVycm9yIiwiSW50ZXJuYWxFcnJvciIsIlJlcG9zaXRvcnkiLCJSZWZsZWN0aW9uIiwiUGVyc2lzdGVuY2VLZXlzIiwiTW9kZWwiLCJTdGF0ZW1lbnQiLCJPcmRlckRpcmVjdGlvbiIsIkdyb3VwT3BlcmF0b3IiLCJPcGVyYXRvciIsIlNlcXVlbmNlIiwiTm90Rm91bmRFcnJvciIsIkRlZmF1bHRTZXBhcmF0b3IiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiT3BlcmF0aW9uS2V5cyIsIlZhbGlkYXRpb25LZXlzIiwiVHlwZU9STVJlcG9zaXRvcnkiLCJDb250ZXh0IiwiVmFsaWRhdGlvbkVycm9yIiwiX19kZWNvcmF0ZSIsInVzZXMiLCJBZGFwdGVyIiwiRXZlbnRTdWJzY3JpYmVyIiwiRGlzcGF0Y2giLCJVbnN1cHBvcnRlZEVycm9yIiwiVmFsaWRhdGlvbiIsImdldE1ldGFkYXRhQXJnc1N0b3JhZ2UiLCJDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IiLCJQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yIiwiRGF0YVNvdXJjZSIsIkRCS2V5cyIsIkNvbmZsaWN0RXJyb3IiLCJJbiIsIkNvbm5lY3Rpb25FcnJvciIsIkxvZ2dpbmciLCJERUZBVUxUX0VSUk9SX01FU1NBR0VTIiwiRGVjb3JhdGlvbiIsInJlcXVpcmVkIiwicmVhZG9ubHkiLCJwcm9wTWV0YWRhdGEiLCJzZXF1ZW5jZU5hbWVGb3JNb2RlbCIsImFwcGx5IiwidHlwZSIsIlZlcnNpb25Db2x1bW4iLCJVcGRhdGVWYWxpZGF0aW9uS2V5cyIsImRhdGUiLCJEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTIiwiQ2FzY2FkZSIsInByb3AiLCJKb2luQ29sdW1uIiwibGlzdCIsIkpvaW5UYWJsZSIsIkluZGV4Iiwib25DcmVhdGUiLCJvbkNyZWF0ZVVwZGF0ZSIsImZpbmFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFBQTs7Ozs7SUFLRztBQUNJLFVBQU0sa0JBQWtCLEdBQzdCO0lBRUY7Ozs7O0lBS0c7QUFDSSxVQUFNLGNBQWMsR0FBRztJQUU5Qjs7Ozs7Ozs7Ozs7OztJQWFHO0lBQ0g7Ozs7OztJQU1HO0FBQ0ksVUFBTSxXQUFXLEdBQUc7SUFDekIsSUFBQSxTQUFTLEVBQUUsR0FBRztJQUNkLElBQUEsRUFBRSxFQUFFLElBQUk7SUFDUixJQUFBLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUEsT0FBTyxFQUFFLFlBQVk7SUFDckIsSUFBQSxLQUFLLEVBQUUsWUFBWTtJQUNuQixJQUFBLE1BQU0sRUFBRSxhQUFhO0lBQ3JCLElBQUEsUUFBUSxFQUFFLGVBQWU7SUFDekIsSUFBQSxLQUFLLEVBQUUsT0FBTzs7O0lDNUNoQjs7Ozs7Ozs7Ozs7Ozs7OztJQWdCRztJQUNHLE1BQU8sVUFBVyxTQUFRQSxzQkFBUyxDQUFBO0lBQ3ZDLElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUE7WUFDN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNs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
3436
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvT25lVG9PbmUudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9NYW55VG9NYW55LnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9FbnRpdHkudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpZmllciBzdHJpbmcgZm9yIHRoZSBUeXBlT1JNIGFkYXB0ZXIgZmxhdm91ci5cbiAqIEBzdW1tYXJ5IFVzZWQgdG8gcmVnaXN0ZXIgYW5kIHJlc29sdmUgdGhlIFR5cGVPUk0gaW1wbGVtZW50YXRpb24gd2l0aGluIHRoZSBEZWNhZi50cyBhZGFwdGVyIGZhY3Rvcnkgc3lzdGVtLlxuICogQGNvbnN0IFR5cGVPUk1GbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNRmxhdm91ciA9IFwidHlwZS1vcm1cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2hhcGUgb2YgdGhlIFR5cGVPUk1LZXlzIGNvbnN0YW50LlxuICogQHN1bW1hcnkgRGVzY3JpYmVzIHRoZSBrZXlzIGFuZCB0aGVpciBtZWFuaW5ncyB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAdHlwZWRlZiBUeXBlT1JNS2V5c0RlZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUEFSQVRPUiBTZXBhcmF0b3IgdXNlZCB0byBqb2luIHRhYmxlIGFuZCBjb2x1bW4gaWRlbnRpZmllcnMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUQgRGVmYXVsdCBwcmltYXJ5IGtleSBmaWVsZCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFZFUlNJT04gVmVyc2lvbiBmaWVsZCB1c2VkIGZvciBvcHRpbWlzdGljIGxvY2tpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREVMRVRFRCBTb2Z0LWRlbGV0ZSB0aW1lc3RhbXAgZmllbGQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEFCTEUgRGF0YWJhc2UgdGFibGUgaWRlbnRpZmllciBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0NIRU1BIERhdGFiYXNlIHNjaGVtYSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRVFVRU5DRSBEYXRhYmFzZSBzZXF1ZW5jZSBuYW1lIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkRFWCBJbmRleCBpZGVudGlmaWVyIGtleS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5IGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBDb2xsZWN0aW9uIG9mIHN0cmluZyBjb25zdGFudHMgdGhhdCBpZGVudGlmeSBjb21tb24gZGF0YWJhc2UgcHJvcGVydGllcyBhbmQgYWRhcHRlci1zcGVjaWZpYyBrZXlzLlxuICogQGNvbnN0IFR5cGVPUk1LZXlzXG4gKiBAdHlwZSB7VHlwZU9STUtleXNEZWZ9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNS2V5cyA9IHtcbiAgU0VQQVJBVE9SOiBcIi5cIixcbiAgSUQ6IFwiaWRcIixcbiAgVkVSU0lPTjogXCJ2ZXJzaW9uXCIsXG4gIERFTEVURUQ6IFwiZGVsZXRlZF9hdFwiLFxuICBUQUJMRTogXCJ0YWJsZV9uYW1lXCIsXG4gIFNDSEVNQTogXCJzY2hlbWFfbmFtZVwiLFxuICBTRVFVRU5DRTogXCJzZXF1ZW5jZV9uYW1lXCIsXG4gIElOREVYOiBcImluZGV4XCIsXG59O1xuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggVHlwZU9STSBpbmRleGVzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBlcnJvciByZWxhdGVkIHRvIGluZGV4IGdlbmVyYXRpb24gb3IgaGFuZGxpbmcgd2l0aGluIHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdC5cbiAqIEBjbGFzc1xuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgdXNpbmcgSW5kZXhFcnJvclxuICogdHJ5IHtcbiAqICAgLy8gU29tZSBjb2RlIHRoYXQgbWlnaHQgdGhyb3cgYW4gaW5kZXggZXJyb3JcbiAqICAgdGhyb3cgbmV3IEluZGV4RXJyb3IoXCJJbmRleCBub3QgZm91bmRcIik7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBJbmRleEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihcIkluZGV4IGVycm9yIG9jY3VycmVkOlwiLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY2xhc3MgSW5kZXhFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihJbmRleEVycm9yLm5hbWUsIG1zZywgNDA0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeUJ1aWxkZXIgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNRTCBvcGVyYXRvcnMgYXZhaWxhYmxlIGZvciBidWlsZGluZyBUeXBlT1JNIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGlvbiBvZiBjb21tb24gU1FMIG9wZXJhdG9ycyBpbnRlbmRlZCBmb3IgdXNlIHdpdGhpbiBUeXBlT1JNIHF1ZXJ5IGNvbnN0cnVjdGlvbiBhbmQgdHJhbnNsYXRpb24gbGF5ZXJzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBlbnVtIFNRTE9wZXJhdG9yIHtcbiAgLyoqIEV4YWN0IGVxdWFsaXR5IGNvbXBhcmlzb24gKD0pICovXG4gIEVRVUFMID0gXCI9XCIsXG4gIC8qKiBJbmVxdWFsaXR5IGNvbXBhcmlzb24gKDw+KSAqL1xuICBOT1RfRVFVQUwgPSBcIjw+XCIsXG4gIC8qKiBMZXNzLXRoYW4gY29tcGFyaXNvbiAoPCkgKi9cbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIC8qKiBMZXNzLXRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPD0pICovXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgLyoqIEdyZWF0ZXItdGhhbiBjb21wYXJpc29uICg+KSAqL1xuICBHUkVBVEVSX1RIQU4gPSBcIj5cIixcbiAgLyoqIEdyZWF0ZXItdGhhbiBvciBlcXVhbCBjb21wYXJpc29uICg+PSkgKi9cbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMID0gXCI+PVwiLFxuICAvKiogTWVtYmVyc2hpcCBpbiBhIHNldCAoSU4pICovXG4gIElOID0gXCJJTlwiLFxuICAvKiogTm9uLW1lbWJlcnNoaXAgaW4gYSBzZXQgKE5PVCBJTikgKi9cbiAgTk9UX0lOID0gXCJOT1QgSU5cIixcbiAgLyoqIFBhdHRlcm4gbWF0Y2ggdXNpbmcgTElLRSAqL1xuICBMSUtFID0gXCJMSUtFXCIsXG4gIC8qKiBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2ggdXNpbmcgSUxJS0UgKFBvc3RncmVzKSAqL1xuICBJTElLRSA9IFwiSUxJS0VcIixcbiAgLyoqIFJhbmdlIGNvbXBhcmlzb24gdXNpbmcgQkVUV0VFTiAqL1xuICBCRVRXRUVOID0gXCJCRVRXRUVOXCIsXG4gIC8qKiBOdWxsIGNoZWNrIChJUyBOVUxMKSAqL1xuICBJU19OVUxMID0gXCJJUyBOVUxMXCIsXG4gIC8qKiBOb3QtbnVsbCBjaGVjayAoSVMgTk9UIE5VTEwpICovXG4gIElTX05PVF9OVUxMID0gXCJJUyBOT1QgTlVMTFwiLFxuICAvKiogRXhpc3RlbmNlIG9mIHJvd3MgKEVYSVNUUykgKi9cbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgLyoqIE5vbi1leGlzdGVuY2Ugb2Ygcm93cyAoTk9UIEVYSVNUUykgKi9cbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICAvKiogQ29tcGFyZSB0byBhbnkgdmFsdWUgaW4gYW4gYXJyYXkgKEFOWSkgKi9cbiAgQU5ZID0gXCJBTllcIixcbiAgLyoqIENvbXBhcmUgdG8gYWxsIHZhbHVlcyBpbiBhbiBhcnJheSAoQUxMKSAqL1xuICBBTEwgPSBcIkFMTFwiLFxuICAvKiogQ29tcGFyZSB0byBzb21lIHZhbHVlcyBpbiBhbiBhcnJheSAoU09NRSkgKi9cbiAgU09NRSA9IFwiU09NRVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBRdWVyeSBjb250YWluZXIgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlaXRoZXIgYSByYXcgU1FMIHN0cmluZyBvciBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGFsb25nIHdpdGggb3B0aW9uYWwgYm91bmQgdmFsdWVzIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBhZGFwdGVyLlxuICogQHRlbXBsYXRlIE0gVGhlIE1vZGVsIHR5cGUgZm9yIHdoaWNoIHRoZSBTZWxlY3RRdWVyeUJ1aWxkZXIgaXMgcGFyYW1ldGVyaXplZC5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSB1bmRlcmx5aW5nIHF1ZXJ5IHR5cGUsIGVpdGhlciBhIHN0cmluZyBvciBhIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPi5cbiAqIEBpbnRlcmZhY2UgVHlwZU9STVF1ZXJ5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZU9STVF1ZXJ5PFxuICBNIGV4dGVuZHMgTW9kZWwgPSBNb2RlbCxcbiAgVCBleHRlbmRzIHN0cmluZyB8IFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPiA9IHN0cmluZyxcbj4ge1xuICBxdWVyeTogVDtcbiAgdmFsdWVzPzogYW55W107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZmxhZ3MgZm9yIFR5cGVPUk0gb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IEV4dGVuZGVkIHJlcG9zaXRvcnkgZmxhZ3MgaW5jbHVkaW5nIGNvbm5lY3Rpb24vdXNlciBjb250ZXh0IHRoYXQgY2FuIGJlIGxldmVyYWdlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGludGVyZmFjZSBUeXBlT1JNRmxhZ3NcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNRmxhZ3MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3Mge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVzZXIgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gZm9yIFBvc3RncmVzIGRhdGFiYXNlIGNvbm5lY3Rpb25zXG4gICAqL1xuICB1c2VyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmljYXRpb24gZm9yIGEgdGFibGUgY3JlYXRpb24vY2hhbmdlIHN0YXRlbWVudCB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIGEgVHlwZU9STVF1ZXJ5IHdpdGggdGFibGUgbWV0YWRhdGEgc3VjaCBhcyBwcmltYXJ5IGtleSBmbGFnLCBjb25zdHJhaW50cywgYW5kIGZvcmVpZ24ga2V5cy5cbiAqIEB0eXBlZGVmIFR5cGVPUk1UYWJsZVNwZWNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpbWFyeUtleSBJbmRpY2F0ZXMgaWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBjb25zdHJhaW50cyBBIGxpc3Qgb2YgcmF3IFNRTCBjb25zdHJhaW50cyB0byBhcHBseSB0byB0aGUgdGFibGUvY29sdW1uLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZm9yZWlnbktleXMgQSBsaXN0IG9mIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVPUk1UYWJsZVNwZWMgPSBUeXBlT1JNUXVlcnkgJiB7XG4gIHByaW1hcnlLZXk6IGJvb2xlYW47XG4gIGNvbnN0cmFpbnRzOiBzdHJpbmdbXTtcbiAgZm9yZWlnbktleXM6IHN0cmluZ1tdO1xufTtcbiIsImltcG9ydCB7IFNRTE9wZXJhdG9yIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgcXVlcnkgbGltaXQgZm9yIFR5cGVPUk0tYmFja2VkIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHRvIHJldHVybiBpbiBhIHNpbmdsZSBwYWdlIHdoZW4gcGFnaW5hdGluZyByZXN1bHRzLlxuICogQGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNUXVlcnlMaW1pdCA9IDI1MDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBvcGVyYXRvciBuYW1lcyB0byBTUUwgb3BlcmF0b3JzLlxuICogQHN1bW1hcnkgQ29uc3RhbnRzIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycyB1c2VkIHdoZW4gdHJhbnNsYXRpbmcgaGlnaC1sZXZlbCBmaWx0ZXJzIGludG8gU1FMIHZpYSBUeXBlT1JNLlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zdGdyZVNRTE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVRVUFMIEVxdWFsaXR5IG9wZXJhdG9yICg9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERJRkZFUkVOVCBJbmVxdWFsaXR5IG9wZXJhdG9yICg8PilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdHRVIgR3JlYXRlciB0aGFuIG9wZXJhdG9yICg+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUl9FUSBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKD49KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNNQUxMRVIgTGVzcyB0aGFuIG9wZXJhdG9yICg8KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNNQUxMRVJfRVEgTGVzcyB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yICg8PSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOT1QgTmVnYXRpb24gb3BlcmF0b3IgKE5PVClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTiBJbiBhcnJheSBvcGVyYXRvciAoSU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVHRVhQIFJlZ3VsYXIgZXhwcmVzc2lvbiBvcGVyYXRvciAofilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJUkVHRVhQIENhc2UtaW5zZW5zaXRpdmUgcmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMSUtFIFBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKExJS0UpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUxJS0UgQ2FzZS1pbnNlbnNpdGl2ZSBwYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdG9yIChJTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCRVRXRUVOIFJhbmdlIG9wZXJhdG9yIChCRVRXRUVOKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05VTEwgTlVMTCBjaGVjayBvcGVyYXRvciAoSVMgTlVMTClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJU19OT1RfTlVMTCBOT1QgTlVMTCBjaGVjayBvcGVyYXRvciAoSVMgTk9UIE5VTEwpXG4gKiBAY29uc3QgVHlwZU9STU9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTE9wZXJhdG9yVHlwZX1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1PcGVyYXRvcjogUmVjb3JkPHN0cmluZywgU1FMT3BlcmF0b3IgfCBzdHJpbmc+ID0ge1xuICBFUVVBTDogU1FMT3BlcmF0b3IuRVFVQUwsXG4gIERJRkZFUkVOVDogU1FMT3BlcmF0b3IuTk9UX0VRVUFMLFxuICBCSUdHRVI6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTixcbiAgQklHR0VSX0VROiBTUUxPcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsXG4gIFNNQUxMRVI6IFNRTE9wZXJhdG9yLkxFU1NfVEhBTixcbiAgU01BTExFUl9FUTogU1FMT3BlcmF0b3IuTEVTU19USEFOX09SX0VRVUFMLFxuICBCRVRXRUVOOiBTUUxPcGVyYXRvci5CRVRXRUVOLFxuICBOT1Q6IFwiTk9UXCIsXG4gIElOOiBTUUxPcGVyYXRvci5JTixcbiAgSVNfTlVMTDogU1FMT3BlcmF0b3IuSVNfTlVMTCxcbiAgSVNfTk9UX05VTEw6IFNRTE9wZXJhdG9yLklTX05PVF9OVUxMLFxuICBSRUdFWFA6IFwiflwiLFxuICBJUkVHRVhQOiBcIn4qXCIsXG4gIExJS0U6IFNRTE9wZXJhdG9yLkxJS0UsXG4gIElMSUtFOiBTUUxPcGVyYXRvci5JTElLRSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2YgbG9naWNhbCBvcGVyYXRvciBuYW1lcyB0byBTUUwgb3BlcmF0b3JzLlxuICogQHN1bW1hcnkgQ29uc3RhbnRzIGZvciBsb2dpY2FsIG9wZXJhdG9ycyB1c2VkIHdoZW4gYnVpbGRpbmcgV0hFUkUgY2xhdXNlIGdyb3VwcyBpbiBUeXBlT1JNIHF1ZXJpZXMuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBTkQgTG9naWNhbCBBTkQgb3BlcmF0b3IgKEFORClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPUiBMb2dpY2FsIE9SIG9wZXJhdG9yIChPUilcbiAqIEBjb25zdCBUeXBlT1JNR3JvdXBPcGVyYXRvclxuICogQHR5cGUge1Bvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZX1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBBTkQ6IFwiQU5EXCIsXG4gIE9SOiBcIk9SXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWFsIGNvbnN0YW50IHZhbHVlcyB1c2VkIGluIHF1ZXJpZXMuXG4gKiBAc3VtbWFyeSBTdHJpbmcgY29uc3RhbnRzIHJlcHJlc2VudGluZyBzcGVjaWFsIHZhbHVlcyB1c2VkIHdoaWxlIGNvbXBvc2luZyBTUUwgd2l0aCBUeXBlT1JNLlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zdGdyZVNRTENvbnN0VHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTEwgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG51bGwgdmFsdWUuXG4gKiBAY29uc3QgVHlwZU9STUNvbnN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNQ29uc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIE5VTEw6IFwiTlVMTFwiLFxufTtcbiIsImltcG9ydCB7IFBhZ2luYXRvciwgUGFnaW5nRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgRmluZE1hbnlPcHRpb25zLCBSZXBvc2l0b3J5IGFzIFJlcG8gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFnaW5hdG9yIGZvciBUeXBlT1JNIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHBhZ2luYXRpb24gZm9yIFR5cGVPUk0tYnVpbHQgcXVlcmllcyB1c2luZyB0YWtlL3NraXAgZm9yIGVmZmljaWVudCBuYXZpZ2F0aW9uIHRocm91Z2ggcmVzdWx0IHNldHMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IGNvbnRhaW5lciB0byBwYWdpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAY2xhc3MgVHlwZU9STVBhZ2luYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgdXNpbmcgVHlwZU9STVBhZ2luYXRvclxuICogY29uc3QgcGFnaW5hdG9yID0gbmV3IFR5cGVPUk1QYWdpbmF0b3IoYWRhcHRlciwgeyBxdWVyeTogcWIgfSwgMTAsIFVzZXIpO1xuICogY29uc3QgcGFnZTEgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqIGNvbnN0IHBhZ2UyID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMik7XG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIFIsXG4gIFR5cGVPUk1RdWVyeVxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBiYXNlZCBvbiB0aGUgcmVjb3JkIGNvdW50IGFuZCBwYWdlIHNpemVcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqL1xuICBvdmVycmlkZSBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxQYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgcmVjb3JkIGNvdW50XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZWNvcmRDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgX19yZXBvPzogUmVwbzxhbnk+O1xuXG4gIHByb3RlY3RlZCBnZXQgcmVwbygpIHtcbiAgICBpZiAoIXRoaXMuX19yZXBvKSB7XG4gICAgICB0aGlzLl9fcmVwbyA9ICh0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXIpLmNsaWVudC5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBKYXZhU2NyaXB0IFJlZ0V4cCBwYXR0ZXJuIHRvIGEgUG9zdGdyZVNRTCBQT1NJWCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBzdW1tYXJ5IEFjY2VwdHMgZWl0aGVyIGEgUmVnRXhwIG9iamVjdCBvciBhIHN0cmluZyByZXByZXNlbnRhdGlvbiAoL3BhdHRlcm4vZmxhZ3MpIGFuZCByZXR1cm5zIHRoZSByYXcgcGF0dGVybiBjb21wYXRpYmxlIHdpdGggUG9zdGdyZVNRTCdzIH4gYW5kIH4qIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30ganNSZWdleCBKYXZhU2NyaXB0IFJlZ0V4cCBvYmplY3Qgb3IgcGF0dGVybiBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFBvc3RncmVTUUwtY29tcGF0aWJsZSByZWdleCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFV0aWxzIGFzIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlc1xuICogICBBcHAtPj5VdGlsczogY29udmVydEpzUmVnZXhUb1Bvc3RncmVzKFJlZ0V4cChcImZvby4qXCIsXCJpXCIpKVxuICogICBVdGlscy0+PlV0aWxzOiBQYXJzZSBzdHJpbmcgb3IgdXNlIFJlZ0V4cC5zb3VyY2VcbiAqICAgVXRpbHMtLT4+QXBwOiBcImZvby4qXCJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcyhqc1JlZ2V4OiBSZWdFeHAgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByeHAgPSBuZXcgUmVnRXhwKC9eXFwvKC4rKVxcLyhcXHcrKSQvZyk7XG4gIGlmICh0eXBlb2YganNSZWdleCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1hdGNoID0gcnhwLmV4ZWMoanNSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBwXSA9IG1hdGNoO1xuICAgICAganNSZWdleCA9IHA7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKGpzUmVnZXgpIDoganNSZWdleDtcblxuICBjb25zdCBwYXR0ZXJuID0gcmVnZXguc291cmNlO1xuXG4gIHJldHVybiBwYXR0ZXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRFYWdlclJlbGF0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPixcbiAgY2FjaGU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuKTogeyBub25FYWdlcjogc3RyaW5nW107IHJlbGF0aW9uczogc3RyaW5nW10gfSB7XG4gIGxldCBpbnN0YW5jZTogTTtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZSA9IG5ldyBtKCk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgaW5zdGFudGlhdGUgbW9kZWwgJHttLm5hbWV9IGZvciBlYWdlciByZWxhdGlvbiBjYWxjdWxhdGlvbjogJHtlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlbHMgPSBSZXBvc2l0b3J5LnJlbGF0aW9ucyhtKTtcbiAgY2FjaGVbbS5uYW1lXSA9IGNhY2hlW20ubmFtZV0gfHwgdW5kZWZpbmVkO1xuICBpZiAoY2FjaGVbbS5uYW1lXSkge1xuICAgIHJldHVybiBjYWNoZVttLm5hbWVdO1xuICB9XG4gIGNvbnN0IHJlbGF0aW9ucyA9IHJlbHMucmVkdWNlKFxuICAgIChhY2N1bTogeyByZWxhdGlvbnM6IHN0cmluZ1tdOyBub25FYWdlcjogc3RyaW5nW10gfSwgYXR0cikgPT4ge1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT04pLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgYXR0cixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRlY29yYXRvcnMgfHxcbiAgICAgICAgIWRlY29yYXRvcnMuZGVjb3JhdG9ycyB8fFxuICAgICAgICAhZGVjb3JhdG9ycy5kZWNvcmF0b3JzLmxlbmd0aFxuICAgICAgKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gZGVjb3JhdG9ycyBmb3VuZCBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG4gICAgICBpZiAoZGVjb3JhdG9ycy5kZWNvcmF0b3JzLmxlbmd0aCA+IDEpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBkZWNvcmF0b3JzIGZvdW5kIGZvciBwcm9wZXJ0eSAke2F0dHJ9IG9uIG1vZGVsICR7bS5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZGVjb3JhdG9ycy5kZWNvcmF0b3JzWzBdO1xuICAgICAgY29uc3QgZWFnZXIgPSBkZWNvcmF0b3IucHJvcHMucG9wdWxhdGU7XG4gICAgICBsZXQgY2xhenogPSBkZWNvcmF0b3IucHJvcHMuY2xhc3M7XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiKSBjbGF6eiA9IE1vZGVsLmdldChjbGF6eikgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpIGNsYXp6ID0gY2xhenooKTtcbiAgICAgIGlmICghY2xhenopXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBjbGFzcyBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG5cbiAgICAgIGlmICghZWFnZXIpIHtcbiAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaChhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKGF0dHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWNjdW0ucmVsYXRpb25zLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgIGNvbnN0IHsgbm9uRWFnZXIsIHJlbGF0aW9ucyB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyhjbGF6eiwgY2FjaGUpO1xuICAgICAgICBpZiAobm9uRWFnZXIubGVuZ3RoICYmIGFjY3VtLnJlbGF0aW9ucy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgIGNvbnN0IG5vbkVhZ2VyUmVsYXRpb25zID0gbm9uRWFnZXIubWFwKChuZSkgPT4gYCR7YXR0cn0uJHtuZX1gKTtcbiAgICAgICAgICBhY2N1bS5ub25FYWdlci5wdXNoKC4uLm5vbkVhZ2VyUmVsYXRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVscyA9IHJlbGF0aW9ucy5tYXAoKG5lKSA9PiBgJHthdHRyfS4ke25lfWApO1xuICAgICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKC4uLnJlbHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHsgbm9uRWFnZXI6IFtdLCByZWxhdGlvbnM6IFtdIH1cbiAgKTtcbiAgY2FjaGVbbS5uYW1lXSA9IHJlbGF0aW9ucztcbiAgcmV0dXJuIHJlbGF0aW9ucztcbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFJlcG9zaXRvcnksXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgdHJhbnNsYXRlT3BlcmF0b3JzIH0gZnJvbSBcIi4vdHJhbnNsYXRlXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnlMaW1pdCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVHlwZU9STVBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucywgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zV2hlcmUgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNXaGVyZVwiO1xuaW1wb3J0IHsgc3BsaXRFYWdlclJlbGF0aW9ucyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuY2xpZW50XG4gICAgICAgIC5nZXRSZXBvc2l0b3J5KFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuZnJvbVNlbGVjdG9yXVxuICAgICAgICApXG4gICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIodGFibGVOYW1lKSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4sXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLm1hcCgocykgPT4gYCR7dGFibGVOYW1lfS4ke3MgYXMgc3RyaW5nfWApXG4gICAgICApO1xuICAgIGVsc2UgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KCk7XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbilcbiAgICAgIHEucXVlcnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT5cbiAgICAgICkucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT47XG5cbiAgICBsZXQgb3JkZXJCeUFyZ3M6IFtzdHJpbmcsIFwiREVTQ1wiIHwgXCJBU0NcIl07XG4gICAgaWYgKCF0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgIG9yZGVyQnlBcmdzID0gW1xuICAgICAgICBgJHt0YWJsZU5hbWV9LiR7ZmluZFByaW1hcnlLZXkobSkuaWQgYXMgc3RyaW5nfWAsXG4gICAgICAgIE9yZGVyRGlyZWN0aW9uLkFTQy50b1VwcGVyQ2FzZSgpIGFzIFwiQVNDXCIsXG4gICAgICBdO1xuICAgIGVsc2VcbiAgICAgIG9yZGVyQnlBcmdzID0gW1xuICAgICAgICBgJHt0YWJsZU5hbWV9LiR7dGhpcy5vcmRlckJ5U2VsZWN0b3JbMF0gYXMgc3RyaW5nfWAsXG4gICAgICAgIHRoaXMub3JkZXJCeVNlbGVjdG9yWzFdLnRvVXBwZXJDYXNlKCkgYXMgXCJERVNDXCIgfCBcIkFTQ1wiLFxuICAgICAgXTtcblxuICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55Pikub3JkZXJCeSguLi5vcmRlckJ5QXJncyk7XG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdCh0aGlzLmxpbWl0U2VsZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGxpbWl0IG9mICR7VHlwZU9STVF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikubGltaXQoVHlwZU9STVF1ZXJ5TGltaXQpO1xuICAgIH1cblxuICAgIC8vIEFkZCBvZmZzZXRcbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55Pikuc2tpcCh0aGlzLm9mZnNldFNlbGVjdG9yKTtcblxuICAgIHJldHVybiBxIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHBhZ2luYXRvciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhIFR5cGVPUk1QYWdpbmF0b3IgZm9yIHBhZ2luYXRlZCByZXN1bHRzLlxuICAgKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHBhZ2luYXRvci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUncyBhbiBlcnJvciBidWlsZGluZyB0aGUgcXVlcnkuXG4gICAqL1xuICBhc3luYyBwYWdpbmF0ZTxSPihzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBUeXBlT1JNUXVlcnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrQXR0ciBUaGUgcHJpbWFyeSBrZXkgYXR0cmlidXRlIG9mIHRoZSBtb2RlbC5cbiAgICogQHJldHVybiB7YW55fSBUaGUgcHJvY2Vzc2VkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1JlY29yZChyOiBhbnksIHBrQXR0cjoga2V5b2YgTSkge1xuICAgIGlmICh0eXBlb2Ygcltwa0F0dHJdICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmZyb21TZWxlY3RvciwgcGtBdHRyLCByW3BrQXR0cl0pO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgVHlwZU9STSBxdWVyeSBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBTZW5kcyB0aGUgYnVpbHQgU2VsZWN0UXVlcnlCdWlsZGVyIHRvIHRoZSBkYXRhYmFzZSB2aWEgVHlwZU9STSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy5cbiAgICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcmF3SW5wdXQgVGhlIHF1ZXJ5IGNvbnRhaW5lciB0byBleGVjdXRlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0cy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogVHlwZU9STVF1ZXJ5PE0+KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmF3KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRXhlY3V0aW5nIHJhdyBxdWVyeTogJHsocmF3SW5wdXQucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4pLmdldFNxbCgpfWBcbiAgICApO1xuXG4gICAgY29uc3QgeyBub25FYWdlciB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyh0aGlzLmZyb21TZWxlY3Rvcik7XG4gICAgLy8gZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICByYXdJbnB1dC5xdWVyeSA9IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5zZXRGaW5kT3B0aW9ucyh7XG4gICAgICBsb2FkRWFnZXJSZWxhdGlvbnM6IHRydWUsXG4gICAgICBsb2FkUmVsYXRpb25JZHM6IHtcbiAgICAgICAgcmVsYXRpb25zOiBub25FYWdlcixcbiAgICAgIH0sXG4gICAgfSkgYXMgYW55O1xuICAgIC8vIH1cbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb3VudGVyID0gMCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBGaW5kT3B0aW9uc1doZXJlPE0+W10gfCBGaW5kT3B0aW9uc1doZXJlPE0+IHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gUG9zdGdyZVNRTCBjb25kaXRpb25zXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uIHN0cnVjdHVyZXNcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWJsZU5hbWVdIC0gdGhlIHBvc2l0aW9uYWwgaW5kZXggb2YgdGhlIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBQb3N0Z3Jlc1NRTCBjb25kaXRpb25cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgdHJhbnNsYXRlT3BlcmF0b3JzXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICpcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBFeHRyYWN0IGNvbmRpdGlvbiBwYXJ0c1xuICAgKlxuICAgKiAgIGFsdCBTaW1wbGUgY29tcGFyaXNvbiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+dHJhbnNsYXRlT3BlcmF0b3JzOiB0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXG4gICAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+U3RhdGVtZW50OiBSZXR1cm4gUG9zdGdyZVNRTCBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDcmVhdGUgY29uZGl0aW9uIHdpdGggY29sdW1uLCBvcGVyYXRvciwgYW5kIHZhbHVlXG4gICAqICAgZWxzZSBOT1Qgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oYXR0cjEpXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBOT1QgdG8gY29uZGl0aW9uc1xuICAgKiAgIGVsc2UgQU5EL09SIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb21wYXJpc29uKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDb21iaW5lIGNvbmRpdGlvbnMgd2l0aCBBTkQvT1JcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gY29uZGl0aW9ucyBhcnJheVxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlQ29uZGl0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICBjb3VudGVyID0gMCxcbiAgICBjb25kaXRpb25hbE9wPzogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4gICk6IFR5cGVPUk1RdWVyeTxNPiB7XG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwYXJzZSgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgICAgY29uc3Qgc3FsT3BlcmF0b3IgPSB0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpO1xuICAgICAgY29uc3QgYXR0clJlZiA9IGAke2F0dHIxfSR7Y291bnRlcn1gO1xuICAgICAgY29uc3QgcXVlcnlTdHIgPSBgJHt0YWJsZU5hbWV9LiR7YXR0cjF9ICR7c3FsT3BlcmF0b3J9IDoke2F0dHJSZWZ9YDtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgICAgW2F0dHJSZWZdOiBjb21wYXJpc29uLFxuICAgICAgfTtcbiAgICAgIHN3aXRjaCAoY29uZGl0aW9uYWxPcCkge1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIuYW5kV2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5PUjpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLm9yV2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgT3BlcmF0b3IuTk9UOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi53aGVyZShxdWVyeVN0ciwgdmFsdWVzKSBhcyBhbnksXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJzZSgpO1xuICAgIH1cbiAgICAvLyBGb3IgTk9UIG9wZXJhdG9yXG4gICAgZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9UIG9wZXJhdG9yIG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9XG4gICAgLy8gRm9yIEFORC9PUiBvcGVyYXRvcnNcbiAgICBlbHNlIHtcbiAgICAgIHFiID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4sIHRhYmxlTmFtZSwgcWIsICsrY291bnRlcilcbiAgICAgICAgLnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIGNvbXBhcmlzb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcWIsXG4gICAgICAgICsrY291bnRlcixcbiAgICAgICAgb3BlcmF0b3JcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuLi9UeXBlT1JNQWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRhdGFiYXNlIHNlcXVlbmNlIGZvciBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yIHtAbGluayBTZXF1ZW5jZX1zLCBkZWxlZ2F0aW5nIHRvIHRoZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9IHRvIGZldGNoIGFuZCBpbmNyZW1lbnQgdmFsdWVzIHdoaWxlIGhhbmRsaW5nIHR5cGUgcGFyc2luZyBhbmQgZXJyb3IgdHJhbnNsYXRpb24uXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zIChuYW1lLCB0eXBlLCBzdGFydFdpdGgsIGluY3JlbWVudEJ5LCBldGMuKS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIGV4ZWN1dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucy5cbiAqIEBjbGFzcyBUeXBlT1JNU2VxdWVuY2VcbiAqIEBpbXBsZW1lbnRzIFNlcXVlbmNlXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFuZCB1c2UgYSBUeXBlT1JNLWJhY2tlZCBzZXF1ZW5jZVxuICogY29uc3Qgc2VxID0gbmV3IFR5cGVPUk1TZXF1ZW5jZSh7IG5hbWU6IFwidXNlcl9pZF9zZXFcIiwgdHlwZTogXCJOdW1iZXJcIiwgc3RhcnRXaXRoOiAxLCBpbmNyZW1lbnRCeTogMSB9LCBhZGFwdGVyKTtcbiAqIGNvbnN0IG5leHRJZCA9IGF3YWl0IHNlcS5uZXh0KCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VxIGFzIFR5cGVPUk1TZXF1ZW5jZVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gKiAgIEFwcC0+PlNlcTogbmV4dCgpXG4gKiAgIFNlcS0+PlNlcTogY3VycmVudCgpXG4gKiAgIFNlcS0+PkFkYXB0ZXI6IHJhdyhTRUxFQ1QgY3VycmVudF92YWx1ZSAuLi4pXG4gKiAgIEFkYXB0ZXItPj5EQjogUXVlcnkgY3VycmVudCB2YWx1ZVxuICogICBEQi0tPj5BZGFwdGVyOiBjdXJyZW50X3ZhbHVlXG4gKiAgIEFkYXB0ZXItLT4+U2VxOiB2YWx1ZVxuICogICBTZXEtPj5TZXE6IGluY3JlbWVudChjdXJyZW50KVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcobmV4dHZhbChuYW1lKSlcbiAqICAgQWRhcHRlci0+PkRCOiBuZXh0dmFsKClcbiAqICAgREItLT4+QWRhcHRlcjogbmV4dCB2YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLS0+PkFwcDogcGFyc2VkIG5leHQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1TZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zLFxuICAgIHByb3RlY3RlZCBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlclxuICApIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBhc3luYyBjdXJyZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIHNlcXVlbmNlX25hbWUsIHN0YXJ0X3ZhbHVlLCBtaW5pbXVtX3ZhbHVlLCBpbmNyZW1lbnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2VxdWVuY2VzIFdIRVJFIHNlcXVlbmNlX25hbWUgPSAkMWAsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgICAvLyBJZiBubyBzZXF1ZW5jZSBleGlzdHMsIGZvcmNlIGEgY2xlYXIsIGNvbnNpc3RlbnQgZXJyb3IgZm9yIGNhbGxlcnNcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb3dzKSB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFNlcXVlbmNlICR7bmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAvLyBpbmZvcm1hdGlvbl9zY2hlbWEgZG9lcyBub3QgZXhwb3NlIHRoZSBjdXJyZW50IHJ1bnRpbWUgdmFsdWUgcmVsaWFibHk7IGZhbGwgYmFjayB0byBzdGFydF92YWx1ZVxuICAgICAgY29uc3Qgcm93ID0gcm93c1swXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgcm93W1wiY3VycmVudF92YWx1ZVwiXSA/PyByb3dbXCJsYXN0X3ZhbHVlXCJdID8/IHJvd1tcInN0YXJ0X3ZhbHVlXCJdO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2UoY2FuZGlkYXRlIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5hZGFwdGVyLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFBhcnNlcyB0aGUge0BsaW5rIFNlcXVlbmNlfSB2YWx1ZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICByZXR1cm4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLm9wdGlvbnMudHlwZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGluY3JlbWVudHMgdGhlIHNlcXVlbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTZXF1ZW5jZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gY3VycmVudFxuICAgKiBAcGFyYW0gY291bnRcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbmNyZW1lbnQoXG4gICAgY3VycmVudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIGNvdW50PzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyB0eXBlLCBpbmNyZW1lbnRCeSwgbmFtZSwgc3RhcnRXaXRoIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHR5cGUgIT09IFwiTnVtYmVyXCIgJiYgdHlwZSAhPT0gXCJCaWdJbnRcIilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ2Fubm90IGluY3JlbWVudCBzZXF1ZW5jZSBvZiB0eXBlICR7dHlwZX0gd2l0aCAke2NvdW50fWBcbiAgICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBTRUxFQ1QgbmV4dHZhbCgkMSkgQVMgbmV4dHZhbDtgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdmFsID0gQXJyYXkuaXNBcnJheShyb3dzKSAmJiByb3dzWzBdID8gcm93c1swXVtcIm5leHR2YWxcIl0gOiByb3dzO1xuICAgICAgcmV0dXJuIHZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgaWYgKCFuYW1lKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGluY3JlbWVudCBzZXF1ZW5jZSB3aXRob3V0IGEgbmFtZTogJHtuYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc2VxdWVuY2UgaWYgbWlzc2luZy4gSWRlbnRpZmllcnMgY2Fubm90IGJlIHBhcmFtZXRlcml6ZWQsIHNvIHF1b3RlIHRoZSBuYW1lLlxuICAgICAgY29uc3QgcXVvdGVkID0gYFwiJHtuYW1lLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgQ1JFQVRFIFNFUVVFTkNFIElGIE5PVCBFWElTVFMgJHtxdW90ZWR9IFNUQVJUIFdJVEggJHtzdGFydFdpdGh9IElOQ1JFTUVOVCBCWSAke2luY3JlbWVudEJ5fSBOTyBDWUNMRTtgLFxuICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByb3dzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBuZXh0dmFsKCQxKSBBUyBuZXh0dmFsO2AsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB2YWwgPSBBcnJheS5pc0FycmF5KHJvd3MpICYmIHJvd3NbMF0gPyByb3dzWzBdW1wibmV4dHZhbFwiXSA6IHJvd3M7XG4gICAgICByZXR1cm4gdmFsIGFzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIHRoZSBuZXh0IHZhbHVlIGluIHRoIHNlcXVlbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBjYWxscyB7QGxpbmsgU2VxdWVuY2UjcGFyc2V9IG9uIHRoZSBjdXJyZW50IHZhbHVlXG4gICAqIGZvbGxvd2VkIGJ5IHtAbGluayBTZXF1ZW5jZSNpbmNyZW1lbnR9XG4gICAqXG4gICAqL1xuICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuY3VycmVudCgpO1xuICAgIHJldHVybiB0aGlzLmluY3JlbWVudChjdXJyZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gKGF3YWl0IHRoaXMuY3VycmVudCgpKSBhcyBudW1iZXI7XG4gICAgY29uc3QgaW5jcmVtZW50QnkgPSB0aGlzLnBhcnNlKHRoaXMub3B0aW9ucy5pbmNyZW1lbnRCeSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCA9IGF3YWl0IHRoaXMuaW5jcmVtZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgICh0aGlzLnBhcnNlKGNvdW50KSBhcyBudW1iZXIpICogaW5jcmVtZW50QnlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlOiAobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICByYW5nZS5wdXNoKGN1cnJlbnQgKyBpbmNyZW1lbnRCeSAqICh0aGlzLnBhcnNlKGkpIGFzIG51bWJlcikpO1xuICAgIH1cbiAgICBpZiAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT09IG5leHQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc2NhbGN1bGF0aW9uIG9mIHJhbmdlXCIpO1xuICAgIHJldHVybiByYW5nZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5kZXhNZXRhZGF0YSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVwb3NpdG9yeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBuYW1lIGZvciBhIENvdWNoREIgaW5kZXhcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4IGJ5IGNvbWJpbmluZyBuYW1lIHBhcnRzLCBjb21wb3NpdGlvbnMsIGFuZCBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWUgLSBBcnJheSBvZiBuYW1lIHBhcnRzIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtkaXJlY3Rpb25dIC0gT3B0aW9uYWwgc29ydCBkaXJlY3Rpb24gZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gaW5jbHVkZSBpbiB0aGUgaW5kZXggbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBUaGUgc2VwYXJhdG9yIHRvIHVzZSBiZXR3ZWVuIHBhcnRzIG9mIHRoZSBpbmRleCBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgaW5kZXggbmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUluZGV4TmFtZShcbiAgbmFtZTogc3RyaW5nW10sXG4gIGRpcmVjdGlvbj86IE9yZGVyRGlyZWN0aW9uLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmFtZS5tYXAoKG4pID0+IChuID09PSBUeXBlT1JNS2V5cy5UQUJMRSA/IFwidGFibGVcIiA6IG4pKSxcbiAgICAuLi4oY29tcG9zaXRpb25zIHx8IFtdKSxcbiAgICAuLi4oZGlyZWN0aW9uID8gW2RpcmVjdGlvbl0gOiBbXSksXG4gICAgVHlwZU9STUtleXMuSU5ERVgsXG4gIF0uam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgQ291Y2hEQiBpbmRleCBjb25maWd1cmF0aW9ucyBmb3IgbW9kZWxzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc2V0IG9mIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgYmFzZWQgb24gdGhlIG1ldGFkYXRhIG9mIHRoZSBwcm92aWRlZCBtb2RlbHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0gbW9kZWxzIC0gQXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzIHRvIGdlbmVyYXRlIGluZGV4ZXMgZm9yXG4gKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IEFycmF5IG9mIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhlc1xuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4TmFtZVxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5nZW5lcmF0ZUluZGV4ZXM6IG1vZGVsc1xuICpcbiAqICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGJhc2UgdGFibGUgaW5kZXhcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleE5hbWU6IFtDb3VjaERCS2V5cy5UQUJMRV1cbiAqICAgZ2VuZXJhdGVJbmRleE5hbWUtLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgdGFibGUgaW5kZXggY29uZmlnXG4gKlxuICogICBsb29wIEZvciBlYWNoIG1vZGVsXG4gKiAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IGluZGV4ZXMgbWV0YWRhdGFcbiAqICAgICBSZXBvc2l0b3J5LS0+PmdlbmVyYXRlSW5kZXhlczogaW5kZXggbWV0YWRhdGFcbiAqXG4gKiAgICAgbG9vcCBGb3IgZWFjaCBpbmRleCBpbiBtZXRhZGF0YVxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogRXh0cmFjdCBpbmRleCBwcm9wZXJ0aWVzXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5SZXBvc2l0b3J5OiBHZXQgdGFibGUgbmFtZVxuICogICAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IHRhYmxlTmFtZVxuICpcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IERlZmluZSBuZXN0ZWQgZ2VuZXJhdGUgZnVuY3Rpb25cbiAqXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoKSBmb3IgZGVmYXVsdCBvcmRlclxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGluZGV4IG5hbWUgYW5kIGNvbmZpZ1xuICpcbiAqICAgICAgIGFsdCBIYXMgZGlyZWN0aW9uc1xuICogICAgICAgICBsb29wIEZvciBlYWNoIGRpcmVjdGlvblxuICogICAgICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ2FsbCBnZW5lcmF0ZShkaXJlY3Rpb24pXG4gKiAgICAgICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIG9yZGVyZWQgaW5kZXggY29uZmlnXG4gKiAgICAgICAgIGVuZFxuICogICAgICAgZW5kXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICpcbiAqICAgZ2VuZXJhdGVJbmRleGVzLS0+PkNhbGxlcjogQXJyYXkgb2YgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbik6IFR5cGVPUk1RdWVyeVtdIHtcbiAgY29uc3QgdGFibGVOYW1lID0gZ2VuZXJhdGVJbmRleE5hbWUoW1R5cGVPUk1LZXlzLlRBQkxFXSk7XG4gIGNvbnN0IGluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVPUk1RdWVyeT4gPSB7fTtcbiAgaW5kZXhlc1t0YWJsZU5hbWVdID0ge1xuICAgIHF1ZXJ5OiBgYCxcbiAgICB2YWx1ZXM6IFtdLFxuICB9O1xuXG4gIG1vZGVscy5mb3JFYWNoKChtKSA9PiB7XG4gICAgY29uc3QgaW5kOiBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPiA9IFJlcG9zaXRvcnkuaW5kZXhlcyhtKTtcbiAgICBPYmplY3QuZW50cmllcyhpbmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgayA9IE9iamVjdC5rZXlzKHZhbHVlKVswXTtcblxuICAgICAgbGV0IHsgY29tcG9zaXRpb25zIH0gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobSk7XG4gICAgICBjb21wb3NpdGlvbnMgPSBjb21wb3NpdGlvbnMgfHwgW107XG5cbiAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlKCkge1xuICAgICAgICBjb25zdCBuYW1lID0gW2tleSwgLi4uKGNvbXBvc2l0aW9ucyBhcyBbXSksIFBlcnNpc3RlbmNlS2V5cy5JTkRFWF0uam9pbihcbiAgICAgICAgICBEZWZhdWx0U2VwYXJhdG9yXG4gICAgICAgICk7XG5cbiAgICAgICAgaW5kZXhlc1tuYW1lXSA9IHtcbiAgICAgICAgICBxdWVyeTogYENSRUFURSBJTkRFWCAkMSBPTiAkMiAoJDMpO2AsXG4gICAgICAgICAgdmFsdWVzOiBbbmFtZSwgdGFibGVOYW1lLCBrZXldLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBnZW5lcmF0ZSgpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoaW5kZXhlcyk7XG59XG4iLCJpbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgSVJlcG9zaXRvcnksXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIsIFJlcG9zaXRvcnkgYXMgTmF0aXZlUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmZvcmNlRGJEZWNvcmF0b3JzUmVjdXJzaXZlPFxuICBNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPixcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KFxuICByZXBvOiBSLFxuICBjb250ZXh0OiBDLFxuICBtb2RlbDogTSxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHByZWZpeDogc3RyaW5nLFxuICBvbGRNb2RlbD86IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIFIsIFYsIEYsIEM+KFxuICAgIHJlcG8sXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBvcGVyYXRpb24sXG4gICAgcHJlZml4LFxuICAgIG9sZE1vZGVsXG4gICk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJMb29wPE4gZXh0ZW5kcyBNb2RlbD4obTogTiwgb2xkTW9kZWw/OiBOKSB7XG4gICAgY29uc3QgciA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobS5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxOPik7XG4gICAgYXdhaXQgZW5mb3JjZURiRGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICAgIHIsXG4gICAgICBjb250ZXh0LFxuICAgICAgbSxcbiAgICAgICFvbGRNb2RlbCAmJiBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICAgID8gT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgICAgOiBvcGVyYXRpb24sXG4gICAgICBwcmVmaXgsXG4gICAgICBvbGRNb2RlbFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbCkpIHtcbiAgICBpZiAoXG4gICAgICBNb2RlbC5pc1Byb3BlcnR5TW9kZWwobW9kZWwsIGtleSkgJiZcbiAgICAgIHR5cGVvZiBtb2RlbFtrZXkgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgYXdhaXQgaW5uZXJMb29wKFxuICAgICAgICBtb2RlbFtrZXkgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSBhcyBhbnksXG4gICAgICAgIG9sZE1vZGVsID8gKG9sZE1vZGVsW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2xkTW9kZWxdIGFzIGFueSkgOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZGVjID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0cnVlLFxuICAgICAgdHJ1ZVxuICAgICkuZGVjb3JhdG9ycy5maW5kKChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCk7XG5cbiAgICBpZiAoXG4gICAgICAhZGVjIHx8XG4gICAgICAhbW9kZWxba2V5IGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHxcbiAgICAgICFBcnJheS5pc0FycmF5KG1vZGVsW2tleSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAobW9kZWxba2V5IGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gYXMgTW9kZWxbXSkubWFwKChtLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBpbm5lckxvb3AoXG4gICAgICAgICAgbSxcbiAgICAgICAgICBvbGRNb2RlbCAmJiBvbGRNb2RlbFtrZXkgYXMga2V5b2YgdHlwZW9mIG9sZE1vZGVsXVxuICAgICAgICAgICAgPyAob2xkTW9kZWxba2V5IGFzIGtleW9mIHR5cGVvZiBvbGRNb2RlbF0gYXMgYW55KVtpXVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zIGZvciBhIGdpdmVuIE1vZGVsIHVzaW5nIHRoZSBUeXBlT1JNQWRhcHRlciwgaW5jbHVkaW5nIGJ1bGsgb3BlcmF0aW9ucyBhbmQgcXVlcnkgYnVpbGRlciBhY2Nlc3Mgd2hpbGUgcHJlc2VydmluZyBEZWNhZi50cyByZXBvc2l0b3J5IHNlbWFudGljcy5cbiAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsIHRoYXQgdGhpcyByZXBvc2l0b3J5IHdpbGwgbWFuYWdlLlxuICogQHBhcmFtIHtBZGFwdGVyPERhdGFTb3VyY2VPcHRpb25zLCBhbnksIFR5cGVPUk1RdWVyeSwgVHlwZU9STUZsYWdzLCBDb250ZXh0PFR5cGVPUk1GbGFncz4+fSBhZGFwdGVyIFRoZSBhZGFwdGVyIHVzZWQgdG8gZXhlY3V0ZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGhlIE1vZGVsIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGJhc2UgUmVwb3NpdG9yeS5cbiAqIEBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeVxuICogY29uc3QgcmVwbyA9IG5ldyBUeXBlT1JNUmVwb3NpdG9yeTxVc2VyPihhZGFwdGVyLCBVc2VyKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGNyZWF0ZWQuaWQpO1xuICpcbiAqIC8vIEJ1bGsgY3JlYXRlXG4gKiBhd2FpdCByZXBvLmNyZWF0ZUFsbChbbmV3IFVzZXIoeyBuYW1lOiBcIkFcIiB9KSwgbmV3IFVzZXIoeyBuYW1lOiBcIkJcIiB9KV0pO1xuICpcbiAqIC8vIFVzaW5nIHRoZSBxdWVyeSBidWlsZGVyXG4gKiBjb25zdCBxYiA9IHJlcG8ucXVlcnlCdWlsZGVyKCk7XG4gKiBjb25zdCByb3dzID0gYXdhaXQgcWIud2hlcmUoXCJuYW1lID0gOm5hbWVcIiwgeyBuYW1lOiBcIkFsaWNlXCIgfSkuZ2V0TWFueSgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBUeXBlT1JNL0RhdGFTb3VyY2VcbiAqXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHByZXBhcmUobW9kZWwsIHBrKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH1cbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCAuLi5hcmdzKVxuICogICBBZGFwdGVyLT4+REI6IElOU0VSVCAuLi5cbiAqICAgREItLT4+QWRhcHRlcjogcm93XG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcm93XG4gKiAgIFJlcG8tPj5BZGFwdGVyOiByZXZlcnQocm93LCBjbGF6eiwgcGssIGlkKVxuICogICBBZGFwdGVyLS0+PlJlcG86IG1vZGVsXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdXNlcyhUeXBlT1JNRmxhdm91cilcbmV4cG9ydCBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+IGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgTSxcbiAgVHlwZU9STVF1ZXJ5PE0sIGFueT4sXG4gIEFkYXB0ZXI8XG4gICAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgYW55LFxuICAgIFR5cGVPUk1RdWVyeSxcbiAgICBUeXBlT1JNRmxhZ3MsXG4gICAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4gID4sXG4gIFR5cGVPUk1GbGFncyxcbiAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogQWRhcHRlcjxcbiAgICAgIERhdGFTb3VyY2VPcHRpb25zLFxuICAgICAgYW55LFxuICAgICAgVHlwZU9STVF1ZXJ5LFxuICAgICAgVHlwZU9STUZsYWdzLFxuICAgICAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4gICAgPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgVHlwZU9STSBxdWVyeSBidWlsZGVyIGZvciB0aGUgcmVwb3NpdG9yeSBlbnRpdHkuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBTZWxlY3RRdWVyeUJ1aWxkZXIgYm91bmQgdG8gdGhpcyByZXBvc2l0b3J5J3MgZW50aXR5IGZvciBhZHZhbmNlZCBxdWVyeWluZy5cbiAgICogQHJldHVybiB7UXVlcnlCdWlsZGVyPE0+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCk6IFF1ZXJ5QnVpbGRlcjxNPiB7XG4gICAgY29uc3QgcmVwbyA9ICh0aGlzLmFkYXB0ZXIgYXMgYW55KS5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkoXG4gICAgICB0aGlzLmNsYXNzW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhc3NdXG4gICAgKTtcbiAgICByZXR1cm4gcmVwby5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIFR5cGVPUk0gUmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIGVudGl0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIFJlcG9zaXRvcnkgYm91bmQgdG8gdGhpcyByZXBvc2l0b3J5J3MgZW50aXR5IGZvciBuYXRpdmUgZnVuY3Rpb25hbGl0eS5cbiAgICogQHJldHVybiB7TmF0aXZlUmVwbzxNPn0gQSBUeXBlT1JNIFJlcG9zaXRvcnkgaW5zdGFuY2UuXG4gICAqL1xuICB0eXBlb3JtUmVwbygpOiBOYXRpdmVSZXBvPE0+IHtcbiAgICByZXR1cm4gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIHRoaXMuY2xhc3NbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGFzc11cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxcbiAgICAgIE0sXG4gICAgICBDb250ZXh0PFR5cGVPUk1GbGFncz4sXG4gICAgICBUeXBlT1JNRmxhZ3NcbiAgICA+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURiRGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuZCBwZXJzaXN0cyBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwsIGRlbGVnYXRlcyBpbnNlcnRpb24gdG8gdGhlIGFkYXB0ZXIsIGFuZCByZWh5ZHJhdGVzIHRoZSBwZXJzaXN0ZWQgc3RhdGUgYmFjayBpbnRvIGEgTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhc3NdLFxuICAgICAgaWQsXG4gICAgICBtb2RlbCBhcyBhbnksXG4gICAgICB0aGlzLnBrLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgbGV0IGM6IENvbnRleHQ8VHlwZU9STUZsYWdzPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIGMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgQ29udGV4dDxUeXBlT1JNRmxhZ3M+O1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KFxuICAgICAgcmVjb3JkLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIHRoaXMucGssXG4gICAgICBpZCxcbiAgICAgIGMgJiYgYy5nZXQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSA/IHRyYW5zaWVudCA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQoXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZ1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlRGJEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIHVwZGF0ZSB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCxcbiAgICAgIHRoaXMucGssXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkLCB0cmFuc2llbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhbmQgcHJlcGFyZXMgbW9kZWxzIGZvciBidWxrIGNyZWF0aW9uLlxuICAgKiBAc3VtbWFyeSBBcHBsaWVzIGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9ucyBhbmQgcmV0dXJucyB0cmFuc2Zvcm1lZCBtb2RlbHMgd2l0aCBjb250ZXh0IGFyZ3MgZm9yIGNyZWF0ZUFsbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGJlIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEYkRlY29yYXRvcnNSZWN1cnNpdmUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRCBhcyBUeXBlT1JNRGlzcGF0Y2hcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgVHlwZU9STUV2ZW50U3Vic2NyaWJlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICogICBELT4+RFM6IG9ic2VydmUoYWRhcHRlciwgb3B0aW9ucylcbiAqICAgRFMtPj5EOiBpbml0aWFsaXplKClcbiAqICAgRC0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFMpXG4gKiAgIFMtLT4+RDogZW1pdHMgaW5zZXJ0L3VwZGF0ZS9yZW1vdmVcbiAqICAgRC0+Pk86IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaCB7XG4gIHByaXZhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlPzogc3RyaW5nO1xuICBwcml2YXRlIGF0dGVtcHRDb3VudGVyOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGltZW91dCA9IDUwMDApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgVHlwZU9STSBub3RpZmljYXRpb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGNoYW5nZSBub3RpZmljYXRpb25zICh0cmFuc2xhdGVkIGZyb20gVHlwZU9STSBldmVudHMpIGFuZCBub3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgcmVjb3JkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWRzIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIFBvc3RncmVTUUxEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAgICogICBOb3RlIG92ZXIgRDogUmVjZWl2ZSBub3RpZmljYXRpb24gZnJvbSBQb3N0Z3JlU1FMXG4gICAqICAgRC0+PkQ6IFBhcnNlIG5vdGlmaWNhdGlvbiBwYXlsb2FkXG4gICAqICAgRC0+PkQ6IEV4dHJhY3QgdGFibGUsIG9wZXJhdGlvbiwgYW5kIGlkc1xuICAgKiAgIEQtPj5POiB1cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKVxuICAgKiAgIEQtPj5EOiBVcGRhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlXG4gICAqICAgRC0+Pkw6IExvZyBzdWNjZXNzZnVsIGRpc3BhdGNoXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBpZHM6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIpO1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3RpZnkgb2JzZXJ2ZXJzXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpO1xuICAgICAgdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBsb2cudmVyYm9zZShgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7b3BlcmF0aW9ufSBmb3IgJHt0YWJsZX1gKTtcbiAgICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIG5vdGlmaWNhdGlvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoZXIgYW5kIHN1YnNjcmliZXMgdG8gVHlwZU9STSBub3RpZmljYXRpb25zLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgb24gdGhlIERhdGFTb3VyY2UgYW5kIGxvZ3MgdGhlIHN1YnNjcmlwdGlvbiBsaWZlY3ljbGUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBUeXBlT1JNRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIHBhcnRpY2lwYW50IERTIGFzIFR5cGVPUk0gRGF0YVNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgRC0+PlM6IENhbGwgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAqICAgUy0+PlM6IENoZWNrIGFkYXB0ZXIgYW5kIG5hdGl2ZVxuICAgKiAgIGFsdCBObyBhZGFwdGVyIG9yIG5hdGl2ZVxuICAgKiAgICAgUy0tPj5TOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUy0+PkRTOiBpbml0aWFsaXplKClcbiAgICogICBTLT4+RFM6IHN1YnNjcmliZXJzLnB1c2goVHlwZU9STUV2ZW50U3Vic2NyaWJlcilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgRFMtLT4+UzogU3Vic2NyaXB0aW9uIGVzdGFibGlzaGVkXG4gICAqICAgICBTLS0+PkQ6IFByb21pc2UgcmVzb2x2ZXNcbiAgICogICAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBzdWJzY3JpcHRpb25cbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEUy0tPj5TOiBFcnJvclxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlamVjdHNcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHN1YnNjcmliZVRvVHlwZU9STSh0aGlzOiBUeXBlT1JNRGlzcGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlci9uYXRpdmUgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyLmNsaWVudC5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgIHRoaXMuYWRhcHRlci5jbGllbnQuc3Vic2NyaWJlcnMucHVzaChcbiAgICAgICAgICBuZXcgVHlwZU9STUV2ZW50U3Vic2NyaWJlcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIuYmluZCh0aGlzKSlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAgICAuY2FsbCh0aGlzKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWJzY3JpYmVkIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9uc2ApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHN1YnNjcmliZSB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnM6ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBpZHM6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFdoZW4gbm8gYWRhcHRlciBpcyBvYnNlcnZlZCAoZS5nLiwgaW4gdW5pdCB0ZXN0cyBpbnZva2luZyB0aGUgaGFuZGxlciBkaXJlY3RseSksXG4gICAgLy8gc2tpcCBub3RpZnlpbmcgb2JzZXJ2ZXJzIGluc3RlYWQgb2YgdGhyb3dpbmcsIHNvIHRoZSBkaXNwYXRjaGVyIGNhbiBwcm9jZWVkLlxuICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgc2VtYW50aWNzIG9mIFwiYmVzdCBlZmZvcnRcIiBub3RpZmljYXRpb25zLlxuICAgIC8vIERlbGVnYXRlIHRvIGJhc2UgaW1wbGVtZW50YXRpb24gd2hlbiBhbiBhZGFwdGVyIGlzIHByZXNlbnQuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgb2JzZXJ2ZXIgdXBkYXRlIGZvciAke3RhYmxlfToke29wZXJhdGlvbn1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbHVtbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvQ29sdW1uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0luZGV4TWV0YWRhdGFBcmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW10sXG4gIGluZGV4ZXM/OiBJbmRleE1ldGFkYXRhQXJnc1tdXG4pIHtcbiAgY29uc3QgY29scyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgIChjOiBDb2x1bW5NZXRhZGF0YUFyZ3MpID0+XG4gICAgICBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eVxuICApO1xuXG4gIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgIChjOiBSZWxhdGlvbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgaWYgKGluZGV4ZXMpIHtcbiAgICBjb25zdCBpbmR4ID0gaW5kZXhlcy5maWx0ZXIoXG4gICAgICAoYzogSW5kZXhNZXRhZGF0YUFyZ3MpID0+XG4gICAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgKGMuY29sdW1ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcGVydHkpXG4gICAgKTtcbiAgICBpbmR4LmZvckVhY2goKGkpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oaSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpc1xuICogZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRvIG1hcmsgYSBjbGFzcyBwcm9wZXJ0eSBhcyBhIGRhdGFiYXNlIGNvbHVtbi5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIG11bHRpcGxlIG92ZXJsb2FkcyB0byBkZWZpbmUgY29sdW1uIG1ldGFkYXRhIHN1Y2ggYXMgdHlwZSwgbGVuZ3RoLCBwcmVjaXNpb24sIHdpZHRoLCBlbnVtLCBzZXQsIGhzdG9yZSwgYW5kIGVtYmVkZGVkIHR5cGVzLiBBZ2dyZWdhdGVzIHdpdGggZXhpc3RpbmcgbWV0YWRhdGEgdG8gYXZvaWQgZHVwbGljYXRlcyBhbmQgZGVsZWdhdGVzIHRvIFR5cGVPUk0gbWV0YWRhdGEgc3RvcmFnZS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbigpOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihvcHRpb25zOiBDb2x1bW5PcHRpb25zKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNpbXBsZUNvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogU3BhdGlhbENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgU3BhdGlhbENvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoTGVuZ3RoQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge0NvbHVtblR5cGV9IHR5cGUgVHlwZSBvZiB0aGUgY29sdW1uLlxuICogQHBhcmFtIHtDb2x1bW5XaXRoV2lkdGhPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aFdpZHRoQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5XaXRoV2lkdGhPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Q29sdW1uVHlwZX0gdHlwZSBUeXBlIG9mIHRoZSBjb2x1bW4uXG4gKiBAcGFyYW0ge0NvbHVtbk51bWVyaWNPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aFByZWNpc2lvbkNvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfSB0eXBlIFR5cGUgb2YgdGhlIGNvbHVtbi5cbiAqIEBwYXJhbSB7Q29sdW1uRW51bU9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIGZvciB0aGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImVudW1cIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge0NvbHVtblR5cGV9IHR5cGUgVHlwZSBvZiB0aGUgY29sdW1uLlxuICogQHBhcmFtIHtDb2x1bW5FbnVtT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwic2ltcGxlLWVudW1cIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge0NvbHVtblR5cGV9IHR5cGUgVHlwZSBvZiB0aGUgY29sdW1uLlxuICogQHBhcmFtIHtDb2x1bW5FbnVtT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwic2V0XCIsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uRW51bU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfSB0eXBlIFR5cGUgb2YgdGhlIGNvbHVtbi5cbiAqIEBwYXJhbSB7Q29sdW1uSHN0b3JlT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBjb2x1bW4uXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oYW55KTogRnVuY3Rpb259IHR5cGUgVHlwZSBvZiB0aGUgZW1iZWRkZWQuXG4gKiBAcGFyYW0ge0NvbHVtbkVtYmVkZGVkT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgZm9yIHRoZSBlbWJlZGRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfENvbHVtbk9wdGlvbnN8ZnVuY3Rpb24oYW55KTogRnVuY3Rpb259IFt0eXBlT3JPcHRpb25zXSBFaXRoZXIgYW4gZXhwbGljaXQgY29sdW1uIHR5cGUgb3IgdGhlIGNvbHVtbiBvcHRpb25zLlxuICogQHBhcmFtIHtDb2x1bW5PcHRpb25zfSBbb3B0aW9uc10gVGhlIGNvbHVtbiBvcHRpb25zIHdoZW4gYSB0eXBlIGlzIHNwZWNpZmllZC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZU9yT3B0aW9ucz86IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgfCAoKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uKVxuICAgIHwgQ29sdW1uVHlwZVxuICAgIHwgKENvbHVtbk9wdGlvbnMgJiBDb2x1bW5FbWJlZGRlZE9wdGlvbnMpLFxuICBvcHRpb25zPzogQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogb2JqZWN0LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgIHR5cGUgPSA8Q29sdW1uVHlwZT50eXBlT3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAodHlwZU9yT3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IDxDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnM7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucy50eXBlO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBDb2x1bW5PcHRpb25zO1xuXG4gICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgIGxldCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpXG4gICAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgICB0eXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZTtcbiAgICBjb25zdCBmb3JjZVR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlRZUEUpLFxuICAgICAgb2JqZWN0LFxuICAgICAgcHJvcGVydHlOYW1lXG4gICAgKTtcbiAgICBpZiAoZm9yY2VUeXBlcykge1xuICAgICAgY29uc3QgeyBjdXN0b21UeXBlcyB9ID0gZm9yY2VUeXBlcztcbiAgICAgIGNvbnN0IHByaW1hcnlUeXBlID0gQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcylcbiAgICAgICAgPyBjdXN0b21UeXBlc1swXVxuICAgICAgICA6IGN1c3RvbVR5cGVzO1xuICAgICAgbGV0IGRiVHlwZTogYW55O1xuICAgICAgc3dpdGNoIChwcmltYXJ5VHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICBkYlR5cGUgPSBTdHJpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICBkYlR5cGUgPSBOdW1iZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICBkYlR5cGUgPSBCaWdJbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgZGJUeXBlID0gRGF0ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkYlR5cGUgPSBwcmltYXJ5VHlwZTtcbiAgICAgIH1cblxuICAgICAgdHlwZSA9IGRiVHlwZTtcbiAgICAgIHJlZmxlY3RNZXRhZGF0YVR5cGUgPSBkYlR5cGU7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIHNwZWNpZnkgSFNUT1JFIHR5cGUgaWYgY29sdW1uIGlzIEhTVE9SRVxuICAgIGlmIChvcHRpb25zLnR5cGUgPT09IFwiaHN0b3JlXCIgJiYgIW9wdGlvbnMuaHN0b3JlVHlwZSlcbiAgICAgIG9wdGlvbnMuaHN0b3JlVHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGUgPT09IE9iamVjdCA/IFwib2JqZWN0XCIgOiBcInN0cmluZ1wiO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGFuIGVtYmVkZGVkXG4gICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW1iZWRkZWRzLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIGlzQXJyYXk6IHJlZmxlY3RNZXRhZGF0YVR5cGUgPT09IEFycmF5IHx8IG9wdGlvbnMuYXJyYXkgPT09IHRydWUsXG4gICAgICAgIHByZWZpeDogb3B0aW9ucy5wcmVmaXggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZml4IDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIHR5cGU6IHR5cGVPck9wdGlvbnMgYXMgKHR5cGU/OiBhbnkpID0+IEZ1bmN0aW9uLFxuICAgICAgfSBhcyBFbWJlZGRlZE1ldGFkYXRhQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGEgcmVndWxhciBjb2x1bW5cblxuICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICAgIGlmICghb3B0aW9ucy50eXBlKVxuICAgICAgICB0aHJvdyBuZXcgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcblxuICAgICAgLy8gY3JlYXRlIHVuaXF1ZVxuICAgICAgaWYgKG9wdGlvbnMudW5pcXVlID09PSB0cnVlKVxuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkudW5pcXVlcy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBjb2x1bW5zOiBbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBcInJlZ3VsYXJcIixcbiAgICAgICAgbWV0YWRhdGEucmVsYXRpb25zLFxuICAgICAgICBvcHRpb25zLnVuaXF1ZSA/IG1ldGFkYXRhLmluZGljZXMgOiB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgc3RyYXRlZ3k6XG4gICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgICA6IFwiaW5jcmVtZW50XCIsXG4gICAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRvIG1hcmsgYSBwcm9wZXJ0eSBhcyBhbiBhdXRvLW1hbmFnZWQgdXBkYXRlIHRpbWVzdGFtcCBjb2x1bW4uXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBjb2x1bW4gdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgZGF0YWJhc2UvT1JNIHdoZW5ldmVyIHRoZSByb3cgaXMgbW9kaWZpZWQuIFdyYXBzIFR5cGVPUk0gbWV0YWRhdGEgcmVnaXN0cmF0aW9uIHRvIGFnZ3JlZ2F0ZSB3aXRoIGV4aXN0aW5nIGNvbHVtbiBtZXRhZGF0YSB3aGVuIHByZXNlbnQuXG4gKiBAcGFyYW0ge0NvbHVtbk9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBUeXBlT1JNIGNvbHVtbiBvcHRpb25zLlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgb24gYW4gZW50aXR5IGZpZWxkLlxuICogQGZ1bmN0aW9uIFVwZGF0ZURhdGVDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IERlY29yIGFzIFVwZGF0ZURhdGVDb2x1bW5cbiAqICAgcGFydGljaXBhbnQgTWV0YSBhcyBUeXBlT1JNIE1ldGFkYXRhXG4gKiAgIERldi0+PkRlY29yOiBAVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zKVxuICogICBEZWNvci0+PkRldjogcmV0dXJucyBQcm9wZXJ0eURlY29yYXRvclxuICogICBEZXYtPj5EZWNvcjogYXBwbHkgb24gdGFyZ2V0IHByb3BlcnR5XG4gKiAgIERlY29yLT4+TWV0YTogYWdncmVnYXRlT3JOZXdDb2x1bW4oLi4uLCBcInVwZGF0ZURhdGVcIiwgLi4uKVxuICogICBNZXRhLS0+PkRlY29yOiBjb2x1bW4gbWV0YWRhdGEgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJ1cGRhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgcHJvcGVydHkgYXMgYW4gYXV0by1tYW5hZ2VkIGNyZWF0aW9uIHRpbWVzdGFtcCBjb2x1bW4uXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBjb2x1bW4gdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBkYXRhYmFzZS9PUk0gd2hlbiB0aGUgcm93IGlzIGZpcnN0IGNyZWF0ZWQuIFdyYXBzIFR5cGVPUk0gbWV0YWRhdGEgcmVnaXN0cmF0aW9uIHRvIGFnZ3JlZ2F0ZSB3aXRoIGV4aXN0aW5nIGNvbHVtbiBtZXRhZGF0YSB3aGVuIHByZXNlbnQuXG4gKiBAcGFyYW0ge0NvbHVtbk9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBUeXBlT1JNIGNvbHVtbiBvcHRpb25zLlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgb24gYW4gZW50aXR5IGZpZWxkLlxuICogQGZ1bmN0aW9uIENyZWF0ZURhdGVDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IERlY29yIGFzIENyZWF0ZURhdGVDb2x1bW5cbiAqICAgcGFydGljaXBhbnQgTWV0YSBhcyBUeXBlT1JNIE1ldGFkYXRhXG4gKiAgIERldi0+PkRlY29yOiBAQ3JlYXRlRGF0ZUNvbHVtbihvcHRpb25zKVxuICogICBEZWNvci0+PkRldjogcmV0dXJucyBQcm9wZXJ0eURlY29yYXRvclxuICogICBEZXYtPj5EZWNvcjogYXBwbHkgb24gdGFyZ2V0IHByb3BlcnR5XG4gKiAgIERlY29yLT4+TWV0YTogYWdncmVnYXRlT3JOZXdDb2x1bW4oLi4uLCBcImNyZWF0ZURhdGVcIiwgLi4uKVxuICogICBNZXRhLS0+PkRlY29yOiBjb2x1bW4gbWV0YWRhdGEgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJjcmVhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdCh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3Qge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICAgKiBXZSBjYW5ub3QgdXNlIGluc3RhbmNlb2YgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgd2hlbiBydW5uaW5nIG9uIGRpZmZlcmVudCBjb250ZXh0cy5cbiAgICogQW5kIHdlIGRvbid0IHNpbXBseSB1c2UgdHlwZW9mIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09IFwib2JqZWN0XCIuXG4gICAqL1xuICBzdGF0aWMgaXNPYmplY3RXaXRoTmFtZSh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3QgJiB7IG5hbWU6IHN0cmluZyB9IHtcbiAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UxIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMiBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTMgVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFYsIFc+KFxuICAgIHRhcmdldDogVCxcbiAgICBzb3VyY2UxOiBVLFxuICAgIHNvdXJjZTI6IFYsXG4gICAgc291cmNlMzogV1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2VzIE9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgYXNzaWduKHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UpKSB7XG4gICAgICAgICh0YXJnZXQgYXMgYW55KVtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9cbiAgLy8gLyoqXG4gIC8vICAqIENvbnZlcnRzIE1peGVkTGlzdDxUPiB0byBzdHJpY3RseSBhbiBhcnJheSBvZiBpdHMgVCBpdGVtcy5cbiAgLy8gICovXG4gIC8vIHN0YXRpYyBtaXhlZExpc3RUb0FycmF5PFQ+KGxpc3Q6IE1peGVkTGlzdDxUPik6IFRbXSB7XG4gIC8vICAgaWYgKGxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxpc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgLy8gICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoXG4gIC8vICAgICAgIChrZXkpID0+IChsaXN0IGFzIHsgW2tleTogc3RyaW5nXTogVCB9KVtrZXldXG4gIC8vICAgICApO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICByZXR1cm4gbGlzdDtcbiAgLy8gICB9XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7IFJlbGF0aW9uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSwgT2JqZWN0VHlwZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGV4dHJhY3RGb3JSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmcgfCBmdW5jdGlvbihhbnkpOiBPYmplY3RUeXBlPFQ+fSB0eXBlRnVuY3Rpb25PclRhcmdldFxuICogQHBhcmFtIHtzdHJpbmcgfCBmdW5jdGlvbihUKTogYW55fSBpbnZlcnNlU2lkZU9yT3B0aW9uc1xuICogQHBhcmFtIHtSZWxhdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZU9yT3B0aW9ucz86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpIHwgUmVsYXRpb25PcHRpb25zLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIG5vdyB0cnkgdG8gZGV0ZXJtaW5lIGl0IGl0cyBsYXp5IHJlbGF0aW9uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tb25lXCIsXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIEEgb25lLXRvLW1hbnkgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsXG4gKiBidXQgRW50aXR5MiBoYXMgb25seSBvbmUgRW50aXR5MS4gRW50aXR5MiBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2YgRW50aXR5MSBvbiBpdHNcbiAqIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oYW55KTogT2JqZWN0VHlwZTxUPn0gdHlwZUZ1bmN0aW9uT3JUYXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oVCk6IGFueX0gaW52ZXJzZVNpZGVcbiAqIEBwYXJhbSB7UmVsYXRpb25PcHRpb25zfSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBOb3cgdHJ5IHRvIGRldGVybWluZSBpZiBpdCBpcyBhIGxhenkgcmVsYXRpb24uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tbWFueVwiLFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBBIG1hbnktdG8tb25lIHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIEVudGl0eTIsIGJ1dFxuICogRW50aXR5MiBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gRW50aXR5MSBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2ZcbiAqIEVudGl0eTIgb24gaXRzIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oYW55KTogT2JqZWN0VHlwZTxUPn0gdHlwZUZ1bmN0aW9uT3JUYXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgZnVuY3Rpb24oVCk6IGFueX0gaW52ZXJzZVNpZGVPck9wdGlvbnNcbiAqIEBwYXJhbSB7UmVsYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gTm9ybWFsaXplIHBhcmFtZXRlcnMuXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW9uZVwiLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogTWFueS10by1tYW55IGlzIGEgdHlwZSBvZiByZWxhdGlvbnNoaXAgd2hlbiBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLCBhbmQgRW50aXR5MiBjYW4gaGF2ZVxuICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIFRvIGFjaGlldmUgaXQsIHRoaXMgdHlwZSBvZiByZWxhdGlvbiBjcmVhdGVzIGEganVuY3Rpb24gdGFibGUsIHdoZXJlIGl0IHN0b3JhZ2VcbiAqIGVudGl0eTEgYW5kIGVudGl0eTIgaWRzLiBUaGlzIGlzIG93bmVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKGFueSk6IE9iamVjdFR5cGU8VD59IHR5cGVGdW5jdGlvbk9yVGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZyB8IGZ1bmN0aW9uKFQpOiBhbnl9IGludmVyc2VTaWRlT3JPcHRpb25zXG4gKiBAcGFyYW0ge1JlbGF0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBsZXQgaW52ZXJzZVNpZGVQcm9wZXJ0eTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSk7XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChpbnZlcnNlU2lkZU9yT3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0gPFJlbGF0aW9uT3B0aW9ucz5pbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBpbnZlcnNlU2lkZVByb3BlcnR5ID0gaW52ZXJzZVNpZGVPck9wdGlvbnMgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBub3cgdHJ5IHRvIGRldGVybWluZSBpdCBpdHMgbGF6eSByZWxhdGlvblxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW1hbnlcIixcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIFJlbGF0aW9uTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgcHJvcGVydHkgYXMgYSBwcmltYXJ5IGtleSB3aXRoIGdlbmVyYXRlZCB2YWx1ZS5cbiAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhIHByaW1hcnkgY29sdW1uIHRoYXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGRhdGFiYXNlL09STS4gT3ZlcmxvYWRzIGFsbG93IHNlbGVjdGluZyB0aGUgZ2VuZXJhdGlvbiBzdHJhdGVneSBhbmQgb3B0aW9ucy5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBvcHRpb25zOiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInV1aWRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInJvd2lkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaWRlbnRpdHlcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdG8gbWFyayBhIHByb3BlcnR5IGFzIGEgZ2VuZXJhdGVkIHByaW1hcnkga2V5IHdpdGggc3BlY2lmaWMgc3RyYXRlZ3kuXG4gKiBAc3VtbWFyeSBOb3JtYWxpemVzIG92ZXJsb2FkcywgaW5mZXJzIGNvbHVtbiB0eXBlIGZyb20gc3RyYXRlZ3kgd2hlbiBhYnNlbnQsIHNldHMgcHJpbWFyeSBmbGFnLCBhZ2dyZWdhdGVzIGNvbHVtbiBtZXRhZGF0YSwgYW5kIHJlZ2lzdGVycyBnZW5lcmF0aW9uIHN0cmF0ZWd5IGluIFR5cGVPUk0gbWV0YWRhdGEuXG4gKiBAcGFyYW0geygnaW5jcmVtZW50J3wndXVpZCd8J3Jvd2lkJ3wnaWRlbnRpdHknfFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc3xQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnN8UHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyl9IFtzdHJhdGVneU9yT3B0aW9uc10gVGhlIGdlbmVyYXRpb24gc3RyYXRlZ3kgb3IgYW4gb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc3xQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnN8UHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc30gW21heWJlT3B0aW9uc10gT3B0aW9ucyB0byBjb21wbGVtZW50IHRoZSBjaG9zZW4gc3RyYXRlZ3kuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdG8gYmUgYXBwbGllZCBvbiBhbiBlbnRpdHkgZmllbGQuXG4gKiBAZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtblxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBEZXYgYXMgRGV2ZWxvcGVyIENvZGVcbiAqICAgcGFydGljaXBhbnQgRGVjb3IgYXMgUHJpbWFyeUdlbmVyYXRlZENvbHVtblxuICogICBwYXJ0aWNpcGFudCBNZXRhIGFzIFR5cGVPUk0gTWV0YWRhdGFcbiAqICAgRGV2LT4+RGVjb3I6IEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHN0cmF0ZWd5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpXG4gKiAgIERlY29yLT4+RGV2OiByZXR1cm5zIFByb3BlcnR5RGVjb3JhdG9yXG4gKiAgIERldi0+PkRlY29yOiBhcHBseSBvbiB0YXJnZXQgcHJvcGVydHlcbiAqICAgRGVjb3ItPj5EZWNvcjogZGVyaXZlIG9wdGlvbnMsIGluZmVyIHR5cGUgYnkgc3RyYXRlZ3lcbiAqICAgRGVjb3ItPj5NZXRhOiBhZ2dyZWdhdGVPck5ld0NvbHVtbiguLi4pXG4gKiAgIERlY29yLT4+TWV0YTogZ2VuZXJhdGlvbnMucHVzaCh7IHN0cmF0ZWd5IH0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneU9yT3B0aW9ucz86XG4gICAgfCBcImluY3JlbWVudFwiXG4gICAgfCBcInV1aWRcIlxuICAgIHwgXCJyb3dpZFwiXG4gICAgfCBcImlkZW50aXR5XCJcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zLFxuICBtYXliZU9wdGlvbnM/OlxuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgY29uc3Qgb3B0aW9uczogQ29sdW1uT3B0aW9ucyA9IHt9O1xuICBsZXQgc3RyYXRlZ3k6IFwiaW5jcmVtZW50XCIgfCBcInV1aWRcIiB8IFwicm93aWRcIiB8IFwiaWRlbnRpdHlcIjtcbiAgaWYgKHN0cmF0ZWd5T3JPcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJhdGVneU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHN0cmF0ZWd5ID0gc3RyYXRlZ3lPck9wdGlvbnMgYXNcbiAgICAgICAgfCBcImluY3JlbWVudFwiXG4gICAgICAgIHwgXCJ1dWlkXCJcbiAgICAgICAgfCBcInJvd2lkXCJcbiAgICAgICAgfCBcImlkZW50aXR5XCI7XG5cbiAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qoc3RyYXRlZ3lPck9wdGlvbnMpKSB7XG4gICAgICBzdHJhdGVneSA9IFwiaW5jcmVtZW50XCI7XG4gICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHN0cmF0ZWd5T3JPcHRpb25zKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICB9XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChtYXliZU9wdGlvbnMpKSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIG1heWJlT3B0aW9ucyk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICAvLyBpZiBjb2x1bW4gdHlwZSBpcyBub3QgZXhwbGljaXRseSBzZXQgdGhlbiBkZXRlcm1pbmUgaXQgYmFzZWQgb24gZ2VuZXJhdGlvbiBzdHJhdGVneVxuICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIgfHwgc3RyYXRlZ3kgPT09IFwiaWRlbnRpdHlcIikge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBOdW1iZXI7XG4gICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInV1aWRcIikge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcInV1aWRcIjtcbiAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicm93aWRcIikge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcImludFwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4cGxpY2l0bHkgc2V0IGEgcHJpbWFyeSBhbmQgZ2VuZXJhdGVkIHRvIGNvbHVtbiBvcHRpb25zXG4gICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBcInJlZ3VsYXJcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG4gICAgLy8gcmVnaXN0ZXIgZ2VuZXJhdGVkIG1ldGFkYXRhIGFyZ3NcbiAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIENvbHVtbk9wdGlvbnMsXG4gIENvbHVtblR5cGUsXG4gIENvbHVtblR5cGVVbmRlZmluZWRFcnJvcixcbiAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSxcbiAgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvcixcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVkTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9HZW5lcmF0ZWRNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXNjcmliZXMgYWxsIHByaW1hcnkga2V5IGNvbHVtbidzIG9wdGlvbnMuXG4gKiBJZiBzcGVjaWZpZWQsIHRoZSBudWxsYWJsZSBmaWVsZCBtdXN0IGJlIHNldCB0byBmYWxzZS5cbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3B0aW9ucyBmb3IgYSBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAc3VtbWFyeSBFeHRlbmRzIFR5cGVPUk0gQ29sdW1uT3B0aW9ucyBlbmZvcmNpbmcgdGhhdCBwcmltYXJ5IGNvbHVtbnMgY2Fubm90IGJlIG51bGxhYmxlLlxuICogQHRlbXBsYXRlIFQgRXh0ZW5kcyBDb2x1bW5PcHRpb25zIHRvIGRlZmluZSBwcmltYXJ5LXNwZWNpZmljIG9wdGlvbnMuXG4gKiBAaW50ZXJmYWNlIFByaW1hcnlDb2x1bW5PcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCB0eXBlIFByaW1hcnlDb2x1bW5PcHRpb25zID0gQ29sdW1uT3B0aW9ucyAmIHsgbnVsbGFibGU/OiBmYWxzZSB9O1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdG8gbWFyayBhIHByb3BlcnR5IGFzIGEgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgbm9uLW51bGxhYmxlIGNvbHVtbiBhcyBQUklNQVJZIEtFWSBpbiB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4gU3VwcG9ydHMgb3B0aW9uYWwgdHlwZSBhbmQgZ2VuZXJhdGlvbiBzdHJhdGVnaWVzIHZpYSBDb2x1bW5PcHRpb25zLlxuICogQHBhcmFtIHtQcmltYXJ5Q29sdW1uT3B0aW9uc30gW29wdGlvbnNdIENvbHVtbiBvcHRpb25zIHdoZW4gbm8gZXhwbGljaXQgdHlwZSBpcyBwcm92aWRlZC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0byBiZSBhcHBsaWVkIG9uIGFuIGVudGl0eSBmaWVsZC5cbiAqIEBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgdHlwZT86IENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBQcmltYXJ5IGNvbHVtbnMgYWxzbyBjcmVhdGVzIGEgUFJJTUFSWSBLRVkgZm9yIHRoaXMgY29sdW1uIGluIGEgZGIuXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0byBtYXJrIGEgcHJvcGVydHkgYXMgYSBwcmltYXJ5IGtleSBjb2x1bW4gd2l0aCBvcHRpb25hbCBleHBsaWNpdCB0eXBlLlxuICogQHN1bW1hcnkgTm9ybWFsaXplcyBwYXJhbWV0ZXJzLCBlbmZvcmNlcyBub24tbnVsbGFiaWxpdHksIHNldHMgcHJpbWFyeSBmbGFnLCBhZ2dyZWdhdGVzIGNvbHVtbiBtZXRhZGF0YSwgYW5kIHJlZ2lzdGVycyBnZW5lcmF0aW9uIHN0cmF0ZWd5IHdoZW4gc3BlY2lmaWVkLlxuICogQHBhcmFtIHtDb2x1bW5UeXBlfFByaW1hcnlDb2x1bW5PcHRpb25zfSBbdHlwZU9yT3B0aW9uc10gRWl0aGVyIGFuIGV4cGxpY2l0IGNvbHVtbiB0eXBlIG9yIHRoZSBjb2x1bW4gb3B0aW9ucy5cbiAqIEBwYXJhbSB7UHJpbWFyeUNvbHVtbk9wdGlvbnN9IFtvcHRpb25zXSBUaGUgY29sdW1uIG9wdGlvbnMgd2hlbiBhIHR5cGUgaXMgc3BlY2lmaWVkLlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRvIGJlIGFwcGxpZWQgb24gYW4gZW50aXR5IGZpZWxkLlxuICogQGZ1bmN0aW9uIFByaW1hcnlDb2x1bW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IERlY29yIGFzIFByaW1hcnlDb2x1bW5cbiAqICAgcGFydGljaXBhbnQgTWV0YSBhcyBUeXBlT1JNIE1ldGFkYXRhXG4gKiAgIERldi0+PkRlY29yOiBAUHJpbWFyeUNvbHVtbih0eXBlT3JPcHRpb25zLCBvcHRpb25zKVxuICogICBEZWNvci0+PkRldjogcmV0dXJucyBQcm9wZXJ0eURlY29yYXRvclxuICogICBEZXYtPj5EZWNvcjogYXBwbHkgb24gdGFyZ2V0IHByb3BlcnR5XG4gKiAgIERlY29yLT4+RGVjb3I6IG5vcm1hbGl6ZSBwYXJhbXMsIGVuZm9yY2Ugbm9uLW51bGxhYmxlXG4gKiAgIERlY29yLT4+TWV0YTogYWdncmVnYXRlT3JOZXdDb2x1bW4oLi4uKVxuICogICBhbHQgb3B0aW9ucy5nZW5lcmF0ZWRcbiAqICAgICBEZWNvci0+Pk1ldGE6IGdlbmVyYXRpb25zLnB1c2goeyBzdHJhdGVneSB9KVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGVPck9wdGlvbnM/OiBDb2x1bW5UeXBlIHwgUHJpbWFyeUNvbHVtbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVPck9wdGlvbnMgPT09IFN0cmluZyB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gQm9vbGVhbiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gTnVtYmVyXG4gICAgKSB7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucyBhcyBDb2x1bW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgPFByaW1hcnlDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBQcmltYXJ5Q29sdW1uT3B0aW9ucztcblxuICAgIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICBjb25zdCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSB0eXBlIHRoZW4gd2UgbmVlZCB0byBnaXZlIGVycm9yIHRvIHVzZXIgdGhhdCB0eXBlIGlzIHJlcXVpcmVkXG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gY2hlY2sgaWYgY29sdW1uIGlzIG5vdCBudWxsYWJsZSwgYmVjYXVzZSB3ZSBjYW5ub3QgYWxsb3cgYSBwcmltYXJ5IGtleSB0byBiZSBudWxsYWJsZVxuICAgIGlmIChvcHRpb25zLm51bGxhYmxlKVxuICAgICAgdGhyb3cgbmV3IFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IHRvIGNvbHVtbiBvcHRpb25zXG4gICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBcInJlZ3VsYXJcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG5cbiAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gb3B0aW9ucy5nZW5lcmF0ZWRcbiAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlPcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgVGFibGVNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1RhYmxlTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KFxuICBuYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgRW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzogRW50aXR5T3B0aW9uc1xuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBvcHRpb25zID1cbiAgICAoT2JqZWN0VXRpbHMuaXNPYmplY3QobmFtZU9yT3B0aW9ucylcbiAgICAgID8gKG5hbWVPck9wdGlvbnMgYXMgRW50aXR5T3B0aW9ucylcbiAgICAgIDogbWF5YmVPcHRpb25zKSB8fCB7fTtcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiID8gbmFtZU9yT3B0aW9ucyA6IG9wdGlvbnMubmFtZTtcblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGNvbnN0IHRhYmxlcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXM7XG4gICAgdGFibGVzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogXCJyZWd1bGFyXCIsXG4gICAgICBvcmRlckJ5OiBvcHRpb25zLm9yZGVyQnkgPyBvcHRpb25zLm9yZGVyQnkgOiB1bmRlZmluZWQsXG4gICAgICBlbmdpbmU6IG9wdGlvbnMuZW5naW5lID8gb3B0aW9ucy5lbmdpbmUgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhYmFzZTogb3B0aW9ucy5kYXRhYmFzZSA/IG9wdGlvbnMuZGF0YWJhc2UgOiB1bmRlZmluZWQsXG4gICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hID8gb3B0aW9ucy5zY2hlbWEgOiB1bmRlZmluZWQsXG4gICAgICBzeW5jaHJvbml6ZTogb3B0aW9ucy5zeW5jaHJvbml6ZSxcbiAgICAgIHdpdGhvdXRSb3dpZDogb3B0aW9ucy53aXRob3V0Um93aWQsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQgPyBvcHRpb25zLmNvbW1lbnQgOiB1bmRlZmluZWQsXG4gICAgfSBhcyBUYWJsZU1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWxLZXlzLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHBhdGggc3BsaXR0ZXIgdXNlZCB0byBuYXZpZ2F0ZSBuZXN0ZWQgbWV0YWRhdGEgb2JqZWN0cy5cbiAqIEBzdW1tYXJ5IEtleXMgaW4gbmVzdGVkIG1ldGFkYXRhIGFyZSBqb2luZWQgdXNpbmcgdGhpcyBzdHJpbmcgdG8gYWxsb3cgc2FmZSByZWFkL3dyaXRlIGJ5IHBhdGguXG4gKiBAY29uc3QgT2JqZWN0S2V5U3BsaXR0ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IE9iamVjdEtleVNwbGl0dGVyID0gXCIuXCI7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSb290IGtleSB1c2VkIHRvIG1pcnJvciBtb2RlbC1hc3NvY2lhdGVkIG1ldGFkYXRhIG9uIHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFdoZW4gbWlycm9yaW5nIGlzIGVuYWJsZWQsIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgd2l0aCB0aGlzIGtleSBpcyBhdHRhY2hlZCB0byB0aGUgbW9kZWwgY29uc3RydWN0b3IgdG8gZXhwb3NlIGNvbGxlY3RlZCBtZXRhZGF0YS5cbiAqIEBjb25zdCBCYXNlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBCYXNlS2V5ID0gXCJkZWNhZlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTYWZlbHkgcmV0cmlldmVzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGEgcGF0aCBhbmQgc3BsaXR0ZXIuXG4gKiBAc3VtbWFyeSBTcGxpdHMgdGhlIHByb3ZpZGVkIHBhdGggYnkgdGhlIHNwbGl0dGVyIGFuZCB3YWxrcyB0aGUgb2JqZWN0LCByZXR1cm5pbmcgdW5kZWZpbmVkIGlmIGFueSBpbnRlcm1lZGlhdGUga2V5IGlzIG1pc3NpbmcsIG51bGwsIG9yIHVuZGVmaW5lZC4gSW50ZW5kZWQgZm9yIGludGVybmFsIG1ldGFkYXRhIGFjY2Vzcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIHJlc29sdmUgKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBUaGUgY2hhcmFjdGVyKHMpIHVzZWQgdG8gc3BsaXQgdGhlIHBhdGguXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZXNvbHZlZCB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuICogQGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlclxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRm4gYXMgZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE9iaiBhcyBPYmplY3RcbiAqICAgRm4tPj5PYmo6IHNwbGl0KHBhdGgpXG4gKiAgIGxvb3Aga2V5c1xuICogICAgIEZuLT4+T2JqOiBoYXNPd25Qcm9wZXJ0eShrZXkpP1xuICogICAgIGFsdCBtaXNzaW5nL251bGwvdW5kZWZpbmVkXG4gKiAgICAgICBGbi0tPj5PYmo6IHJldHVybiB1bmRlZmluZWRcbiAqICAgICBlbHNlIHByZXNlbnRcbiAqICAgICAgIEZuLT4+T2JqOiBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBGbi0tPj5PYmo6IHJldHVybiBjdXJyZW50XG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gV3JpdGVzIGEgbmVzdGVkIHZhbHVlIG9uIGFuIG9iamVjdCB1c2luZyBhIHBhdGggYW5kIHNwbGl0dGVyLCBjcmVhdGluZyBtaXNzaW5nIG9iamVjdHMgYWxvbmcgdGhlIHdheS5cbiAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhhdCBhbGwgcGF0aCBzZWdtZW50cyBleGlzdCBhbmQgYXNzaWducyB0aGUgcHJvdmlkZWQgdmFsdWUgYXQgdGhlIHRlcm1pbmFsIGtleS4gSW50ZW5kZWQgZm9yIGludGVybmFsIG1ldGFkYXRhIG11dGF0aW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogVGhlIHRhcmdldCBvYmplY3QgdG8gbXV0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gc2V0IChlLmcuLCBcImEuYi5jXCIpLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBUaGUgY2hhcmFjdGVyKHMpIHVzZWQgdG8gc3BsaXQgdGhlIHBhdGguXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlclxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRm4gYXMgc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE9iaiBhcyBPYmplY3RcbiAqICAgRm4tPj5PYmo6IHNwbGl0KHBhdGgpXG4gKiAgIGxvb3Aga2V5c1xuICogICAgIGFsdCBrZXkgbWlzc2luZ1xuICogICAgICAgRm4tPj5PYmo6IGN1cnJlbnRba2V5XSA9IHt9XG4gKiAgICAgZW5kXG4gKiAgICAgRm4tPj5PYmo6IGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAqICAgZW5kXG4gKiAgIEZuLS0+Pk9iajogY3VycmVudFtsYXN0S2V5XSA9IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcik7XG4gIGxldCBjdXJyZW50OiBSZWNvcmQ8YW55LCBhbnk+ID0gb2JqO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgY3VycmVudFtrZXlzW2tleXMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0cnVjdHVyZSBvZiBjb2xsZWN0ZWQgbW9kZWwgbWV0YWRhdGEgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyIGRlY29yYXRvcnMuXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBwcm9wZXJ0eSBkZXNpZ24gdHlwZXMsIHZhbGlkYXRpb24gbWV0YWRhdGEsIHJlbGF0aW9uIG1hcHBpbmdzLCBnZW5lcmF0ZWQgZmllbGRzLCBwcmltYXJ5L2ZvcmVpZ24ga2V5cywgYW5kIGluZGV4IHNwZWNpZmljYXRpb25zLCB3aGljaCBhcmUgbWlycm9yZWQgb250byB0aGUgbW9kZWwgY29uc3RydWN0b3Igd2hlbiBlbmFibGVkLlxuICogQHR5cGVkZWYgTW9kZWxNZXRhZGF0YVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wZXJ0aWVzIE1hcCBvZiBwcm9wZXJ0eSBuYW1lcyB0byB0aGVpciBkZXNpZ24tdGltZSB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55W10+fSBbdmFsaWRhdGlvbl0gT3B0aW9uYWwgdmFsaWRhdGlvbiBydWxlcyBncm91cGVkIGJ5IHZhbGlkYXRpb24ga2V5LlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcmVsYXRpb25zXSBPcHRpb25hbCByZWxhdGlvbiBtZXRhZGF0YSBrZXllZCBieSBwcm9wZXJ0eS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2dlbmVyYXRlZF0gT3B0aW9uYWwgbWFwIG9mIGdlbmVyYXRlZCBjb2x1bW4gc3RyYXRlZ2llcyBwZXIgcHJvcGVydHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGsgUHJpbWFyeSBrZXkgZmllbGQgbmFtZSBmb3IgdGhlIG1vZGVsLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbZmtzXSBPcHRpb25hbCBmb3JlaWduIGtleSBkZWZpbml0aW9ucyBrZXllZCBieSBwcm9wZXJ0eS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2luZGV4ZXNdIE9wdGlvbmFsIGluZGV4IGRlZmluaXRpb25zIGtleWVkIGJ5IGluZGV4IG5hbWUuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsTWV0YWRhdGEgPSB7XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHZhbGlkYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XG4gIHJlbGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGdlbmVyYXRlZD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHBrOiBzdHJpbmc7XG4gIGZrcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGluZGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbCByZWdpc3RyeSBmb3IgbW9kZWwgbWV0YWRhdGEgdXNlZCBieSBkZWNvcmF0b3JzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgc3RhdGljIGhlbHBlcnMgdG8gY29sbGVjdCwgbWlycm9yLCBhbmQgcXVlcnkgbWV0YWRhdGEgZm9yIG1vZGVscyBhbmQgdGhlaXIgcHJvcGVydGllcy4gSXQgc3VwcG9ydHMgbmVzdGVkIGtleSBhY2Nlc3MgdmlhIGEgc3BsaXR0ZXIsIG9wdGlvbmFsIG1pcnJvcmluZyBvZiBtZXRhZGF0YSBvbnRvIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciwgYW5kIHV0aWxpdGllcyB0byBpbmZlciBkZXNpZ24gdHlwZXMgY29tYmluZWQgd2l0aCB2YWxpZGF0aW9uIGhpbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHNwbGl0dGVyIFRoZSBwYXRoIHNwbGl0dGVyIHVzZWQgdG8gbmF2aWdhdGUgbmVzdGVkIG1ldGFkYXRhIChzZWUgT2JqZWN0S2V5U3BsaXR0ZXIpLlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VLZXkgVGhlIG5vbi1lbnVtZXJhYmxlIGtleSB1c2VkIHRvIG1pcnJvciBtZXRhZGF0YSBvbnRvIHRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbWlycm9yIElmIHRydWUsIG1ldGFkYXRhIGlzIG1pcnJvcmVkIG9uIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1bmRlciBiYXNlS2V5LlxuICogQGNsYXNzIE1ldGFkYXRhXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlciB7fVxuICogLy8gcmVnaXN0ZXIgYSBwcm9wZXJ0eSB0eXBlXG4gKiBNZXRhZGF0YS5zZXQoVXNlciBhcyBhbnksIGBwcm9wZXJ0aWVzLmlkYCwgU3RyaW5nKTtcbiAqIC8vIHJlYWQgYmFja1xuICogY29uc3QgcHJvcHMgPSBNZXRhZGF0YS5nZXRQcm9wZXJ0aWVzKFVzZXIgYXMgYW55KTsgLy8gWydpZCddXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBEZWNvciBhcyBEZWNvcmF0b3JzXG4gKiAgIHBhcnRpY2lwYW50IFN0b3JlIGFzIE1ldGFkYXRhIFN0b3JlXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsIGFzIE1vZGVsIEN0b3JcbiAqICAgRGVjb3ItPj5TdG9yZTogc2V0KE1vZGVsLCBcInByb3BlcnRpZXMuZW1haWxcIiwgU3RyaW5nKVxuICogICBhbHQgbWlycm9yIGVuYWJsZWRcbiAqICAgICBTdG9yZS0+Pk1vZGVsOiBkZWZpbmVQcm9wZXJ0eShCYXNlS2V5LCBtZXRhZGF0YSlcbiAqICAgZW5kXG4gKiAgIERlY29yLT4+U3RvcmU6IGdldFByb3BlcnRpZXMoTW9kZWwpXG4gKiAgIFN0b3JlLS0+PkRlY29yOiBbXCJlbWFpbFwiXVxuICovXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICBwcml2YXRlIHN0YXRpYyBfbWV0YWRhdGE6IFJlY29yZDxzeW1ib2wsIE1vZGVsTWV0YWRhdGE+ID0ge307XG5cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIHN0YXRpYyBiYXNlS2V5ID0gQmFzZUtleTtcbiAgc3RhdGljIG1pcnJvcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyBhbGwgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBuYW1lcyBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIHN0b3JlIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIHJldHVybnMgdGhlIGtleXMgb2YgdGhlIHByb3BlcnRpZXMgbWFwIG9yIHVuZGVmaW5lZCBpZiBub25lIGV4aXN0LlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfHVuZGVmaW5lZH0gQXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb3IgdW5kZWZpbmVkIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcHJpbWFyeSBrZXkgZmllbGQgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZmlyc3Qga2V5IG9mIHRoZSBwayBtYXAgaW4gbWV0YWRhdGEsIG9yIHVuZGVmaW5lZCBpZiBubyBtZXRhZGF0YSBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH0gVGhlIHByaW1hcnkga2V5IGZpZWxkIG5hbWUgb3IgdW5kZWZpbmVkLlxuICAgKi9cbiAgc3RhdGljIHBrKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucGspWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBmaXJzdCByZXNvbHZlZCB0eXBlIGZvciBhIGdpdmVuIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBDb21iaW5lcyBkZXNpZ24tdGltZSBtZXRhZGF0YSB3aXRoIG9wdGlvbmFsIHZhbGlkYXRpb24tcHJvdmlkZWQgdHlwZSBoaW50cyBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzb2x2ZWQgdHlwZS5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHJlc29sdmUgdGhlIHR5cGUgZm9yLlxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSBmaXJzdCByZXNvbHZlZCB0eXBlLlxuICAgKi9cbiAgc3RhdGljIHR5cGUobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnR5cGVzKG1vZGVsLCBwcm9wKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgYWxsIGtub3duIHR5cGVzIGZvciBhIGdpdmVuIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRlc2lnbi10aW1lIHR5cGUgZm9sbG93ZWQgYnkgYW55IGFkZGl0aW9uYWwgdHlwZXMgZGVyaXZlZCBmcm9tIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byByZXNvbHZlIHR5cGVzIGZvci5cbiAgICogQHJldHVybiB7YW55W119IE9yZGVyZWQgbGlzdCBvZiByZXNvbHZlZCB0eXBlcyB3aXRoIGZhbHN5IHZhbHVlcyByZW1vdmVkLlxuICAgKi9cbiAgc3RhdGljIHR5cGVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICBsZXQgZGVzaWduVHlwZTogYW55ID0gdGhpcy5nZXQobW9kZWwsIGBwcm9wZXJ0aWVzLiR7cHJvcH1gKTtcbiAgICBpZiAoIWRlc2lnblR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5ICR7cHJvcH0gbm90IGZvdW5kIGluICR7bW9kZWwubmFtZX1gKTtcbiAgICBkZXNpZ25UeXBlID0gW2Rlc2lnblR5cGVdO1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgICAgaWYgKG1ldGEudmFsaWRhdGlvbikge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gbWV0YS52YWxpZGF0aW9uO1xuICAgICAgICBpZiAodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSlcbiAgICAgICAgICBkZXNpZ25UeXBlID0gZGVzaWduVHlwZS5jb25jYXQodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXNpZ25UeXBlLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIG9yIGEgbmVzdGVkIHZhbHVlIGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIG9ubHkgdGhlIG1vZGVsLCByZXR1cm5zIHRoZSBlbnRpcmUgTW9kZWxNZXRhZGF0YSBpZiBpdCBleGlzdHM7IHdoZW4gYSBrZXkgcGF0aCBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgbmVzdGVkIHZhbHVlIHJlc29sdmVkIHZpYSB0aGUgc3BsaXR0ZXIuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gT3B0aW9uYWwgZG90LXNlcGFyYXRlZCBwYXRoIHRvIGEgbmVzdGVkIHZhbHVlIHdpdGhpbiB0aGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge01vZGVsTWV0YWRhdGF8YW55fHVuZGVmaW5lZH0gVGhlIGZ1bGwgbWV0YWRhdGEgb2JqZWN0LCB0aGUgbmVzdGVkIHZhbHVlIGF0IGtleSwgb3IgdW5kZWZpbmVkIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBNb2RlbE1ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZyk6IGFueTtcbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFrZXkpIHJldHVybiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgIHJldHVybiBnZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB0aGlzLnNwbGl0dGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNzaWducyBhIHZhbHVlIGludG8gdGhlIG1vZGVsJ3MgbWV0YWRhdGEgYXQgdGhlIHByb3ZpZGVkIGtleSBwYXRoLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbWV0YWRhdGEgY29udGFpbmVyIGlmIG5lZWRlZCwgbWlycm9ycyBpdCBvbnRvIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciB3aGVuIGVuYWJsZWQsIGFuZCBzZXRzIHRoZSBuZXN0ZWQgdmFsdWUgdXNpbmcgdGhlIGN1cnJlbnQgc3BsaXR0ZXIuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gbW9kZWwgVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERvdC1zZXBhcmF0ZWQgcGF0aCB3aXRoaW4gdGhlIG1ldGFkYXRhIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24gYXQgdGhlIHBhdGguXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdID0ge30gYXMgYW55O1xuICAgIGlmIChcbiAgICAgIHRoaXMubWlycm9yICYmXG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCB0aGlzLmJhc2VLZXkpXG4gICAgKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIHRoaXMuYmFzZUtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB2YWx1ZSwgdGhpcy5zcGxpdHRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBhc3NpZ25zIGEgdmFsdWUgaW50byBtb2RlbCBtZXRhZGF0YSBhdCBhIGdpdmVuIGtleS5cbiAqIEBzdW1tYXJ5IFJldHVybnMgYSBkZWNvcmF0b3IgdXNhYmxlIG9uIGNsYXNzZXMgb3IgcHJvcGVydGllcyB0aGF0IHdyaXRlcyB0aGUgcHJvdmlkZWQgdmFsdWUgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXkgcGF0aCBmb3IgdGhlIG93bmluZyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGRvdC1zZXBhcmF0ZWQgbWV0YWRhdGEgcGF0aCB0byBhc3NpZ24uXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKG9iamVjdCwgYW55LCBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBUaGUgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uIGFzc2lnblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEZuIGFzIGFzc2lnbihrZXksIHZhbHVlKVxuICogICBwYXJ0aWNpcGFudCBEZWNvciBhcyBEZWNvcmF0b3JcbiAqICAgRGV2LT4+Rm46IGNhbGwgd2l0aCBrZXksIHZhbHVlXG4gKiAgIEZuLS0+PkRldjogcmV0dXJucyBEZWNvcmF0b3JcbiAqICAgRGV2LT4+RGVjb3I6IGFwcGx5IG9uIGNsYXNzL3Byb3BlcnR5XG4gKiAgIERlY29yLT4+TWV0YWRhdGE6IE1ldGFkYXRhLnNldChtb2RlbCwga2V5LCB2YWx1ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbihrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gYXNzaWduKFxuICAgIG1vZGVsOiBvYmplY3QsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3A/OiBhbnksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgTWV0YWRhdGEuc2V0KG1vZGVsIGFzIGFueSwga2V5LCB2YWx1ZSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmYWN0b3J5IHRvIHJlZ2lzdGVyIGEgcHJvcGVydHkgZGVzaWduIHR5cGUgaW4gbW9kZWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBVc2VzIFJlZmxlY3QgbWV0YWRhdGEgdG8gZGlzY292ZXIgdGhlIHByb3BlcnR5J3MgZGVzaWduIHR5cGUsIHRoZW4gZGVsZWdhdGVzIHRvIGFzc2lnbiB0byBwZXJzaXN0IGl0IHVuZGVyIHByb3BlcnRpZXMuPHByb3A+LlxuICogQHJldHVybiB7ZnVuY3Rpb24ob2JqZWN0LCBhbnkpOiB2b2lkfSBUaGUgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uIHByb3BlcnR5XG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcm9wZXJ0eShtb2RlbDogb2JqZWN0LCBwcm9wOiBhbnkpIHtcbiAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShNb2RlbEtleXMuVFlQRSwgbW9kZWwsIHByb3ApO1xuICAgIHJldHVybiBhc3NpZ24oYHByb3BlcnR5LiR7cHJvcH1gLCBkZXNpZ25UeXBlKShtb2RlbCwgcHJvcCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDYXNjYWRlLFxuICBDYXNjYWRlTWV0YWRhdGEsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgZmluYWwsXG4gIEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIG5vVmFsaWRhdGVPbkNyZWF0ZSxcbiAgbm9WYWxpZGF0ZU9uQ3JlYXRlVXBkYXRlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgUmVwb3NpdG9yeSxcbiAgU2VxdWVuY2UsXG4gIHNlcXVlbmNlTmFtZUZvck1vZGVsLFxuICB0eXBlIFNlcXVlbmNlT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyByZXNlcnZlZEF0dHJpYnV0ZXMsIFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIENvbnRleHQsXG4gIERCS2V5cyxcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyBhcyBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBPcGVyYXRpb25LZXlzLFxuICByZWFkb25seSxcbiAgVXBkYXRlVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgZGF0ZSxcbiAgRGVjb3JhdGlvbixcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgbGlzdCxcbiAgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWF4VmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluVmFsaWRhdG9yT3B0aW9ucyxcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbiAgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG4gIHR5cGUsXG4gIFR5cGVNZXRhZGF0YSxcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEluZGV4RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9xdWVyeVwiO1xuaW1wb3J0IHsgVHlwZU9STVNlcXVlbmNlIH0gZnJvbSBcIi4vc2VxdWVuY2VzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluZGV4ZXMgfSBmcm9tIFwiLi9pbmRleGVzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRmxhZ3MsIFR5cGVPUk1RdWVyeSwgVHlwZU9STVRhYmxlU3BlYyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseSwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgVHlwZU9STVJlcG9zaXRvcnkgfSBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVHlwZU9STURpc3BhdGNoIH0gZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5pbXBvcnQgeyBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXMsIHNwbGl0RWFnZXJSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgQ29sdW1uT3B0aW9ucyxcbiAgQ29sdW1uVHlwZSxcbiAgRGF0YVNvdXJjZSxcbiAgRmluZE9uZU9wdGlvbnMsXG4gIEluLFxuICBJbmRleCxcbiAgSW5zZXJ0UmVzdWx0LFxuICBKb2luQ29sdW1uLFxuICBKb2luQ29sdW1uT3B0aW9ucyxcbiAgSm9pblRhYmxlLFxuICBSZWxhdGlvbk9wdGlvbnMsXG4gIFNlbGVjdFF1ZXJ5QnVpbGRlcixcbiAgVmVyc2lvbkNvbHVtbixcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IERhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGF0YS1zb3VyY2UvRGF0YVNvdXJjZU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9Db2x1bW5cIjtcbmltcG9ydCB7IFVwZGF0ZURhdGVDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvVXBkYXRlRGF0ZUNvbHVtblwiO1xuaW1wb3J0IHsgQ3JlYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBPbmVUb09uZSB9IGZyb20gXCIuL292ZXJyaWRlcy9PbmVUb09uZVwiO1xuaW1wb3J0IHsgT25lVG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvTWFueVwiO1xuaW1wb3J0IHsgTWFueVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb09uZVwiO1xuaW1wb3J0IHsgTWFueVRvTWFueSB9IGZyb20gXCIuL292ZXJyaWRlcy9NYW55VG9NYW55XCI7XG5pbXBvcnQgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cIjtcbmltcG9ydCB7IFByaW1hcnlDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUNvbHVtblwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0VudGl0eVwiO1xuaW1wb3J0IHsgYXNzaWduLCBNZXRhZGF0YSwgcHJvcGVydHkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgVHlwZU9STVJlcG9zaXRvcnk8TT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PFR5cGVPUk1GbGFncz4sXG4gIGRhdGE6IGFueSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwidXNlclwiKTtcbiAgICBtb2RlbFtrZXldID0gdXNlciBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBUeXBlT1JNLWJhY2tlZCBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgRGVjYWYudHMgQWRhcHRlciBvdmVyIGEgVHlwZU9STSBEYXRhU291cmNlLCBwcm92aWRpbmcgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeS9zdGF0ZW1lbnQgZmFjdG9yaWVzLCBzZXF1ZW5jZSBtYW5hZ2VtZW50LCBlcnJvciBwYXJzaW5nLCBhbmQgZGVjb3JhdGlvbiBoZWxwZXJzLlxuICogQHRlbXBsYXRlIFkgVGhlIG5hdGl2ZSBjb25maWd1cmF0aW9uIHR5cGUgKFR5cGVPUk0gRGF0YVNvdXJjZU9wdGlvbnMpLlxuICogQHRlbXBsYXRlIEYgVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAcGFyYW0ge0RhdGFTb3VyY2VPcHRpb25zfSBzY29wZSBUaGUgRGF0YVNvdXJjZSBvcHRpb25zIGZvciB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIFRoZSBmbGF2b3VyIG9mIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBUeXBlT1JNQWRhcHRlcih7IHR5cGU6ICdwb3N0Z3JlcycsIC8qIC4uLiAqXFwvIH0pO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKiBjb25zdCByZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnQWxpY2UnIH0pKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5BZGFwdGVyOiBuZXcgVHlwZU9STUFkYXB0ZXIob3B0cylcbiAqICAgQWRhcHRlci0+PkRTOiBpbml0aWFsaXplKClcbiAqICAgQXBwLT4+QWRhcHRlcjogcmVwb3NpdG9yeSgpXG4gKiAgIEFkYXB0ZXItLT4+QXBwOiBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlL2NyZWF0ZS9yZXZlcnRcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBNb2RlbFxuICogICBSZXBvLS0+PkFwcDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gIERhdGFTb3VyY2UsXG4gIFR5cGVPUk1RdWVyeSxcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBvdmVycmlkZSBnZXRDbGllbnQoKTogRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgbW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5hbGlhcyk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBtb2RlbHMubWFwKChjKSA9PiBjW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNdKTtcbiAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgeyBlbnRpdGllczogZW50aXRpZXMgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGF0YVNvdXJjZU9wdGlvbnMsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIob3B0aW9ucywgVHlwZU9STUZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLnNodXRkb3duKCk7XG4gICAgaWYgKHRoaXMuX2NsaWVudCkge1xuICAgICAgYXdhaXQgdGhpcy5fY2xpZW50LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFR5cGVPUk1GbGFncz5cbiAgKTogUHJvbWlzZTxUeXBlT1JNRmxhZ3M+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIHVzZXI6ICh0aGlzLmNvbmZpZyBhcyBQb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zKS51c2VybmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBvdmVycmlkZSBEaXNwYXRjaCgpOiBUeXBlT1JNRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgVHlwZU9STURpc3BhdGNoKCk7XG4gIH1cblxuICBAZmluYWwoKVxuICBvdmVycmlkZSByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uc3RydWN0b3I8VHlwZU9STVJlcG9zaXRvcnk8TT4+IHtcbiAgICByZXR1cm4gVHlwZU9STVJlcG9zaXRvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUG9zdGdyZXMgc3RhdGVtZW50IGZvciBxdWVyeWluZ1xuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUG9zdGdyZXNTdGF0ZW1lbnQgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHF1ZXJpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNU3RhdGVtZW50PE0sIGFueT59IEEgbmV3IFBvc3RncmVzU3RhdGVtZW50IGluc3RhbmNlXG4gICAqL1xuICBAZmluYWwoKVxuICBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBUeXBlT1JNU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgVHlwZU9STVN0YXRlbWVudCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBQb3N0Z3JlU1FMU2VxdWVuY2UgaW5zdGFuY2UgZm9yIG1hbmFnaW5nIHNlcXVlbmNlc1xuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbmV3IFNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBAZmluYWwoKVxuICBhc3luYyBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBhZGFwdGVyIGJ5IGNyZWF0aW5nIGluZGV4ZXMgZm9yIGFsbCBtYW5hZ2VkIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBuZWNlc3NhcnkgZGF0YWJhc2UgaW5kZXhlcyBmb3IgYWxsIG1vZGVscyBtYW5hZ2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5jbGllbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRzLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGxvZy52ZXJib3NlKGAke3RoaXMudG9TdHJpbmcoKX0gaW5pdGlhbGl6ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBpbmRleGVzIGZvciB0aGUgZ2l2ZW4gbW9kZWxzXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gY3JlYXRlIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWxzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHsuLi5Db25zdHJ1Y3RvcjxNPn0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBjcmVhdGUgaW5kZXhlcyBmb3JcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgaW5kZXhlcyBhcmUgY3JlYXRlZFxuICAgKi9cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXM6IFR5cGVPUk1RdWVyeVtdID0gZ2VuZXJhdGVJbmRleGVzKG1vZGVscyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jbGllbnQucXVlcnkoXCJCRUdJTlwiKTtcblxuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5KGluZGV4LnF1ZXJ5LCBpbmRleC52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeShcIlJPTExCQUNLXCIpO1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgU1FMIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZXhlY3V0ZSByYXcgU1FMIHF1ZXJpZXNcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGVcbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHEgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocTogVHlwZU9STVF1ZXJ5KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmF3KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNsaWVudC5pc0luaXRpYWxpemVkKSBhd2FpdCB0aGlzLmNsaWVudC5pbml0aWFsaXplKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBxdWVyeSwgdmFsdWVzIH0gPSBxO1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgZXhlY3V0aW5nIHF1ZXJ5OiAkeyhxdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5nZXRTcWwoKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeShxdWVyeSwgdmFsdWVzKTtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgY2hpbGQgPSBmYWxzZVxuICApOiB7XG4gICAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG5cbiAgICBwcmVwYXJlZC5yZWNvcmQgPSBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSB8fCB0aGlzLmlzUmVzZXJ2ZWQoa2V5KSlcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUuZ2V0VGltZSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChNb2RlbC5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5wcmVwYXJlKHZhbHVlLCBmaW5kUHJpbWFyeUtleSh2YWx1ZSkuaWQsIHRydWUpLnJlY29yZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vZG8gbm90aGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IE1vZGVsLmdldChcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICApO1xuICAgIGlmICghY29uc3RyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IG5vdCBmb3VuZCBpbiByZWdpc3RyeWBcbiAgICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2hpbGRcbiAgICAgID8gbmV3IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdKClcbiAgICAgIDogbmV3IGNvbnN0cigpO1xuICAgIGlmIChjaGlsZClcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFwiY29uc3RydWN0b3JcIiwge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLmZvckVhY2goXG4gICAgICAoW2tleSwgdmFsXSkgPT4gKHJlc3VsdFtrZXkgYXMga2V5b2YgdHlwZW9mIHJlc3VsdF0gPSB2YWwpXG4gICAgKTtcbiAgICBwcmVwYXJlZC5yZWNvcmQgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHByZXBhcmVkO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogTSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFRyYW5zaWVudCBwcm9wZXJ0eSAke2tleX0gYWxyZWFkeSBleGlzdHMgb24gbW9kZWwgJHt0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBjbGF6eiA6IGNsYXp6Lm5hbWV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgYSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlcG8uZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBgUmVjb3JkIGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7UmVwb3NpdG9yeS50YWJsZShtKX0gd2l0aCBpZDogJHtpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHJlYWQgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gcHJpbWFyeSBrZXkgY29sdW1cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlYWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5jbGllbnQuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IHsgbm9uRWFnZXIsIHJlbGF0aW9ucyB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyhtKTtcblxuICAgICAgY29uc3QgcTogRmluZE9uZU9wdGlvbnMgPSB7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aW9uczogcmVsYXRpb25zLFxuICAgICAgICBsb2FkUmVsYXRpb25JZHM6IHtcbiAgICAgICAgICByZWxhdGlvbnM6IG5vbkVhZ2VyLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHJlc3VsdCA9IChhd2FpdCByZXBvLmZpbmRPbmVPckZhaWwocSkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHVwZGF0ZSBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5yZWFkKHRhYmxlTmFtZSwgaWQsIHBrKTtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmNsaWVudC5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgcmV0dXJuIHJlcG8uc2F2ZShtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlbGV0ZSBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHRhYmxlTmFtZSwgaWQsIHBrKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCByZXN1bHQ6IEluc2VydFJlc3VsdCA9IGF3YWl0IHJlcG8uaW5zZXJ0KG1vZGVsKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRBbGwoXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcmVzdWx0LmlkZW50aWZpZXJzLm1hcCgoaWQpID0+IGlkLmlkKSxcbiAgICAgICAgXCJpZFwiXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZC5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5maW5kQnkoeyBbcGtdOiBJbihpZCkgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBtIG9mIG1vZGVsKSB7XG4gICAgICByZXN1bHQucHVzaChhd2FpdCB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIG1bcGtdLCBtLCBwaywgLi4uYXJncykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuY2xpZW50LmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwodGFibGVOYW1lLCBpZHMsIHBrKTtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkcyk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBhbmQgY29udmVydHMgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICovXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gVHlwZU9STUFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBpbiBQb3N0Z3JlU1FMXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhdHRyLm1hdGNoKHJlc2VydmVkQXR0cmlidXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW4gZXJyb3IgYW5kIGNvbnZlcnQgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXMgYmFzZWQgb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VFcnJvclxuICAgKiAgIHBhcnRpY2lwYW50IEVycm9yVHlwZXNcbiAgICpcbiAgICogICBDYWxsZXItPj5wYXJzZUVycm9yOiBlcnIsIHJlYXNvblxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBDaGVjayBpZiBlcnIgaXMgYWxyZWFkeSBhIEJhc2VFcnJvclxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBwYXJzZUVycm9yLS0+PkNhbGxlcjogcmV0dXJuIGVyclxuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBmcm9tIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvZGUgbWF0Y2hlcyBcImR1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHNcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29kZSBtYXRjaGVzIFwiZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgY29kZSBwcm9wZXJ0eVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBhbmQgcmVhc29uXG4gICAqICAgZWxzZVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFVzZSBlcnIubWVzc2FnZSBhcyBjb2RlXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFN3aXRjaCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVcbiAgICogICBhbHQgY29kZSBpcyAyMzUwNSAodW5pcXVlX3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyAyMzUwMyAoZm9yZWlnbl9rZXlfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDAxICh1bmRlZmluZWRfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDI3MDMgKHVuZGVmaW5lZF9jb2x1bW4pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDcgKGR1cGxpY2F0ZV90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAxNiAoaW52YWxpZF90YWJsZV9kZWZpbml0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbmRleEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgIGVsc2VcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgY29uc3QgY29kZTogc3RyaW5nID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuXG4gICAgaWYgKGNvZGUubWF0Y2goL2R1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHMvZykpXG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgaWYgKGNvZGUubWF0Y2goL2RvZXMgbm90IGV4aXN0fG5vdCBmb3VuZHxDb3VsZCBub3QgZmluZC9nKSlcbiAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcblxuICAgIC8vIFBvc3RncmVTUUwgZXJyb3IgY29kZXM6IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9lcnJjb2Rlcy1hcHBlbmRpeC5odG1sXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIEludGVncml0eSBjb25zdHJhaW50IHZpb2xhdGlvbnNcbiAgICAgIGNhc2UgXCIyMzUwNVwiOiAvLyB1bmlxdWVfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiMjM1MDNcIjogLy8gZm9yZWlnbl9rZXlfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiNDJQMDdcIjogLy8gZHVwbGljYXRlX3RhYmxlXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCBlcnJvcnNcbiAgICAgIGNhc2UgXCI0MlAwMVwiOiAvLyB1bmRlZmluZWRfdGFibGVcbiAgICAgIGNhc2UgXCI0MjcwM1wiOiAvLyB1bmRlZmluZWRfY29sdW1uXG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gSW52YWxpZCBvYmplY3QgZGVmaW5pdGlvblxuICAgICAgY2FzZSBcIjQyUDE2XCI6IC8vIGludmFsaWRfdGFibGVfZGVmaW5pdGlvblxuICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcblxuICAgICAgLy8gQ29ubmVjdGlvbiBlcnJvcnNcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29ubmVjdChjb25maWc6IERhdGFTb3VyY2VPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gICAgY29uc3QgY29uID0gbmV3IERhdGFTb3VyY2UoY29uZmlnKTtcbiAgICBpZiAoIWNvbi5pc0luaXRpYWxpemVkKSBhd2FpdCBjb24uaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiBjb247XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZURhdGFiYXNlKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTm90aWZ5RnVuY3Rpb24oXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVOb3RpZnlGdW5jdGlvbik7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKVxuUkVUVVJOUyB0cmlnZ2VyIEFTICQkXG5CRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KFxuICAgICAgICAndGFibGVfY2hhbmdlcycsXG4gICAgICAgIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAgICdhY3Rpb24nLCBUR19PUCxcbiAgICAgICAgICAgICdkYXRhJywgcm93X3RvX2pzb24oTkVXKSxcbiAgICAgICAgICAgICdvbGRfZGF0YScsIHJvd190b19qc29uKE9MRClcbiAgICAgICAgKTo6dGV4dFxuICAgICk7XG4gICAgUkVUVVJOIE5FVztcbkVORDtcbiQkIExBTkdVQUdFIHBscGdzcWwgU0VDVVJJVFkgREVGSU5FUlxuO2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBPV05FUiBUTyAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBcbiAgICAgICAgICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBUTyBwdWJsaWM7XG4gICAgICAgIGApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VyKSBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERTtgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBVU0VSICR7dXNlcn0gV0lUSCBQQVNTV09SRCAnJHtwYXNzd29yZH0nYCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDT05ORUNUIE9OIERBVEFCQVNFICR7ZGJOYW1lfSBUTyAke3VzZXJ9YCk7XG5cbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ1JFQVRFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFRBQkxFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBTRVFVRU5DRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgYWRtaW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRUFTU0lHTiBPV05FRCBCWSAke3VzZXJ9IFRPICR7YWRtaW59YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRVZPS0UgQUxMIE9OIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFRBQkxFUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBTRVFVRU5DRVMgRlJPTSAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIEZVTkNUSU9OUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIFVTRVIgSUYgRVhJU1RTIFwiJHt1c2VyfVwiYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAgaXNGayA9IGZhbHNlXG4gICkge1xuICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJURVhUIFBSSU1BUlkgS0VZXCIgOiBpc0ZrID8gXCJURVhUXCIgOiBcIlZBUkNIQVJcIjtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlNFUklBTCBQUklNQVJZIEtFWVwiIDogXCJJTlRFR0VSXCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJUSU1FU1RBTVBcIjtcbiAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIkJJR0lOVCBQUklNQVJZIEtFWVwiIDogXCJCSUdJTlRcIjtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBjb25zdCBtbSA9IG5ldyBtKCk7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gICAgICAgICAgICBtbSxcbiAgICAgICAgICAgIGZpbmRQcmltYXJ5S2V5KG1tKS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGVsOiBtLFxuICAgICAgICAgICAgcGtUeXBlOiB0eXBlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zXG4gICkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEOlxuICAgICAgICByZXR1cm4gXCJOT1QgTlVMTFwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIOlxuICAgICAgICBpZiAoaXNQayB8fCAhb3B0aW9ucyB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgkeyhvcHRpb25zIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9taW5fbGVuZ3RoX2NoZWNrIENIRUNLIChMRU5HVEgoJHtwcm9wfSkgPj0gJHsob3B0aW9ucyBhcyBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFUVEVSTjpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVVJMOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5FTUFJTDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fcGF0dGVybl9jaGVjayBDSEVDSyAoJHtwcm9wfSB+ICcke2NvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcygob3B0aW9ucyBhcyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gYXMgc3RyaW5nKX0nKWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkRBVEU6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU46XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA+PSAkeyhvcHRpb25zIGFzIE1pblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9IDw9ICR7KG9wdGlvbnMgYXMgTWF4VmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFTU1dPUkQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAga2V5OiBQZXJzaXN0ZW5jZUtleXMsXG4gICAgb3B0aW9uczogUmVsYXRpb25zTWV0YWRhdGFcbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjbGF6eik7XG4gICAgY29uc3QgeyBjYXNjYWRlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhc2NhZGVTdHIgPSBgJHtjYXNjYWRlLnVwZGF0ZSA/IFwiIE9OIFVQREFURSBDQVNDQURFXCIgOiBcIlwifSR7Y2FzY2FkZS5kZWxldGUgPyBcIiBPTiBERUxFVEUgQ0FTQ0FERVwiIDogXCJcIn1gO1xuICAgIHN3aXRjaCAoYHJlbGF0aW9ucyR7a2V5fWApIHtcbiAgICAgIGNhc2UgUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkU6XG4gICAgICAgIHJldHVybiBgRk9SRUlHTiBLRVkgKCR7cHJvcH0pIFJFRkVSRU5DRVMgJHt0YWJsZU5hbWV9KCR7cGt9KSR7Y2FzY2FkZVN0cn1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPiA9IHt9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoe30pO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGNvbnN0IHsgaWQgfSA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuXG4gICAgbGV0IGlzUGs6IGJvb2xlYW4sIGNvbHVtbjogc3RyaW5nO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSBhcyAoa2V5b2YgTSlbXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KVtwcm9wXSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHByb3AudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICBwcm9wID09PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaXNQayA9IHByb3AgPT09IGlkO1xuICAgICAgY29sdW1uID0gUmVwb3NpdG9yeS5jb2x1bW4obSwgcHJvcC50b1N0cmluZygpKTtcblxuICAgICAgY29uc3QgYWxsRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWNvcmF0b3JEYXRhID0gYWxsRGVjcy5kZWNvcmF0b3JzLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZWw7XG4gICAgICAgICAgaWYgKGtleSA9PT0gTW9kZWxLZXlzLlRZUEUgJiYgIWFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICBhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tVHlwZXM6IFtwcm9wcy5uYW1lIGFzIHN0cmluZ10sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGNhbiBvbmx5IHN1cHBvcnQgYmFzaXMgY3R5cGVzIGF0IHRoaXMgdGltZVxuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkYkRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoXCJyZWxhdGlvbnNcIiksXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHR5cGVEYXRhOiBUeXBlTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRDbGFzczogQ29uc3RydWN0b3I8TW9kZWw+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkUGs6IGFueTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlY29yYXRvckRhdGEpLmxlbmd0aCkge1xuICAgICAgICB0eXBlRGF0YSA9IGRlY29yYXRvckRhdGFbVmFsaWRhdGlvbktleXMuVFlQRV0gYXMgVHlwZU1ldGFkYXRhO1xuXG4gICAgICAgIGlmICghdHlwZURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFR5cGU6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIHR5cGVvZiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55W10pWzBdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSgpXG4gICAgICAgICAgICAgIDogKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0sXG4gICAgICAgICAgICBpc1BrXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkVHlwZSA9IHsgbW9kZWw6IHBhcnNlZFR5cGUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZVN0cjpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgcGFyc2VkVHlwZS5tb2RlbCBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHR5cGVTdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlU3RyKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codHlwZVN0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgLy8gY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1RhYmxlU3BlYz4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKHBvb2wsIHR5cGVTdHIpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGlsZENsYXNzID0gcGFyc2VkVHlwZS5tb2RlbCBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IGNoaWxkQ2xhc3MoKTtcbiAgICAgICAgICAgIGNoaWxkUGsgPSBmaW5kUHJpbWFyeUtleShtKTtcbiAgICAgICAgICAgIHR5cGVTdHIgPSB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICAgIHBhcnNlZFR5cGUucGtUeXBlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsaWVudCwgY2hpbGRDbGFzcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvbmZsaWN0RXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cCA9IEFycmF5LmlzQXJyYXkodHlwZURhdGEuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyB0eXBlRGF0YS5jdXN0b21UeXBlc1swXVxuICAgICAgICAgIDogdHlwZURhdGEuY3VzdG9tVHlwZXM7XG4gICAgICAgIHRwID0gdHlwZW9mIHRwID09PSBcImZ1bmN0aW9uXCIgJiYgIXRwLm5hbWUgPyB0cCgpIDogdHA7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHIgPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICBpc1BrLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gICAgICAgICAgKGRlY29yYXRvckRhdGFbXG4gICAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXG4gICAgICAgICAgXSBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKSB8fCB7XG4gICAgICAgICAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IDI1NSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcSA9IGAke2NvbHVtbn0gJHt0eXBlU3RyfSR7dmFsaWRhdGlvblN0cn1gO1xuXG4gICAgICAgIGlmIChpc1BrKSB7XG4gICAgICAgICAgcXVlcnkudW5zaGlmdChxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeS5wdXNoKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9yRGF0YSkuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICAhW1ZhbGlkYXRpb25LZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdLmluY2x1ZGVzKGsgYXMgYW55KVxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICAgIGlzUGssXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkNPTlNUUkFJTlRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gaWdub3JlIGZvciBub3cuIHRoaXMgbGVhdmVzIGZvcmVpZ24ga2V5cyBvdXRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblxuICAgICAgaWYgKGZhbHNlIHx8IChkYkRlY3MgJiYgZGJEZWNzLmRlY29yYXRvcnMubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIXR5cGVEYXRhKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkYkRlY3MuZGVjb3JhdG9ycykge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjb3JhdG9yO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgYXMgQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgICAgICAgICAgY2hpbGRQay5pZCxcbiAgICAgICAgICAgIGtleSBhcyBQZXJzaXN0ZW5jZUtleXMsXG4gICAgICAgICAgICBwcm9wcyBhcyB1bmtub3duIGFzIFJlbGF0aW9uc01ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiRk9SRUlHTlwiKSkge1xuICAgICAgICAgICAgZm9yZWlnbktleXMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHJlbGF0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3Byb3AudG9TdHJpbmcoKV0gPSB7XG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5qb2luKFwiIFwiKSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgcHJpbWFyeUtleTogaXNQayxcbiAgICAgICAgY29uc3RyYWludHM6IGNvbnN0cmFpbnRzLFxuICAgICAgICBmb3JlaWduS2V5czogZm9yZWlnbktleXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KTtcbiAgICBjb25zdCBxdWVyeSA9IHZhbHVlcy5tYXAoKHIpID0+IHIucXVlcnkpLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuY29uc3RyYWludHMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5jb25zdHJhaW50cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBmb3JlaWduS2V5cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmZvcmVpZ25LZXlzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuZm9yZWlnbktleXMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgdmFscyA9IFtxdWVyeSwgY29uc3RyYWludHNdO1xuICAgIGlmIChmb3JlaWduS2V5cykge1xuICAgICAgdmFscy5wdXNoKGZvcmVpZ25LZXlzKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoJHt2YWxzLmZpbHRlcigodikgPT4gISF2KS5qb2luKFwiLFxcblwiKX0pYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUUklHR0VSIG5vdGlmeV9jaGFuZ2VzXyR7dGFibGVOYW1lfVxuQUZURVIgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04gJHt0YWJsZU5hbWV9XG4gICAgRk9SIEVBQ0ggUk9XXG4gICAgRVhFQ1VURSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpO2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGNsaWVudDogRGF0YVNvdXJjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgU0VMRUNUIENVUlJFTlRfVVNFUjtgO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgcmV0dXJuIHJlc3VsdFswXS5jdXJyZW50X3VzZXI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcblxuICAgIC8vIEB0YWJsZSgpID0+IEBFbnRpdHkoKVxuICAgIGNvbnN0IHRhYmxlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0YWJsZUtleSlcbiAgICAgIC5leHRlbmQoKG9yaWdpbmFsOiBhbnkpID0+XG4gICAgICAgIEVudGl0eSgpKG9yaWdpbmFsW01vZGVsS2V5cy5BTkNIT1JdIHx8IG9yaWdpbmFsKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcGsoKSA9PiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpIHwgQFByaW1hcnlDb2x1bW4oKVxuICAgIGNvbnN0IHBrS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcblxuICAgIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9yaWdpbmFsOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHBrS2V5LCBvcHRpb25zKSxcbiAgICAgICAgICBhc3NpZ24oYHBrLiR7cHJvcH1gLCBvcHRpb25zKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IHR5cGUgPVxuICAgICAgICAgIG9wdGlvbnMudHlwZSB8fCBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgcHJvcGVydHkgJHtwcm9wfSBvZiAke29yaWdpbmFsLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgc2VxdWVuY2VOYW1lRm9yTW9kZWwob3JpZ2luYWwsIFwicGtcIik7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5vVmFsaWRhdGVPbkNyZWF0ZSgpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJudW1lcmljXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJ2YXJjaGFyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgICB0eXBlID0gXCJiaWdpbnRcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHt0eXBlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgICAgICBQcmltYXJ5Q29sdW1uKHtcbiAgICAgICAgICAgICAgdHlwZTogdHlwZSBhcyBDb2x1bW5UeXBlLFxuICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocGtLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBwa0RlYyxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKE1vZGVsS2V5cy5BVFRSSUJVVEUpXG4gICAgICAuZXh0ZW5kKHByb3BlcnR5KCkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBjb2x1bW4oXCJjb2x1bW5OYW1lXCIpID0+IEBDb2x1bW4oe25hbWU6IFwiY29sdW1uTmFtZVwifSlcbiAgICBjb25zdCBjb2x1bW5LZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjb2x1bW5LZXkpXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW0obmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbHVtbihvYmo6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzOiBDb2x1bW5PcHRpb25zID0ge307XG4gICAgICAgICAgICBpZiAobmFtZSkgb3B0cy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHBrID0gTWV0YWRhdGEuZ2V0KG9iaiwgXCJwa1wiKTtcbiAgICAgICAgICAgIGlmIChwayAhPT0gcHJvcCkge1xuICAgICAgICAgICAgICBvcHRzLm51bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDb2x1bW4ob3B0cykob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IChhcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBhcmdzWzFdO1xuICAgICAgICAgIHJldHVybiBbY29sdW1uTmFtZV07XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAdW5pcXVlID0+IEBDb2x1bW4oe3VuaXF1ZTogdHJ1ZX0pXG4gICAgY29uc3QgdW5pcXVlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodW5pcXVlS2V5KVxuICAgICAgLmRlZmluZShwcm9wTWV0YWRhdGEodW5pcXVlS2V5LCB7fSkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IHVuaXF1ZTogdHJ1ZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHJlcXVpcmVkID0+IEBDb2x1bW4oeyBudWxsYWJsZTogZmFsc2UgfSlcbiAgICBjb25zdCByZXF1aXJlZEtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihyZXF1aXJlZEtleSlcbiAgICAgIC5leHRlbmQoQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAdmVyc2lvbiA9PiBAVmVyc2lvbkNvbHVtbigpXG4gICAgY29uc3QgdmVyc2lvbktleSA9IFJlcG9zaXRvcnkua2V5KERCS2V5cy5WRVJTSU9OKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih2ZXJzaW9uS2V5KVxuICAgICAgLmRlZmluZSh0eXBlKE51bWJlci5uYW1lKSwgVmVyc2lvbkNvbHVtbigpLCBub1ZhbGlkYXRlT25DcmVhdGUoKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gVmFsaWRhdGlvblVwZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gICAgfVxuXG4gICAgLy8gQHRpbWVzdGFtcChvcCkgPT4gQENyZWF0ZURhdGVDb2x1bW4oKSB8fCBAVXBkYXRlRGF0ZUNvbHVtbigpXG4gICAgY29uc3QgdGltZXN0YW1wS2V5ID0gVmFsaWRhdGlvblVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICAgIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIGRhdGUoZm9ybWF0LCBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgICAgcmVxdWlyZWQoREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgfSksXG4gICAgICAgIG5vVmFsaWRhdGVPbkNyZWF0ZSgpLFxuICAgICAgXTtcbiAgICAgIGlmIChvcGVyYXRpb24uaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHRpbWVzdGFtcEtleSwge1xuICAgICAgICAgICAgbWVzc2FnZTogREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBub1ZhbGlkYXRlT25DcmVhdGVVcGRhdGUoKVxuICAgICAgICApO1xuICAgICAgZWxzZSBkZWNvcmF0b3JzLnB1c2gocmVhZG9ubHkoKSk7XG4gICAgICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycyk7XG4gICAgfVxuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodGltZXN0YW1wS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogdHMsXG4gICAgICB9KVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gdGltZXN0YW1wKC4uLm9wczogT3BlcmF0aW9uS2V5c1tdKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRpbWVzdGFtcChvYmo6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgICAgICBpZiAob3BzLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZURhdGVDb2x1bW4oKShvYmosIHByb3ApO1xuICAgICAgICAgICAgcmV0dXJuIENyZWF0ZURhdGVDb2x1bW4oKShvYmosIHByb3ApO1xuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogKGFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3NbMF07XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAb25lVG9PbmUoY2xhenopID0+IEBPbmVUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBvbmVUb09uZUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihvbmVUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9uZVRvT25lKFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChqb2luQ29sdW1uT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pbkNvbHVtbk9wdHM7XG4gICAgICAgICAgaWYgKGZrKSBtZXRhZGF0YS5uYW1lID0gZms7XG4gICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICB0eXBlKFtcbiAgICAgICAgICAgICAgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lXG4gICAgICAgICAgICAgICAgPyBjbGF6elxuICAgICAgICAgICAgICAgIDogY2xhenoubmFtZSkgYXMgYW55LFxuICAgICAgICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEob25lVG9PbmVLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIE9uZVRvT25lKFxuICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpKS5pZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbcGtdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgSm9pbkNvbHVtbihcbiAgICAgICAgICAgICAgam9pbkNvbHVtbk9wdHMgfHwgbWV0YWRhdGEubmFtZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Q29uc3RyYWludE5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiAodW5kZWZpbmVkIGFzIGFueSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG9uZVRvTWFueShjbGF6eikgPT4gQE9uZVRvTWFueSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBvbmVUb01hbnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvTWFueUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9uZVRvTWFueShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGpvaW5UYWJsZU9wdHMpIG1ldGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGEubmFtZSA9IGZrO1xuXG4gICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICBsaXN0KGNsYXp6KSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb01hbnlLZXksIG1ldGEpLFxuICAgICAgICAgICAgZnVuY3Rpb24gT25lVG9NYW55V3JhcHBlcihvYmo6IGFueSwgcHJvcDogYW55KTogYW55IHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiBPbmVUb01hbnkoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjcm9zc1JlbGF0aW9uS2V5ID0gT2JqZWN0LmtleXMobSkuZmluZCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGssXG4gICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY3MgfHwgIWRlY3MuZGVjb3JhdG9ycyB8fCAhZGVjcy5kZWNvcmF0b3JzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlYyA9IGRlY3MuZGVjb3JhdG9yc1swXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhenogPVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkZWMucHJvcHMuY2xhc3MgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICFkZWMucHJvcHMuY2xhc3MubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZWMucHJvcHMuY2xhc3MoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWMucHJvcHMuY2xhc3M7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6ei5uYW1lID09PSBvYmouY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjcm9zc1JlbGF0aW9uS2V5KVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBgQ3Jvc3MgcmVsYXRpb24gbm90IGZvdW5kLiBEaWQgeW91IHVzZSBAbWFueVRvT25lIG9uIHRoZSAke2NsYXp6Lm5hbWV9P2BcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtjcm9zc1JlbGF0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICAgKShvYmosIHByb3ApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBtYW55VG9PbmUoY2xhenopID0+IEBNYW55VG9PbmUoKCkgPT4gY2xhenopXG4gICAgY29uc3QgbWFueVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihtYW55VG9PbmVLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYW55VG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICAgICAgICBmaz86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogKGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogY2xhenopIGFzIHN0cmluZyxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiTk8gQUNUSU9OXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiTk8gQUNUSU9OXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICB0eXBlKFtcbiAgICAgICAgICAgICAgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lXG4gICAgICAgICAgICAgICAgPyBjbGF6elxuICAgICAgICAgICAgICAgIDogY2xhenoubmFtZSkgYXMgYW55LFxuICAgICAgICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEobWFueVRvT25lS2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBNYW55VG9PbmVXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICByZXR1cm4gTWFueVRvT25lKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpO1xuICAgICAgICAgICAgICAgICAgbGV0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdERlYyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTElTVCksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGlzdERlYylcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBObyBUeXBlIERlZmluaXRpb24gZm91bmQgZm9yICR7a30gaW4gJHttLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBsaXN0RGVjLmNsYXp6WzBdKCkubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIGNyb3NzUmVsYXRpb25LZXkgPSBmaW5kUHJpbWFyeUtleShcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKClcbiAgICAgICAgICAgICAgICAgICAgKS5pZCBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbY3Jvc3NSZWxhdGlvbktleV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICAgICkob2JqLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb01hbnkoY2xhenopID0+IEBNYW55VG9NYW55KCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG1hbnlUb01hbnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19NQU5ZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihtYW55VG9NYW55S2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWFueVRvTWFueShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGpvaW5UYWJsZU9wdHMpIG1ldGFkYXRhLmpvaW5UYWJsZSA9IGpvaW5UYWJsZU9wdHM7XG4gICAgICAgICAgaWYgKGZrKSBtZXRhZGF0YS5uYW1lID0gZms7XG4gICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICBsaXN0KGNsYXp6KSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShtYW55VG9NYW55S2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBNYW55VG9NYW55KFxuICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpKS5pZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbcGtdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgSm9pblRhYmxlKGpvaW5UYWJsZU9wdHMgYXMgYW55KVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAaW5kZXgoKSA9PiBASW5kZXgoKVxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5JTkRFWClcbiAgICAgIC5leHRlbmQoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGluZGV4KFxuICAgICAgICAgIGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdIHwgc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgICAgICAgY29tcG9zaXRpb25zPzogc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgIG5hbWU/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGluZGV4KG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICBuYW1lID0gZGlyZWN0aW9ucztcbiAgICAgICAgICAgICAgZGlyZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgY29tcG9zaXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb3NpdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbmFtZSA9IGNvbXBvc2l0aW9ucztcbiAgICAgICAgICAgICAgY29tcG9zaXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbnMgJiYgZGlyZWN0aW9ucykge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgKGQpID0+XG4gICAgICAgICAgICAgICAgICAgICFbT3JkZXJEaXJlY3Rpb24uQVNDLCBPcmRlckRpcmVjdGlvbi5EU0NdLmluY2x1ZGVzKGQgYXMgYW55KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25zID0gZGlyZWN0aW9ucyBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbnMgJiYgY29tcG9zaXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gSW5kZXgoW3Byb3AsIC4uLmNvbXBvc2l0aW9uc10pKG9iaik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBJbmRleCgpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25UeXBlT1JNQ3JlYXRlVXBkYXRlLCB7fSksXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KSxcbiAgICAgICAgbm9WYWxpZGF0ZU9uQ3JlYXRlKClcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25UeXBlT1JNQ3JlYXRlVXBkYXRlLCB7fSksXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KSxcbiAgICAgICAgbm9WYWxpZGF0ZU9uQ3JlYXRlVXBkYXRlKClcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5UeXBlT1JNQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoVHlwZU9STUZsYXZvdXIpO1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCBcIkBkZWNhZi10cy9jb3JlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9xdWVyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VxdWVuY2VzXCI7XG5leHBvcnQgeyBUeXBlT1JNQWRhcHRlciB9O1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1EaXNwYXRjaFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STVJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlT1JNIGludGVncmF0aW9uIGZvciBEZWNhZi50cy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBUeXBlT1JNLWJhY2tlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGVjYWYudHMgZGF0YSBhY2Nlc3MgYWJzdHJhY3Rpb25zLCBpbmNsdWRpbmcgdGhlIGFkYXB0ZXIsIHJlcG9zaXRvcnksIHN0YXRlbWVudCBidWlsZGVyLCBwYWdpbmF0aW9uIHV0aWxpdGllcywgaW5kZXggaGVscGVycywgYW5kIHR5cGUgZGVmaW5pdGlvbnMuIEtleSBleHBvcnRzIGluY2x1ZGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSwge0BsaW5rIFR5cGVPUk1SZXBvc2l0b3J5fSwge0BsaW5rIFR5cGVPUk1TdGF0ZW1lbnR9LCB7QGxpbmsgVHlwZU9STVBhZ2luYXRvcn0sIGFuZCBpbmRleCBnZW5lcmF0aW9uIHV0aWxpdGllcy5cbiAqIEBtb2R1bGUgZm9yLXR5cGVvcm1cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uLlxuICogQHN1bW1hcnkgVGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBmb3ItdHlwZW9ybSBwYWNrYWdlLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgUEFDS0FHRV9OQU1FXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbIkJhc2VFcnJvciIsIlNRTE9wZXJhdG9yIiwiUGFnaW5hdG9yIiwiTW9kZWxLZXlzIiwiUGFnaW5nRXJyb3IiLCJmaW5kUHJpbWFyeUtleSIsIlF1ZXJ5RXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiUmVwb3NpdG9yeSIsIlJlZmxlY3Rpb24iLCJQZXJzaXN0ZW5jZUtleXMiLCJNb2RlbCIsIlN0YXRlbWVudCIsIk9yZGVyRGlyZWN0aW9uIiwiR3JvdXBPcGVyYXRvciIsIk9wZXJhdG9yIiwiU2VxdWVuY2UiLCJOb3RGb3VuZEVycm9yIiwiRGVmYXVsdFNlcGFyYXRvciIsImVuZm9yY2VEQkRlY29yYXRvcnMiLCJPcGVyYXRpb25LZXlzIiwiVmFsaWRhdGlvbktleXMiLCJUeXBlT1JNUmVwb3NpdG9yeSIsIkNvbnRleHQiLCJWYWxpZGF0aW9uRXJyb3IiLCJfX2RlY29yYXRlIiwidXNlcyIsIkFkYXB0ZXIiLCJFdmVudFN1YnNjcmliZXIiLCJEaXNwYXRjaCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJWYWxpZGF0aW9uIiwiZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSIsIkNvbHVtblR5cGVVbmRlZmluZWRFcnJvciIsIlByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IiLCJEYXRhU291cmNlIiwiQ29uZmxpY3RFcnJvciIsIkluIiwiQ29ubmVjdGlvbkVycm9yIiwiTG9nZ2luZyIsIkRFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJEZWNvcmF0aW9uIiwiREJLZXlzIiwicmVxdWlyZWQiLCJyZWFkb25seSIsInByb3BNZXRhZGF0YSIsInNlcXVlbmNlTmFtZUZvck1vZGVsIiwibm9WYWxpZGF0ZU9uQ3JlYXRlIiwiYXBwbHkiLCJ0eXBlIiwiVmVyc2lvbkNvbHVtbiIsIlVwZGF0ZVZhbGlkYXRpb25LZXlzIiwiZGF0ZSIsIkRCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJub1ZhbGlkYXRlT25DcmVhdGVVcGRhdGUiLCJDYXNjYWRlIiwicHJvcCIsIkpvaW5Db2x1bW4iLCJsaXN0IiwiSm9pblRhYmxlIiwiSW5kZXgiLCJvbkNyZWF0ZSIsIm9uQ3JlYXRlVXBkYXRlIiwiZmluYWwiLCJNZXRhZGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUE7Ozs7O0lBS0c7QUFDSSxVQUFNLGtCQUFrQixHQUM3QjtJQUVGOzs7OztJQUtHO0FBQ0ksVUFBTSxjQUFj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