@ditojs/server 0.271.0 → 0.274.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/lib/app/Application.js +68 -25
  2. package/lib/app/SessionStore.js +3 -1
  3. package/lib/app/Validator.js +16 -2
  4. package/lib/app/index.js +7 -1
  5. package/lib/cli/console.js +14 -4
  6. package/lib/cli/db/createMigration.js +16 -4
  7. package/lib/cli/db/index.js +7 -1
  8. package/lib/cli/db/listAssetConfig.js +4 -2
  9. package/lib/cli/db/migrate.js +3 -3
  10. package/lib/cli/db/reset.js +3 -3
  11. package/lib/cli/db/rollback.js +3 -3
  12. package/lib/cli/db/seed.js +14 -6
  13. package/lib/cli/db/unlock.js +3 -3
  14. package/lib/cli/index.js +9 -5
  15. package/lib/controllers/AdminController.js +18 -6
  16. package/lib/controllers/CollectionController.js +15 -1
  17. package/lib/controllers/Controller.js +28 -4
  18. package/lib/controllers/ControllerAction.js +18 -6
  19. package/lib/controllers/RelationController.js +9 -3
  20. package/lib/controllers/UserController.js +15 -1
  21. package/lib/controllers/index.js +7 -1
  22. package/lib/decorators/index.js +7 -1
  23. package/lib/decorators/parameters.js +4 -2
  24. package/lib/decorators/returns.js +4 -2
  25. package/lib/errors/DatabaseError.js +5 -19
  26. package/lib/errors/ResponseError.js +4 -14
  27. package/lib/errors/index.js +7 -1
  28. package/lib/graph/DitoGraphProcessor.js +5 -1
  29. package/lib/graph/expression.js +5 -1
  30. package/lib/graph/graph.js +18 -2
  31. package/lib/graph/index.js +7 -1
  32. package/lib/index.js +7 -1
  33. package/lib/lib/index.js +7 -1
  34. package/lib/middleware/findRoute.js +7 -1
  35. package/lib/middleware/index.js +7 -1
  36. package/lib/middleware/logRequests.js +4 -4
  37. package/lib/mixins/AssetMixin.js +4 -4
  38. package/lib/mixins/SessionMixin.js +4 -4
  39. package/lib/mixins/TimeStampedMixin.js +4 -4
  40. package/lib/mixins/UserMixin.js +10 -4
  41. package/lib/mixins/index.js +7 -1
  42. package/lib/models/Model.js +41 -22
  43. package/lib/models/definitions/filters.js +9 -1
  44. package/lib/models/definitions/properties.js +7 -1
  45. package/lib/models/definitions/scopes.js +9 -1
  46. package/lib/models/index.js +7 -1
  47. package/lib/query/QueryBuilder.js +11 -1
  48. package/lib/query/QueryFilters.js +11 -1
  49. package/lib/query/index.js +7 -1
  50. package/lib/schema/formats/index.js +7 -1
  51. package/lib/schema/index.js +10 -2
  52. package/lib/schema/keywords/index.js +7 -1
  53. package/lib/schema/properties.js +11 -1
  54. package/lib/schema/relations.js +18 -4
  55. package/lib/services/index.js +7 -1
  56. package/lib/storage/DiskStorage.js +7 -1
  57. package/lib/storage/Storage.js +5 -1
  58. package/lib/storage/index.js +7 -1
  59. package/lib/utils/emitter.js +5 -1
  60. package/lib/utils/index.js +15 -1
  61. package/lib/utils/json.js +9 -0
  62. package/lib/utils/object.js +9 -3
  63. package/package.json +31 -31
  64. package/src/app/Application.js +40 -11
  65. package/src/app/Validator.js +2 -1
  66. package/src/cli/console.js +3 -3
  67. package/src/cli/db/createMigration.js +3 -3
  68. package/src/cli/db/listAssetConfig.js +3 -1
  69. package/src/cli/db/migrate.js +4 -4
  70. package/src/cli/db/reset.js +4 -4
  71. package/src/cli/db/rollback.js +4 -4
  72. package/src/cli/db/seed.js +6 -6
  73. package/src/cli/db/unlock.js +2 -2
  74. package/src/cli/index.js +3 -3
  75. package/src/controllers/AdminController.js +3 -2
  76. package/src/controllers/Controller.js +8 -8
  77. package/src/controllers/ControllerAction.js +7 -5
  78. package/src/controllers/RelationController.js +2 -2
  79. package/src/decorators/parameters.js +2 -2
  80. package/src/decorators/returns.js +2 -2
  81. package/src/errors/DatabaseError.js +2 -23
  82. package/src/errors/ResponseError.js +1 -8
  83. package/src/middleware/logRequests.js +9 -9
  84. package/src/models/Model.js +13 -8
  85. package/src/utils/index.js +1 -0
  86. package/src/utils/json.js +3 -0
@@ -3,6 +3,26 @@
3
3
  exports.__esModule = true;
4
4
  exports.Application = void 0;
5
5
 
6
+ require("core-js/modules/esnext.async-iterator.filter.js");
7
+
8
+ require("core-js/modules/esnext.iterator.constructor.js");
9
+
10
+ require("core-js/modules/esnext.iterator.filter.js");
11
+
12
+ require("core-js/modules/es.error.cause.js");
13
+
14
+ require("core-js/modules/esnext.async-iterator.reduce.js");
15
+
16
+ require("core-js/modules/esnext.iterator.reduce.js");
17
+
18
+ require("core-js/modules/esnext.async-iterator.find.js");
19
+
20
+ require("core-js/modules/esnext.iterator.find.js");
21
+
22
+ require("core-js/modules/esnext.async-iterator.map.js");
23
+
24
+ require("core-js/modules/esnext.iterator.map.js");
25
+
6
26
  var _koa = _interopRequireDefault(require("koa"));
7
27
 
8
28
  var _knex2 = _interopRequireDefault(require("knex"));
@@ -11,7 +31,7 @@ var _util = _interopRequireDefault(require("util"));
11
31
 
12
32
  var _axios = _interopRequireDefault(require("axios"));
13
33
 
14
- var _chalk = _interopRequireDefault(require("chalk"));
34
+ var _picocolors = _interopRequireDefault(require("picocolors"));
15
35
 
16
36
  var _zlib = _interopRequireDefault(require("zlib"));
17
37
 
@@ -53,6 +73,8 @@ var _storage = require("../storage");
53
73
 
54
74
  var _schema = require("../schema");
55
75
 
76
+ var _utils = require("../utils");
77
+
56
78
  var _errors = require("../errors");
57
79
 
58
80
  var _SessionStore = _interopRequireDefault(require("./SessionStore"));
@@ -61,7 +83,7 @@ var _Validator = require("./Validator");
61
83
 
62
84
  var _middleware = require("../middleware");
63
85
 
64
- var _utils = require("@ditojs/utils");
86
+ var _utils2 = require("@ditojs/utils");
65
87
 
66
88
  var _objection = require("objection");
67
89
 
@@ -131,7 +153,7 @@ class Application extends _koa.default {
131
153
  }
132
154
 
133
155
  addRoute(verb, path, transacted, handlers, controller = null, action = null) {
134
- handlers = (0, _utils.asArray)(handlers);
156
+ handlers = (0, _utils2.asArray)(handlers);
135
157
  const handler = handlers.length > 1 ? (0, _koaCompose.default)(handlers) : handlers[0];
136
158
  const route = {
137
159
  verb,
@@ -166,7 +188,7 @@ class Application extends _koa.default {
166
188
 
167
189
  if (log.schema || log.relations) {
168
190
  for (const modelClass of sortedModels) {
169
- const shouldLog = option => option === true || (0, _utils.asArray)(option).includes(modelClass.name);
191
+ const shouldLog = option => option === true || (0, _utils2.asArray)(option).includes(modelClass.name);
170
192
 
171
193
  const data = {};
172
194
 
@@ -175,11 +197,11 @@ class Application extends _koa.default {
175
197
  }
176
198
 
177
199
  if (shouldLog(log.relations)) {
178
- data.relations = (0, _utils.clone)(modelClass.relationMappings, value => _objection.Model.isPrototypeOf(value) ? `[Model: ${value.name}]` : value);
200
+ data.relations = (0, _utils2.clone)(modelClass.relationMappings, value => _objection.Model.isPrototypeOf(value) ? `[Model: ${value.name}]` : value);
179
201
  }
180
202
 
181
203
  if (Object.keys(data).length > 0) {
182
- console.info(_chalk.default.yellow.bold(`\n${modelClass.name}:\n`), _util.default.inspect(data, {
204
+ console.info(_picocolors.default.yellow.bold(`\n${modelClass.name}:\n`), _util.default.inspect(data, {
183
205
  colors: true,
184
206
  depth: null,
185
207
  maxArrayLength: null
@@ -247,7 +269,7 @@ class Application extends _koa.default {
247
269
 
248
270
  addServices(services) {
249
271
  for (const [name, service] of Object.entries(services)) {
250
- if (name === 'default' && (0, _utils.isPlainObject)(service)) {
272
+ if (name === 'default' && (0, _utils2.isPlainObject)(service)) {
251
273
  this.addServices(service);
252
274
  } else {
253
275
  this.addService(service, name);
@@ -294,7 +316,7 @@ class Application extends _koa.default {
294
316
 
295
317
  addControllers(controllers, namespace) {
296
318
  for (const [key, value] of Object.entries(controllers)) {
297
- if ((0, _utils.isPlainObject)(value)) {
319
+ if ((0, _utils2.isPlainObject)(value)) {
298
320
  this.addControllers(value, namespace ? `${namespace}/${key}` : key);
299
321
  } else {
300
322
  this.addController(value, namespace);
@@ -367,7 +389,7 @@ class Application extends _koa.default {
367
389
 
368
390
  if (property && index === 0) {
369
391
  const normalizedName = normalizeDbNames ? this.normalizeIdentifier(name) : name;
370
- const dataPath = (0, _utils.normalizeDataPath)([normalizedName, ...(0, _utils.parseDataPath)(nestedDataPath)]);
392
+ const dataPath = (0, _utils2.normalizeDataPath)([normalizedName, ...(0, _utils2.parseDataPath)(nestedDataPath)]);
371
393
  const assetConfigs = convertedAssets[normalizedName] || (convertedAssets[normalizedName] = {});
372
394
  assetConfigs[dataPath] = config;
373
395
  } else {
@@ -391,7 +413,7 @@ class Application extends _koa.default {
391
413
  addStorage(config, name) {
392
414
  let storage = null;
393
415
 
394
- if ((0, _utils.isPlainObject)(config)) {
416
+ if ((0, _utils2.isPlainObject)(config)) {
395
417
  const storageClass = _storage.Storage.get(config.type);
396
418
 
397
419
  if (!storageClass) {
@@ -443,14 +465,14 @@ class Application extends _koa.default {
443
465
 
444
466
  let asObject = false;
445
467
 
446
- if ((0, _utils.isArray)(parameters)) {
468
+ if ((0, _utils2.isArray)(parameters)) {
447
469
  for (const {
448
470
  name,
449
471
  ...schema
450
472
  } of parameters) {
451
473
  addParameter(name, schema);
452
474
  }
453
- } else if ((0, _utils.isObject)(parameters)) {
475
+ } else if ((0, _utils2.isObject)(parameters)) {
454
476
  asObject = true;
455
477
 
456
478
  for (const [name, schema] of Object.entries(parameters)) {
@@ -485,12 +507,26 @@ class Application extends _koa.default {
485
507
  type,
486
508
  message,
487
509
  errors,
488
- options
510
+ options,
511
+ json
489
512
  }) {
513
+ var _this$config$log$erro;
514
+
490
515
  return new _errors.ValidationError({
491
516
  type,
492
517
  message,
493
- errors: this.validator.parseErrors(errors, options)
518
+ errors: this.validator.parseErrors(errors, options),
519
+ json: (_this$config$log$erro = this.config.log.errors) != null && _this$config$log$erro.json ? json : undefined
520
+ });
521
+ }
522
+
523
+ createDatabaseError(error) {
524
+ var _this$config$log$erro2;
525
+
526
+ const [, sql, message] = error.message.match(/^([\s\S]*) - ([\s\S]*?)$/) || [null, null, error.message];
527
+ return new _errors.DatabaseError(error, {
528
+ message,
529
+ sql: (_this$config$log$erro2 = this.config.log.errors) != null && _this$config$log$erro2.sql ? sql : undefined
494
530
  });
495
531
  }
496
532
 
@@ -500,7 +536,6 @@ class Application extends _koa.default {
500
536
  log
501
537
  } = this.config;
502
538
  this.use((0, _middleware.attachLogger)(this.logger));
503
- this.use((0, _middleware.handleError)());
504
539
 
505
540
  if (app.responseTime !== false) {
506
541
  this.use((0, _koaResponseTime.default)(getOptions(app.responseTime)));
@@ -510,6 +545,8 @@ class Application extends _koa.default {
510
545
  this.use((0, _middleware.logRequests)());
511
546
  }
512
547
 
548
+ this.use((0, _middleware.handleError)());
549
+
513
550
  if (app.helmet !== false) {
514
551
  this.use((0, _koaHelmet.default)(getOptions(app.helmet)));
515
552
  }
@@ -519,7 +556,7 @@ class Application extends _koa.default {
519
556
  }
520
557
 
521
558
  if (app.compress !== false) {
522
- this.use((0, _koaCompress.default)((0, _utils.merge)({
559
+ this.use((0, _koaCompress.default)((0, _utils2.merge)({
523
560
  br: {
524
561
  params: {
525
562
  [_zlib.default.constants.BROTLI_PARAM_QUALITY]: 4
@@ -588,7 +625,7 @@ class Application extends _koa.default {
588
625
  res,
589
626
  user
590
627
  };
591
- const logger = (0, _pino.default)((0, _utils.merge)({
628
+ const logger = (0, _pino.default)((0, _utils2.merge)({
592
629
  level: 'info',
593
630
  serializers,
594
631
  prettyPrint: {
@@ -622,6 +659,12 @@ class Application extends _koa.default {
622
659
 
623
660
  this.knex = (0, _knex2.default)(knex);
624
661
 
662
+ if (knex.client === 'postgresql' && knex.typeParsers) {
663
+ for (const [type, parser] of Object.entries(knex.typeParsers)) {
664
+ this.knex.client.driver.types.setTypeParser(type, parser);
665
+ }
666
+ }
667
+
625
668
  if (log.sql) {
626
669
  this.setupKnexLogging();
627
670
  }
@@ -680,15 +723,15 @@ class Application extends _koa.default {
680
723
  }
681
724
 
682
725
  normalizePath(path) {
683
- return this.config.app.normalizePaths ? (0, _utils.hyphenate)(path) : path;
726
+ return this.config.app.normalizePaths ? (0, _utils2.hyphenate)(path) : path;
684
727
  }
685
728
 
686
729
  formatError(err) {
687
- var _this$config$log$erro;
730
+ var _this$config$log$erro3;
688
731
 
689
- const message = err.toJSON ? JSON.stringify(err.toJSON(), null, 2) : err.message || err;
732
+ const message = err.toJSON ? (0, _utils.formatJson)(err.toJSON()) : err.message || err;
690
733
  const str = `${err.name}: ${message}`;
691
- return err.stack && ((_this$config$log$erro = this.config.log.errors) == null ? void 0 : _this$config$log$erro.stack) !== false ? `${str}\n${err.stack.split(/\n|\r\n|\r/).slice(1).join(_os.default.EOL)}` : str;
734
+ return err.stack && ((_this$config$log$erro3 = this.config.log.errors) == null ? void 0 : _this$config$log$erro3.stack) !== false ? `${str}\n${err.stack.split(/\n|\r\n|\r/).slice(1).join(_os.default.EOL)}` : str;
692
735
  }
693
736
 
694
737
  logError(err, ctx) {
@@ -793,7 +836,7 @@ class Application extends _koa.default {
793
836
  cleanupTimeThreshold = 0
794
837
  } = {}
795
838
  } = this.config;
796
- const timeThreshold = (0, _utils.isString)(cleanupTimeThreshold) ? (0, _parseDuration.default)(cleanupTimeThreshold) : cleanupTimeThreshold;
839
+ const timeThreshold = (0, _utils2.isString)(cleanupTimeThreshold) ? (0, _parseDuration.default)(cleanupTimeThreshold) : cleanupTimeThreshold;
797
840
  const importedFiles = [];
798
841
  const AssetModel = this.getModel('Asset');
799
842
 
@@ -830,7 +873,7 @@ class Application extends _koa.default {
830
873
  } = file;
831
874
 
832
875
  if (!data) {
833
- console.info(`${_chalk.default.red('INFO:')} Asset ${_chalk.default.green(`'${file.name}'`)} is from a foreign source, fetching from ${_chalk.default.green(`'${file.url}'`)} and adding to storage ${_chalk.default.green(`'${storage.name}'`)}...`);
876
+ console.info(`${_picocolors.default.red('INFO:')} Asset ${_picocolors.default.green(`'${file.name}'`)} is from a foreign source, fetching from ${_picocolors.default.green(`'${file.url}'`)} and adding to storage ${_picocolors.default.green(`'${storage.name}'`)}...`);
834
877
  const response = await _axios.default.request({
835
878
  method: 'get',
836
879
  url: file.url,
@@ -913,6 +956,6 @@ exports.Application = Application;
913
956
  _lib.EventEmitter.mixin(Application.prototype);
914
957
 
915
958
  function getOptions(options) {
916
- return (0, _utils.isObject)(options) ? options : {};
959
+ return (0, _utils2.isObject)(options) ? options : {};
917
960
  }
918
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsImNoYWxrIiwieWVsbG93IiwiYm9sZCIsInV0aWwiLCJpbnNwZWN0IiwiY29sb3JzIiwiZGVwdGgiLCJtYXhBcnJheUxlbmd0aCIsIkVycm9yIiwic29ydEJ5UmVsYXRpb25zIiwibGlzdCIsImNvbGxlY3RlZCIsImV4Y2x1ZGVkIiwicmVsYXRpb24iLCJnZXRSZWxhdGlvbnMiLCJCZWxvbmdzVG9PbmVSZWxhdGlvbiIsInJlbGF0ZWRNb2RlbENsYXNzIiwiam9pblRhYmxlTW9kZWxDbGFzcyIsInJlbGF0ZWQiLCJyZXZlcnNlIiwicmVkdWNlIiwiZ2V0TW9kZWwiLCJlbmRzV2l0aCIsImZpbmRNb2RlbCIsImNhbGxiYWNrIiwiZmluZCIsInNlcnZpY2UiLCJlbnRyaWVzIiwiYWRkU2VydmljZSIsIlNlcnZpY2UiLCJ1bmRlZmluZWQiLCJnZXRTZXJ2aWNlIiwiZmluZFNlcnZpY2UiLCJmb3JFYWNoU2VydmljZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJuYW1lc3BhY2UiLCJrZXkiLCJhZGRDb250cm9sbGVyIiwic2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSIsIkNvbnRyb2xsZXIiLCJ1cmwiLCJjb21wb3NlIiwiZ2V0Q29udHJvbGxlciIsImZpbmRDb250cm9sbGVyIiwiZ2V0QWRtaW5Db250cm9sbGVyIiwiQWRtaW5Db250cm9sbGVyIiwiZ2V0QWRtaW5WdWVDb25maWciLCJnZXRWdWVDb25maWciLCJnZXRBc3NldENvbmZpZyIsIm5vcm1hbGl6ZURiTmFtZXMiLCJhc3NldENvbmZpZyIsIm1vZGVsTmFtZSIsImFzc2V0cyIsImRlZmluaXRpb24iLCJub3JtYWxpemVkTW9kZWxOYW1lIiwibm9ybWFsaXplSWRlbnRpZmllciIsImNvbnZlcnRlZEFzc2V0cyIsImFzc2V0RGF0YVBhdGgiLCJwcm9wZXJ0eSIsIm5lc3RlZERhdGFQYXRoIiwiaW5kZXgiLCJnZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoIiwibm9ybWFsaXplZE5hbWUiLCJkYXRhUGF0aCIsImFzc2V0Q29uZmlncyIsImFkZFN0b3JhZ2UiLCJzdG9yYWdlIiwic3RvcmFnZUNsYXNzIiwiU3RvcmFnZSIsImdldCIsInR5cGUiLCJnZXRTdG9yYWdlIiwiY29tcGlsZVZhbGlkYXRvciIsImpzb25TY2hlbWEiLCJvcHRpb25zIiwiY29tcGlsZSIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwicGFyYW1ldGVycyIsImRhdGFOYW1lIiwicHJvcGVydGllcyIsImFkZFBhcmFtZXRlciIsInB1c2giLCJtZW1iZXIiLCJhc09iamVjdCIsInZhbGlkYXRlIiwiY29lcmNlVHlwZXMiLCJjdHgiLCJjYWxsIiwiY3JlYXRlVmFsaWRhdGlvbkVycm9yIiwibWVzc2FnZSIsImVycm9ycyIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwic3FsIiwic2V0dXBLbmV4TG9nZ2luZyIsInN0YXJ0VGltZXMiLCJlbmQiLCJxdWVyeSIsInJlc3BvbnNlIiwiZXJyb3IiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0ciIsInN0YWNrIiwic3BsaXQiLCJzbGljZSIsImpvaW4iLCJvcyIsIkVPTCIsImxvZ0Vycm9yIiwiZXhwb3NlIiwidGV4dCIsIlJlc3BvbnNlRXJyb3IiLCJzdGF0dXMiLCJlIiwic3RhcnQiLCJlbWl0Iiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJyZXNvbHZlIiwicmVqZWN0IiwibGlzdGVuIiwiYWRkcmVzcyIsInN0b3AiLCJjbG9zZSIsInNldEltbWVkaWF0ZSIsIm9mZiIsInN0YXJ0T3JFeGl0IiwiZXhpdCIsImNyZWF0ZUFzc2V0cyIsImZpbGVzIiwiY291bnQiLCJ0cngiLCJBc3NldE1vZGVsIiwiZmlsZSIsImluc2VydCIsImhhbmRsZUFkZGRlZEFuZFJlbW92ZWRBc3NldHMiLCJhZGRlZEZpbGVzIiwicmVtb3ZlZEZpbGVzIiwiY2xlYW51cFRpbWVUaHJlc2hvbGQiLCJ0aW1lVGhyZXNob2xkIiwiaW1wb3J0ZWRGaWxlcyIsImFkZEZvcmVpZ25Bc3NldHMiLCJjaGFuZ2VDb3VudCIsImluY3JlbWVudCIsIndoZXJlSW4iLCJzZXRUaW1lb3V0IiwicmVsZWFzZVVudXNlZEFzc2V0cyIsImFzc2V0IiwiZmluZE9uZSIsInJlZCIsImdyZWVuIiwiYXhpb3MiLCJyZXF1ZXN0IiwibWV0aG9kIiwicmVzcG9uc2VUeXBlIiwiaW1wb3J0ZWRGaWxlIiwiYWRkRmlsZSIsImFzc2lnbiIsIkFzc2V0RXJyb3IiLCJoYW5kbGVNb2RpZmllZEFzc2V0cyIsIm1vZGlmaWVkRmlsZXMiLCJjaGFuZ2VkRmlsZSIsInRyYW5zYWN0aW9uIiwiZGF0ZSIsIkRhdGUiLCJzZXRNaWxsaXNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJvcnBoYW5lZEFzc2V0cyIsIndoZXJlIiwiYW5kV2hlcmUiLCJvcnBoYW5lZEtleXMiLCJyZW1vdmVGaWxlIiwiZGVsZXRlIiwiRXZlbnRFbWl0dGVyIiwibWl4aW4iLCJwcm90b3R5cGUiXSwi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V0FOaUIsRUFNSixHQU5JLEVBTUMsb0JBQUksV0FBSixDQU5ELENBQTdCOztBQU9BLFlBQUlGLGNBQWMsQ0FBQ3pQLE1BQWYsR0FBd0IsQ0FBNUIsRUFBK0I7QUFDN0IsZ0JBQU00UCxZQUFZLEdBQUcsTUFBTWhNLE9BQU8sQ0FBQ0MsR0FBUixDQUN6QjRMLGNBQWMsQ0FBQzNMLEdBQWYsQ0FBbUIsTUFBTXVLLEtBQU4sSUFBZTtBQUNoQyxnQkFBSTtBQUNGLG9CQUFNLEtBQUtsSSxVQUFMLENBQWdCa0ksS0FBSyxDQUFDdkksT0FBdEIsRUFBK0IrSixVQUEvQixDQUEwQ3hCLEtBQUssQ0FBQ2QsSUFBaEQsQ0FBTjtBQUNELGFBRkQsQ0FFRSxPQUFPdEQsS0FBUCxFQUFjO0FBQ2QsbUJBQUttQyxJQUFMLENBQVUsT0FBVixFQUFtQm5DLEtBQW5CO0FBQ0FvRSxjQUFBQSxLQUFLLENBQUNwRSxLQUFOLEdBQWNBLEtBQWQ7QUFDRDs7QUFDRCxtQkFBT29FLEtBQUssQ0FBQ3JLLEdBQWI7QUFDRCxXQVJELENBRHlCLENBQTNCO0FBV0EsZ0JBQU1zSixVQUFVLENBQ2J2RCxLQURHLENBQ0dzRCxHQURILEVBRUh5QyxNQUZHLEdBR0g1QixPQUhHLENBR0ssS0FITCxFQUdZMEIsWUFIWixDQUFOO0FBSUQ7O0FBQ0QsZUFBT0gsY0FBUDtBQUNELE9BOUJNLENBQVA7QUErQkQ7QUFDRjs7QUF4M0JrQzs7OztBQTYzQnJDTSxrQkFBYUMsS0FBYixDQUFtQjNTLFdBQVcsQ0FBQzRTLFNBQS9COztBQUVBLFNBQVN0SSxVQUFULENBQW9CckIsT0FBcEIsRUFBNkI7QUFDM0IsU0FBTyxxQkFBU0EsT0FBVCxJQUFvQkEsT0FBcEIsR0FBOEIsRUFBckM7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBLb2EgZnJvbSAna29hJ1xuaW1wb3J0IEtuZXggZnJvbSAna25leCdcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgemxpYiBmcm9tICd6bGliJ1xuaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBvcyBmcm9tICdvcydcbmltcG9ydCBwYXJzZUR1cmF0aW9uIGZyb20gJ3BhcnNlLWR1cmF0aW9uJ1xuaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAna29hLWJvZHlwYXJzZXInXG5pbXBvcnQgY29ycyBmcm9tICdAa29hL2NvcnMnXG5pbXBvcnQgY29tcG9zZSBmcm9tICdrb2EtY29tcG9zZSdcbmltcG9ydCBjb21wcmVzcyBmcm9tICdrb2EtY29tcHJlc3MnXG5pbXBvcnQgY29uZGl0aW9uYWwgZnJvbSAna29hLWNvbmRpdGlvbmFsLWdldCdcbmltcG9ydCBwYXNzcG9ydCBmcm9tICdrb2EtcGFzc3BvcnQnXG5pbXBvcnQgc2Vzc2lvbiBmcm9tICdrb2Etc2Vzc2lvbidcbmltcG9ydCBldGFnIGZyb20gJ2tvYS1ldGFnJ1xuaW1wb3J0IGhlbG1ldCBmcm9tICdrb2EtaGVsbWV0J1xuaW1wb3J0IHJlc3BvbnNlVGltZSBmcm9tICdrb2EtcmVzcG9uc2UtdGltZSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGRpdG9qcy9yb3V0ZXInXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAL2xpYidcbmltcG9ydCB7IENvbnRyb2xsZXIsIEFkbWluQ29udHJvbGxlciB9IGZyb20gJ0AvY29udHJvbGxlcnMnXG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnQC9zZXJ2aWNlcydcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAL3N0b3JhZ2UnXG5pbXBvcnQgeyBjb252ZXJ0U2NoZW1hIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBSZXNwb25zZUVycm9yLCBWYWxpZGF0aW9uRXJyb3IsIEFzc2V0RXJyb3IgfSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93LmJvbGQoYFxcbiR7bW9kZWxDbGFzcy5uYW1lfTpcXG5gKSxcbiAgICAgICAgICAgIHV0aWwuaW5zcGVjdChkYXRhLCB7XG4gICAgICAgICAgICAgIGNvbG9yczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IG51bGwsXG4gICAgICAgICAgICAgIG1heEFycmF5TGVuZ3RoOiBudWxsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZE1vZGVsKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoTW9kZWwuaXNQcm90b3R5cGVPZihtb2RlbENsYXNzKSkge1xuICAgICAgbW9kZWxDbGFzcy5hcHAgPSB0aGlzXG4gICAgICB0aGlzLm1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7bW9kZWxDbGFzc31gKVxuICAgIH1cbiAgfVxuXG4gIHNvcnRNb2RlbHMobW9kZWxzKSB7XG4gICAgY29uc3Qgc29ydEJ5UmVsYXRpb25zID0gKGxpc3QsIGNvbGxlY3RlZCA9IHt9LCBleGNsdWRlZCA9IHt9KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgaWYgKCFjb2xsZWN0ZWRbbmFtZV0gJiYgIWV4Y2x1ZGVkW25hbWVdKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zKCkpKSB7XG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbiBpbnN0YW5jZW9mIEJlbG9uZ3NUb09uZVJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IHJlbGF0ZWRNb2RlbENsYXNzLCBqb2luVGFibGVNb2RlbENsYXNzIH0gPSByZWxhdGlvblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgW2pvaW5UYWJsZU1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbENsYXNzXSkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc2VsZi1yZWZlcmVuY2VzIGFuZCBnZW5lcmF0ZWQgam9pbiBtb2RlbHM6XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWQgJiYgcmVsYXRlZCAhPT0gbW9kZWxDbGFzcyAmJiBtb2RlbHNbcmVsYXRlZC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgc29ydEJ5UmVsYXRpb25zKFtyZWxhdGVkXSwgY29sbGVjdGVkLCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgbW9kZWxDbGFzcyB0byBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uczpcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdOiBtb2RlbENsYXNzLFxuICAgICAgICAgICAgICAgICAgICAuLi5leGNsdWRlZFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdGVkW25hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb2xsZWN0ZWQpXG4gICAgfVxuICAgIC8vIFJldHVybiBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc29ydGVkIG1vZGVscyBhcyBpdHMga2V5L3ZhbHVlIHBhaXJzLlxuICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gcmV2ZXJzZSBmb3IgdGhlIGFib3ZlIGFsZ29yaXRobSB0byBzb3J0IHByb3Blcmx5LFxuICAgIC8vIGFuZCB0aGVuIHJldmVyc2UgdGhlIHJlc3VsdCBiYWNrLlxuICAgIHJldHVybiBzb3J0QnlSZWxhdGlvbnMoT2JqZWN0LnZhbHVlcyhtb2RlbHMpLnJldmVyc2UoKSkucmV2ZXJzZSgpLnJlZHVjZShcbiAgICAgIChtb2RlbHMsIG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIHJldHVybiBtb2RlbHNcbiAgICAgIH0sXG4gICAgICBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgKVxuICB9XG5cbiAgZ2V0TW9kZWwobmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGVsc1tuYW1lXSB8fFxuICAgICAgIW5hbWUuZW5kc1dpdGgoJ01vZGVsJykgJiYgdGhpcy5tb2RlbHNbYCR7bmFtZX1Nb2RlbGBdIHx8XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZmluZE1vZGVsKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBhZGRTZXJ2aWNlcyhzZXJ2aWNlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHNlcnZpY2VdIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgICAgLy8gSGFuZGxlIEVTNiBtb2R1bGUgd2VpcmRuZXNzIHRoYXQgY2FuIGhhcHBlbiwgYXBwYXJlbnRseTpcbiAgICAgIGlmIChuYW1lID09PSAnZGVmYXVsdCcgJiYgaXNQbGFpbk9iamVjdChzZXJ2aWNlKSkge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoU2VydmljZS5pc1Byb3RvdHlwZU9mKHNlcnZpY2UpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc2VydmljZSA9IG5ldyBzZXJ2aWNlKHRoaXMsIG5hbWUpXG4gICAgfVxuICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2U6ICR7c2VydmljZX1gKVxuICAgIH1cbiAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIGBzZXJ2aWNlLm5hbWVgIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgICAvLyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGUuZy4gd2l0aCBhbiBhZnRlci1jb25zdHJ1Y3RvciBjbGFzcyBwcm9wZXJ0eS5cbiAgICAoeyBuYW1lIH0gPSBzZXJ2aWNlKVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZpY2VzW25hbWVdXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gbWlzc2luZyBmb3Igc2VydmljZSAnJHtuYW1lfSdgKVxuICAgIH1cbiAgICAvLyBBcyBhIGNvbnZlbnRpb24sIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgc2VydmljZSBjYW4gYmUgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyBpbiBvcmRlciB0byBlbnRpcmVseSBkZWFjdGl2YXRlIHRoZSBzZXJ2aWNlLlxuICAgIGlmIChjb25maWcgIT09IGZhbHNlKSB7XG4gICAgICBzZXJ2aWNlLnNldHVwKGNvbmZpZylcbiAgICAgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBzZXJ2aWNlXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgc2VydmljZSBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgICAvLyBvdmVycmlkZGVuIGJ5IHNlcnZpY2VzLlxuICAgICAgc2VydmljZS5pbml0aWFsaXplKClcbiAgICB9XG4gIH1cblxuICBnZXRTZXJ2aWNlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBmaW5kU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBmb3JFYWNoU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLm1hcChjYWxsYmFjaykpXG4gIH1cblxuICBhZGRDb250cm9sbGVycyhjb250cm9sbGVycywgbmFtZXNwYWNlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udHJvbGxlcnMpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVycyh2YWx1ZSwgbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfS8ke2tleX1gIDoga2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVyKHZhbHVlLCBuYW1lc3BhY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyLCBuYW1lc3BhY2UpIHtcbiAgICAvLyBDb250cm9sbGVycyByZXF1aXJlIGFkZGl0aW9uYWwgbWlkZGxld2FyZSB0byBiZSBpbnN0YWxsZWQgb25jZS5cbiAgICB0aGlzLnNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKVxuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChDb250cm9sbGVyLmlzUHJvdG90eXBlT2YoY29udHJvbGxlcikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBjb250cm9sbGVyID0gbmV3IGNvbnRyb2xsZXIodGhpcywgbmFtZXNwYWNlKVxuICAgIH1cbiAgICBpZiAoIShjb250cm9sbGVyIGluc3RhbmNlb2YgQ29udHJvbGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9YClcbiAgICB9XG4gICAgLy8gSW5oZXJpdGFuY2Ugb2YgYWN0aW9uIG1ldGhvZHMgY2Fubm90IGhhcHBlbiBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmLFxuICAgIC8vIHNvIGNhbGwgc2VwYXJhdGUgYHNldHVwKClgIG1ldGhvZCBhZnRlciBpbiBvcmRlciB0byB0YWtlIGNhcmUgb2YgaXQuXG4gICAgY29udHJvbGxlci5zZXR1cCgpXG4gICAgdGhpcy5jb250cm9sbGVyc1tjb250cm9sbGVyLnVybF0gPSBjb250cm9sbGVyXG4gICAgLy8gTm93IHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgIC8vIG92ZXJyaWRkZW4gYnkgY29udHJvbGxlcnMuXG4gICAgY29udHJvbGxlci5pbml0aWFsaXplKClcbiAgICAvLyBFYWNoIGNvbnRyb2xsZXIgY2FuIGFsc28gcHJvdmlkZSBmdXJ0aGVyIG1pZGRsZXdhcmUsIGUuZy5cbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYDpcbiAgICBjb25zdCBtaWRkbGV3YXJlID0gY29udHJvbGxlci5jb21wb3NlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gIH1cblxuICBnZXRDb250cm9sbGVyKHVybCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzW3VybF0gfHwgbnVsbFxuICB9XG5cbiAgZmluZENvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbnRyb2xsZXJzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZ2V0QWRtaW5Db250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmRDb250cm9sbGVyKFxuICAgICAgY29udHJvbGxlciA9PiBjb250cm9sbGVyIGluc3RhbmNlb2YgQWRtaW5Db250cm9sbGVyXG4gICAgKVxuICB9XG5cbiAgZ2V0QWRtaW5WdWVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWRtaW5Db250cm9sbGVyKCk/LmdldFZ1ZUNvbmZpZygpIHx8IG51bGxcbiAgfVxuXG4gIGdldEFzc2V0Q29uZmlnKHtcbiAgICBtb2RlbHMgPSBPYmplY3Qua2V5cyh0aGlzLm1vZGVscyksXG4gICAgbm9ybWFsaXplRGJOYW1lcyA9IHRoaXMuY29uZmlnLmtuZXgubm9ybWFsaXplRGJOYW1lc1xuICB9ID0ge30pIHtcbiAgICBjb25zdCBhc3NldENvbmZpZyA9IHt9XG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgb2YgbW9kZWxzKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5tb2RlbHNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgeyBhc3NldHMgfSA9IG1vZGVsQ2xhc3MuZGVmaW5pdGlvblxuICAgICAgaWYgKGFzc2V0cykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTW9kZWxOYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG1vZGVsTmFtZSlcbiAgICAgICAgICA6IG1vZGVsTmFtZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRBc3NldHMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFthc3NldERhdGFQYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfSA9IG1vZGVsQ2xhc3MuZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aChhc3NldERhdGFQYXRoKVxuICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG5hbWUpXG4gICAgICAgICAgICAgIDogbmFtZVxuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBub3JtYWxpemVEYXRhUGF0aChbXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAuLi5wYXJzZURhdGFQYXRoKG5lc3RlZERhdGFQYXRoKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0Q29uZmlncyA9IGNvbnZlcnRlZEFzc2V0c1tub3JtYWxpemVkTmFtZV0gfHw9IHt9XG4gICAgICAgICAgICBhc3NldENvbmZpZ3NbZGF0YVBhdGhdID0gY29uZmlnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGVkIGdyYXBoIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXRDb25maWdbbm9ybWFsaXplZE1vZGVsTmFtZV0gPSBjb252ZXJ0ZWRBc3NldHNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0Q29uZmlnXG4gIH1cblxuICBhZGRTdG9yYWdlcyhzdG9yYWdlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmFnZXMpKSB7XG4gICAgICB0aGlzLmFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKSB7XG4gICAgbGV0IHN0b3JhZ2UgPSBudWxsXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3RvcmFnZUNsYXNzID0gU3RvcmFnZS5nZXQoY29uZmlnLnR5cGUpXG4gICAgICBpZiAoIXN0b3JhZ2VDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN0b3JhZ2U6ICR7Y29uZmlnfWApXG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc3RvcmFnZSA9IG5ldyBzdG9yYWdlQ2xhc3ModGhpcywgY29uZmlnKVxuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RvcmFnZSkge1xuICAgICAgc3RvcmFnZSA9IGNvbmZpZ1xuICAgIH1cbiAgICBpZiAoc3RvcmFnZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc3RvcmFnZS5uYW1lID0gbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlc1tzdG9yYWdlLm5hbWVdID0gc3RvcmFnZVxuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZVxuICB9XG5cbiAgZ2V0U3RvcmFnZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgY29tcGlsZVZhbGlkYXRvcihqc29uU2NoZW1hLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGpzb25TY2hlbWFcbiAgICAgID8gdGhpcy52YWxpZGF0b3IuY29tcGlsZShqc29uU2NoZW1hLCBvcHRpb25zKVxuICAgICAgOiBudWxsXG4gIH1cblxuICBjb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBsaXN0ID0gW11cbiAgICBjb25zdCB7IGRhdGFOYW1lID0gJ2RhdGEnIH0gPSBvcHRpb25zXG5cbiAgICBsZXQgcHJvcGVydGllcyA9IG51bGxcbiAgICBjb25zdCBhZGRQYXJhbWV0ZXIgPSAobmFtZSwgc2NoZW1hKSA9PiB7XG4gICAgICBsaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lID8/IG51bGwsXG4gICAgICAgIC4uLnNjaGVtYVxuICAgICAgfSlcbiAgICAgIGlmICghc2NoZW1hLm1lbWJlcikge1xuICAgICAgICBwcm9wZXJ0aWVzIHx8PSB7fVxuICAgICAgICBwcm9wZXJ0aWVzW25hbWUgfHwgZGF0YU5hbWVdID0gc2NoZW1hXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydCB0d28gZm9ybWF0cyBvZiBwYXJhbWV0ZXJzIGRlZmluaXRpb25zOlxuICAgIC8vIC0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZWlyIGBuYW1lYCBrZXkuXG4gICAgLy8gLSBBbiBvYmplY3Qgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZSBrZXkgdW5kZXIgd2hpY2ggZWFjaFxuICAgIC8vICAgc2NoZW1hIGlzIHN0b3JlZCBpbiB0aGUgcm9vdCBvYmplY3QuXG4gICAgLy8gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBjb250cm9sbGVyIGFjdGlvbnMgcmVjZWl2ZXMgdGhlXG4gICAgLy8gcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBhcmd1bWVudHMuIElmIGFuIG9iamVjdCBpcyBwYXNzZWQsIHRoZW4gdGhlXG4gICAgLy8gYWN0aW9ucyByZWNlaXZlcyBvbmUgcGFyYW1ldGVyIG9iamVjdCB3aGVyZSB1bmRlciB0aGUgc2FtZSBrZXlzIHRoZVxuICAgIC8vIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBzdG9yZWQuXG4gICAgbGV0IGFzT2JqZWN0ID0gZmFsc2VcbiAgICBpZiAoaXNBcnJheShwYXJhbWV0ZXJzKSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIC4uLnNjaGVtYSB9IG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBhcmFtZXRlcnMpKSB7XG4gICAgICBhc09iamVjdCA9IHRydWVcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXJzIGRlZmluaXRpb246ICR7cGFyYW1ldGVyc31gKVxuICAgIH1cbiAgICAvLyBOT1RFOiBJZiBwcm9wZXJ0aWVzIGlzIG51bGwsIHNjaGVtYSBhbmQgdmFsaWRhdGUgd2lsbCBiZWNvbWUgbnVsbCB0b28uXG4gICAgLy8gTk9URTogSWYgaXQgaXMgbm90IG51bGwsIGl0IHdpbGwgZ2V0IGV4cGFuZGVkIHRvIGFuIG9iamVjdCBzY2hlbWEuXG4gICAgY29uc3Qgc2NoZW1hID0gY29udmVydFNjaGVtYShwcm9wZXJ0aWVzLCBvcHRpb25zKVxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5jb21waWxlVmFsaWRhdG9yKHNjaGVtYSwge1xuICAgICAgLy8gRm9yIHBhcmFtZXRlcnMsIGFsd2F5cyBjb2VyY2UgdHlwZXMsIGluY2x1ZGluZyBhcnJheXMuXG4gICAgICBjb2VyY2VUeXBlczogJ2FycmF5JyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgIGFwcDogdGhpcyxcbiAgICAgIHZhbGlkYXRvcjogdGhpcy52YWxpZGF0b3IsXG4gICAgICBvcHRpb25zXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsaXN0LFxuICAgICAgc2NoZW1hLFxuICAgICAgYXNPYmplY3QsXG4gICAgICBkYXRhTmFtZSxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxuICAgICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBjdHggYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgICAgPyBkYXRhID0+IHZhbGlkYXRlLmNhbGwoY3R4LCBkYXRhKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMsIG9wdGlvbnMgfSkge1xuICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZXJyb3JzOiB0aGlzLnZhbGlkYXRvci5wYXJzZUVycm9ycyhlcnJvcnMsIG9wdGlvbnMpXG4gICAgfSlcbiAgfVxuXG4gIHNldHVwR2xvYmFsTWlkZGxld2FyZSgpIHtcbiAgICBjb25zdCB7IGFwcCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgdGhpcy51c2UoYXR0YWNoTG9nZ2VyKHRoaXMubG9nZ2VyKSlcblxuICAgIHRoaXMudXNlKGhhbmRsZUVycm9yKCkpXG4gICAgaWYgKGFwcC5yZXNwb25zZVRpbWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShyZXNwb25zZVRpbWUoZ2V0T3B0aW9ucyhhcHAucmVzcG9uc2VUaW1lKSkpXG4gICAgfVxuICAgIGlmIChsb2cucmVxdWVzdHMpIHtcbiAgICAgIHRoaXMudXNlKGxvZ1JlcXVlc3RzKCkpXG4gICAgfVxuICAgIGlmIChhcHAuaGVsbWV0ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoaGVsbWV0KGdldE9wdGlvbnMoYXBwLmhlbG1ldCkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmNvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb3JzKGdldE9wdGlvbnMoYXBwLmNvcnMpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb21wcmVzcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvbXByZXNzKG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgLy8gVXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGZvciBCcm90bGkgY29tcHJlc3Npb24uXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rb2Fqcy9jb21wcmVzcy9pc3N1ZXMvMTI2XG4gICAgICAgICAgYnI6IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBbemxpYi5jb25zdGFudHMuQlJPVExJX1BBUkFNX1FVQUxJVFldOiA0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRPcHRpb25zKGFwcC5jb21wcmVzcylcbiAgICAgICkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmV0YWcgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb25kaXRpb25hbCgpKVxuICAgICAgdGhpcy51c2UoZXRhZygpKVxuICAgIH1cbiAgfVxuXG4gIHNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKSB7XG4gICAgLy8gTk9URTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgYXV0b21hdGljIGBzZXR1cEdsb2JhbE1pZGRsZXdhcmUoKWAgc28gdGhhdFxuICAgIC8vIGFwcHMgY2FuIHNldCB1cCB0aGUgc3RhdGljIHNlcnZpbmcgb2YgYXNzZXRzIGJlZm9yZSBpbnN0YWxsaW5nIHRoZVxuICAgIC8vIHNlc3Npb24gYW5kIHBhc3Nwb3J0IG1pZGRsZXdhcmUuIEl0IGlzIGNhbGxlZCBmcm9tIGBhZGRDb250cm9sbGVyKClgLlxuICAgIC8vIFVzZSBhIGZsYWcgdG8gb25seSBpbnN0YWxsIHRoZSBtaWRkbGV3YXJlIG9uY2U6XG4gICAgaWYgKCF0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlKSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gdGhpcy5jb25maWdcbiAgICAgIC8vIFNlcXVlbmNlIGlzIGltcG9ydGFudDpcbiAgICAgIC8vIDEuIGJvZHkgcGFyc2VyXG4gICAgICB0aGlzLnVzZShib2R5UGFyc2VyKGdldE9wdGlvbnMoYXBwLmJvZHlQYXJzZXIpKSlcbiAgICAgIC8vIDIuIGZpbmQgcm91dGUgZnJvbSByb3V0ZXMgaW5zdGFsbGVkIGJ5IGNvbnRyb2xsZXJzLlxuICAgICAgdGhpcy51c2UoZmluZFJvdXRlKHRoaXMucm91dGVyKSlcbiAgICAgIC8vIDMuIHJlc3BlY3QgdHJhbnNhY3RlZCBzZXR0aW5ncywgY3JlYXRlIGFuZCBoYW5kbGUgdHJhbnNhY3Rpb25zLlxuICAgICAgdGhpcy51c2UoY3JlYXRlVHJhbnNhY3Rpb24oKSlcbiAgICAgIC8vIDQuIHNlc3Npb25cbiAgICAgIGlmIChhcHAuc2Vzc2lvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0gPSBnZXRPcHRpb25zKGFwcC5zZXNzaW9uKVxuICAgICAgICBpZiAobW9kZWxDbGFzcykge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIENvbnRleHRTdG9yZSB0aGF0IHJlc29sdmVkIHRoZSBzcGVjaWZpZWQgbW9kZWwgY2xhc3MsXG4gICAgICAgICAgLy8gdXNlcyBpdCB0byBwZXJzaXN0IGFuZCByZXRyaWV2ZSB0aGUgc2Vzc2lvbiwgYW5kIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAvLyBiaW5kcyBhbGwgZGIgb3BlcmF0aW9ucyB0byBgY3R4LnRyYW5zYWN0aW9uYCwgaWYgaXQgaXMgc2V0LlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICAgICAgb3B0aW9ucy5Db250ZXh0U3RvcmUgPSBTZXNzaW9uU3RvcmUobW9kZWxDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZShzZXNzaW9uKG9wdGlvbnMsIHRoaXMpKVxuICAgICAgfVxuICAgICAgLy8gNS4gcGFzc3BvcnRcbiAgICAgIGlmIChhcHAucGFzc3BvcnQpIHtcbiAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuaW5pdGlhbGl6ZSgpKVxuICAgICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgICB0aGlzLnVzZShwYXNzcG9ydC5zZXNzaW9uKCkpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2UoaGFuZGxlVXNlcigpKVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBmaW5hbGx5IGhhbmRsZSB0aGUgZm91bmQgcm91dGUsIG9yIHNldCBzdGF0dXMgLyBhbGxvdyBhY2NvcmRpbmdseS5cbiAgICAgIHRoaXMudXNlKGhhbmRsZVJvdXRlKCkpXG4gICAgICB0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHNldHVwTG9nZ2VyKCkge1xuICAgIGNvbnN0IHsgZXJyLCByZXEsIHJlcyB9ID0gcGluby5zdGRTZXJpYWxpemVyc1xuICAgIC8vIE9ubHkgaW5jbHVkZSBgaWRgIGZyb20gdGhlIHVzZXIsIHRvIG5vdCBpbmFkdmVydGVudGx5IGxvZyBQSUkuXG4gICAgY29uc3QgdXNlciA9IHVzZXIgPT4gKHsgaWQ6IHVzZXIuaWQgfSlcbiAgICBjb25zdCBzZXJpYWxpemVycyA9IHsgZXJyLCByZXEsIHJlcywgdXNlciB9XG5cbiAgICBjb25zdCBsb2dnZXIgPSBwaW5vKG1lcmdlKFxuICAgICAge1xuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBzZXJpYWxpemVycyxcbiAgICAgICAgcHJldHR5UHJpbnQ6IHtcbiAgICAgICAgICAvLyBMaXN0IG9mIGtleXMgdG8gaWdub3JlIGluIHByZXR0eSBtb2RlLlxuICAgICAgICAgIGlnbm9yZTogJ3JlcSxyZXMsZHVyYXRpb25Ncyx1c2VyLHJlcXVlc3RJZCcsXG4gICAgICAgICAgLy8gU1lTIHRvIHVzZSBzeXN0ZW0gdGltZSBhbmQgbm90IFVUQy5cbiAgICAgICAgICB0cmFuc2xhdGVUaW1lOiAnU1lTOkhIOk1NOnNzLmwnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlZGFjdCBjb21tb24gc2Vuc2l0aXZlIGhlYWRlcnMuXG4gICAgICAgIHJlZGFjdDogW1xuICAgICAgICAgICcqLmhlYWRlcnNbXCJjb29raWVcIl0nLFxuICAgICAgICAgICcqLmhlYWRlcnNbXCJzZXQtY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXSdcbiAgICAgICAgXSxcbiAgICAgICAgYmFzZTogbnVsbCAvLyBubyBwaWQsaG9zdG5hbWUsbmFtZVxuICAgICAgfSxcbiAgICAgIGdldE9wdGlvbnModGhpcy5jb25maWcubG9nZ2VyKVxuICAgICkpXG5cbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlci5jaGlsZCh7IG5hbWU6ICdhcHAnIH0pXG4gIH1cblxuICBzZXR1cEtuZXgoKSB7XG4gICAgbGV0IHsga25leCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmIChrbmV4Py5jbGllbnQpIHtcbiAgICAgIGNvbnN0IHNuYWtlQ2FzZU9wdGlvbnMgPSBrbmV4Lm5vcm1hbGl6ZURiTmFtZXMgPT09IHRydWVcbiAgICAgICAgPyB7fVxuICAgICAgICA6IGtuZXgubm9ybWFsaXplRGJOYW1lc1xuICAgICAgaWYgKHNuYWtlQ2FzZU9wdGlvbnMpIHtcbiAgICAgICAga25leCA9IHtcbiAgICAgICAgICAuLi5rbmV4LFxuICAgICAgICAgIC4uLmtuZXhTbmFrZUNhc2VNYXBwZXJzKHNuYWtlQ2FzZU9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leCA9IEtuZXgoa25leClcbiAgICAgIGlmIChsb2cuc3FsKSB7XG4gICAgICAgIHRoaXMuc2V0dXBLbmV4TG9nZ2luZygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBLbmV4TG9nZ2luZygpIHtcbiAgICBjb25zdCBzdGFydFRpbWVzID0ge31cbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5jaGlsZCh7IG5hbWU6ICdzcWwnIH0pXG4gICAgZnVuY3Rpb24gZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlLCBlcnJvciB9KSB7XG4gICAgICBjb25zdCBpZCA9IHF1ZXJ5Ll9fa25leFF1ZXJ5VWlkXG4gICAgICBjb25zdCBkaWZmID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnRUaW1lc1tpZF0pXG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGRpZmZbMF0gKiAxZTMgKyBkaWZmWzFdIC8gMWU2XG4gICAgICBkZWxldGUgc3RhcnRUaW1lc1tpZF1cbiAgICAgIGNvbnN0IHsgc3FsLCBiaW5kaW5ncyB9ID0gcXVlcnlcbiAgICAgIHJlc3BvbnNlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZmlsdGVyKFxuICAgICAgICAgIChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdfJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgbG9nZ2VyLmluZm8oeyBkdXJhdGlvbiwgYmluZGluZ3MsIHJlc3BvbnNlLCBlcnJvciB9LCBzcWwpXG4gICAgfVxuXG4gICAgdGhpcy5rbmV4XG4gICAgICAub24oJ3F1ZXJ5JywgcXVlcnkgPT4ge1xuICAgICAgICBzdGFydFRpbWVzW3F1ZXJ5Ll9fa25leFF1ZXJ5VWlkXSA9IHByb2Nlc3MuaHJ0aW1lKClcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LXJlc3BvbnNlJywgKHJlc3BvbnNlLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgcmVzcG9uc2UgfSlcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LWVycm9yJywgKGVycm9yLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgZXJyb3IgfSlcbiAgICAgIH0pXG4gIH1cblxuICBub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LmNsaWVudC53cmFwSWRlbnRpZmllcihpZGVudGlmaWVyKS5yZXBsYWNlKC9bJ2BcIl0vZywgJycpXG4gIH1cblxuICBkZW5vcm1hbGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMua25leC5jbGllbnQucG9zdFByb2Nlc3NSZXNwb25zZSh7IFtpZGVudGlmaWVyXTogMSB9KVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopWzBdXG4gIH1cblxuICBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBwLm5vcm1hbGl6ZVBhdGhzID8gaHlwaGVuYXRlKHBhdGgpIDogcGF0aFxuICB9XG5cbiAgZm9ybWF0RXJyb3IoZXJyKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVyci50b0pTT05cbiAgICAgID8gSlNPTi5zdHJpbmdpZnkoZXJyLnRvSlNPTigpLCBudWxsLCAyKVxuICAgICAgOiBlcnIubWVzc2FnZSB8fCBlcnJcbiAgICBjb25zdCBzdHIgPSBgJHtlcnIubmFtZX06ICR7bWVzc2FnZX1gXG4gICAgcmV0dXJuIGVyci5zdGFjayAmJiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zdGFjayAhPT0gZmFsc2VcbiAgICAgID8gYCR7c3RyfVxcbiR7ZXJyLnN0YWNrLnNwbGl0KC9cXG58XFxyXFxufFxcci8pLnNsaWNlKDEpLmpvaW4ob3MuRU9MKX1gXG4gICAgICA6IHN0clxuICB9XG5cbiAgbG9nRXJyb3IoZXJyLCBjdHgpIHtcbiAgICBpZiAoIWVyci5leHBvc2UgJiYgIXRoaXMuc2lsZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5mb3JtYXRFcnJvcihlcnIpXG4gICAgICAgIGNvbnN0IGxldmVsID1cbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yICYmIGVyci5zdGF0dXMgPCA1MDAgPyAnaW5mbycgOiAnZXJyb3InXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGN0eD8ubG9nZ2VyIHx8IHRoaXMubG9nZ2VyXG4gICAgICAgIGxvZ2dlcltsZXZlbF0odGV4dClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGxvZyBlcnJvcicsIGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0YXJ0JylcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdGFydCgpKVxuICAgIGNvbnN0IHtcbiAgICAgIHNlcnZlcjogeyBob3N0LCBwb3J0IH0sXG4gICAgICBlbnZcbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMubGlzdGVuKHBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBwb3J0IH0gPSBzZXJ2ZXIuYWRkcmVzcygpXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJHtlbnZ9IHNlcnZlciBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gXG4gICAgICAgIClcbiAgICAgICAgcmVzb2x2ZShzZXJ2ZXIpXG4gICAgICB9KVxuICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHN0YXJ0IHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0YXJ0JylcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RvcCcpXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB7IHNlcnZlciB9ID0gdGhpc1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBIYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNsb3NlIHRoZSBzZXJ2ZXIsXG4gICAgICAgIC8vICBldmVuIGlmIHNvY2tldHMgYXJlIHN0aWxsIG9wZW4uXG4gICAgICAgIC8vICBUYWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjgzMDA3Mi5cbiAgICAgICAgLy8gIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBhIGxpYnJhcnksIGV4OiBodHRwczovL2dpdGh1Yi5jb20vZ29kYWRkeS90ZXJtaW51c1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gc2VydmVyLmVtaXQoJ2Nsb3NlJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0b3AoKSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0b3AnKVxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE9yRXhpdCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKGVycilcbiAgICAgIHByb2Nlc3MuZXhpdCgtMSlcbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBhc3luYyBjcmVhdGVBc3NldHMoc3RvcmFnZSwgZmlsZXMsIGNvdW50ID0gMCwgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGNvbnN0IGFzc2V0cyA9IGZpbGVzLm1hcChmaWxlID0+ICh7XG4gICAgICAgIGtleTogZmlsZS5rZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UubmFtZSxcbiAgICAgICAgY291bnRcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIEFzc2V0TW9kZWxcbiAgICAgICAgLnF1ZXJ5KHRyeClcbiAgICAgICAgLmluc2VydChhc3NldHMpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgIHN0b3JhZ2UsXG4gICAgYWRkZWRGaWxlcyxcbiAgICByZW1vdmVkRmlsZXMsXG4gICAgdHJ4ID0gbnVsbFxuICApIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3NldHM6IHtcbiAgICAgICAgY2xlYW51cFRpbWVUaHJlc2hvbGQgPSAwXG4gICAgICB9ID0ge31cbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICAvLyBPbmx5IHJlbW92ZSB1bnVzZWQgYXNzZXRzIHRoYXQgaGF2ZW4ndCBzZWVuIGNoYW5nZXMgZm9yIGdpdmVuIHRpbWVmcmFtZS5cbiAgICBjb25zdCB0aW1lVGhyZXNob2xkID0gaXNTdHJpbmcoY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA/IHBhcnNlRHVyYXRpb24oY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA6IGNsZWFudXBUaW1lVGhyZXNob2xkXG5cbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBpbXBvcnRlZEZpbGVzLnB1c2goXG4gICAgICAgIC4uLmF3YWl0IHRoaXMuYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBhZGRlZEZpbGVzLCB0cngpXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZUNvdW50ID0gKGZpbGVzLCBpbmNyZW1lbnQpID0+IChcbiAgICAgICAgICBmaWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgQXNzZXRNb2RlbC5xdWVyeSh0cngpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5JywgZmlsZXMubWFwKGZpbGUgPT4gZmlsZS5rZXkpKVxuICAgICAgICAgICAgLmluY3JlbWVudCgnY291bnQnLCBpbmNyZW1lbnQpXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGNoYW5nZUNvdW50KGFkZGVkRmlsZXMsIDEpLFxuICAgICAgICAgIGNoYW5nZUNvdW50KHJlbW92ZWRGaWxlcywgLTEpXG4gICAgICAgIF0pXG4gICAgICAgIGlmICh0aW1lVGhyZXNob2xkID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAvLyBEb24ndCBwYXNzIGB0cnhgIGhlcmUsIGFzIHdlIHdhbnQgdGhpcyBkZWxheWVkIGV4ZWN1dGlvbiB0b1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0cyBvd24gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCksXG4gICAgICAgICAgICB0aW1lVGhyZXNob2xkXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGV4ZWN1dGUgcmVsZWFzZVVudXNlZEFzc2V0cygpIGltbWVkaWF0ZWx5IGluIHRoZSBzYW1lXG4gICAgICAvLyB0cmFuc2FjdGlvbiwgdG8gcG90ZW50aWFsbHkgY2xlYW4gdXAgb3RoZXIgcGVuZGluZyBhc3NldHMuXG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCwgdHJ4KVxuICAgICAgcmV0dXJuIGltcG9ydGVkRmlsZXNcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgLy8gRmluZCBtaXNzaW5nIGFzc2V0cyAoY29waWVkIGZyb20gYW5vdGhlciBzeXN0ZW0pLCBhbmQgYWRkIHRoZW0uXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmRhdGEgfHwgZmlsZS51cmwpIHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YSB9ID0gZmlsZVxuICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgICAgICBgJHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbGsucmVkKCdJTkZPOicpXG4gICAgICAgICAgICAgICAgICB9IEFzc2V0ICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtmaWxlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgZmV0Y2hpbmcgZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7ZmlsZS51cmx9J2ApXG4gICAgICAgICAgICAgICAgICB9IGFuZCBhZGRpbmcgdG8gc3RvcmFnZSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7c3RvcmFnZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfS4uLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkRmlsZSA9IGF3YWl0IHN0b3JhZ2UuYWRkRmlsZShmaWxlLCBkYXRhKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBbaW1wb3J0ZWRGaWxlXSwgMCwgdHJ4KVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgICBpbXBvcnRlZEZpbGVzLnB1c2goaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBpbXBvcnQgYXNzZXQgZnJvbSBmb3JlaWduIHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBc3NldCBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGJ1dCB3YXMgYWxyZWFkeSBpbXBvcnRlZCBhbmQgY2FuXG4gICAgICAgICAgICAvLyBiZSByZXVzZWQuIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyBtZXJnZS5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgYXNzZXQuZmlsZSlcbiAgICAgICAgICAgIC8vIE5PVEU6IE5vIG5lZWQgdG8gYWRkIGBmaWxlYCB0byBgaW1wb3J0ZWRGaWxlc2AsIHNpbmNlIGl0J3NcbiAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBpbXBvcnRlZCB0byB0aGUgc3RvcmFnZSBiZWZvcmUuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kaWZpZWRBc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgICAgaWYgKGFzc2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGZpbGUuZGF0YSlcbiAgICAgICAgICAgICAgLy8gTWVyZ2UgYmFjayB0aGUgY2hhbmdlZCBmaWxlIHByb3BlcnRpZXMgaW50byB0aGUgYWN0dWFsIGZpbGVzXG4gICAgICAgICAgICAgIC8vIG9iamVjdCwgc28gdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBzdGF0aWMgbW9kZWwgaG9vayBjYW4gYmUgdXNlZFxuICAgICAgICAgICAgICAvLyBkaXJlY3RseSBmb3IgdGhlIGFjdHVhbCBydW5uaW5nIHF1ZXJ5LlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGZpbGUsIGNoYW5nZWRGaWxlKVxuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHVwZGF0ZSBtb2RpZmllZCBhc3NldCBmcm9tIG1lbW9yeSBzb3VyY2U6ICcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5uYW1lXG4gICAgICAgICAgICAgICAgfScgKCcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5rZXlcbiAgICAgICAgICAgICAgICB9JylgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllZEZpbGVzXG4gIH1cblxuICBhc3luYyByZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgcmV0dXJuIEFzc2V0TW9kZWwudHJhbnNhY3Rpb24odHJ4LCBhc3luYyB0cnggPT4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHRpbWUgdGhyZXNob2xkIGluIEpTIGluc3RlYWQgb2YgU1FMLCBhcyB0aGVyZSBpcyBub1xuICAgICAgICAvLyBlYXN5IGNyb3NzLVNRTCB3YXkgdG8gZG8gYG5vdygpIC0gaW50ZXJ2YWwgWCBob3Vyc2A6XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSB0aW1lVGhyZXNob2xkKVxuICAgICAgICBjb25zdCBvcnBoYW5lZEFzc2V0cyA9IGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgIC53aGVyZSgnY291bnQnLCAwKVxuICAgICAgICAgIC5hbmRXaGVyZSgndXBkYXRlZEF0JywgJzw9JywgZGF0ZSlcbiAgICAgICAgICAvLyBQcm90ZWN0IGZyZXNobHkgY3JlYXRlZCBhc3NldHMgZnJvbSBiZWluZyBkZWxldGVkIGFnYWluIHJpZ2h0IGF3YXksXG4gICAgICAgICAgLy8gLmUuZy4gd2hlbiBgY29uZmlnLmFzc2V0cy5jbGVhbnVwVGltZVRocmVzaG9sZCA9IDBgXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPicsIHJlZignY3JlYXRlZEF0JykpXG4gICAgICAgIGlmIChvcnBoYW5lZEFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgb3JwaGFuZWRLZXlzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBvcnBoYW5lZEFzc2V0cy5tYXAoYXN5bmMgYXNzZXQgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmFnZShhc3NldC5zdG9yYWdlKS5yZW1vdmVGaWxlKGFzc2V0LmZpbGUpXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICAgICAgICAgICAgICAgIGFzc2V0LmVycm9yID0gZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXNzZXQua2V5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBBc3NldE1vZGVsXG4gICAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5Jywgb3JwaGFuZWRLZXlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcnBoYW5lZEFzc2V0c1xuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3ZlcnJpZGUgS29hJ3MgZXZlbnRzIHdpdGggb3VyIG93biBFdmVudEVtaXR0ZXIgdGhhdCBhZGRzIHN1cHBvcnQgZm9yXG4vLyBhc3luY2hyb25vdXMgZXZlbnRzLlxuRXZlbnRFbWl0dGVyLm1peGluKEFwcGxpY2F0aW9uLnByb3RvdHlwZSlcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBpc09iamVjdChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fVxufVxuIl19
961
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsInBpY28iLCJ5ZWxsb3ciLCJib2xkIiwidXRpbCIsImluc3BlY3QiLCJjb2xvcnMiLCJkZXB0aCIsIm1heEFycmF5TGVuZ3RoIiwiRXJyb3IiLCJzb3J0QnlSZWxhdGlvbnMiLCJsaXN0IiwiY29sbGVjdGVkIiwiZXhjbHVkZWQiLCJyZWxhdGlvbiIsImdldFJlbGF0aW9ucyIsIkJlbG9uZ3NUb09uZVJlbGF0aW9uIiwicmVsYXRlZE1vZGVsQ2xhc3MiLCJqb2luVGFibGVNb2RlbENsYXNzIiwicmVsYXRlZCIsInJldmVyc2UiLCJyZWR1Y2UiLCJnZXRNb2RlbCIsImVuZHNXaXRoIiwiZmluZE1vZGVsIiwiY2FsbGJhY2siLCJmaW5kIiwic2VydmljZSIsImVudHJpZXMiLCJhZGRTZXJ2aWNlIiwiU2VydmljZSIsInVuZGVmaW5lZCIsImdldFNlcnZpY2UiLCJmaW5kU2VydmljZSIsImZvckVhY2hTZXJ2aWNlIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm5hbWVzcGFjZSIsImtleSIsImFkZENvbnRyb2xsZXIiLCJzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlIiwiQ29udHJvbGxlciIsInVybCIsImNvbXBvc2UiLCJnZXRDb250cm9sbGVyIiwiZmluZENvbnRyb2xsZXIiLCJnZXRBZG1pbkNvbnRyb2xsZXIiLCJBZG1pbkNvbnRyb2xsZXIiLCJnZXRBZG1pblZ1ZUNvbmZpZyIsImdldFZ1ZUNvbmZpZyIsImdldEFzc2V0Q29uZmlnIiwibm9ybWFsaXplRGJOYW1lcyIsImFzc2V0Q29uZmlnIiwibW9kZWxOYW1lIiwiYXNzZXRzIiwiZGVmaW5pdGlvbiIsIm5vcm1hbGl6ZWRNb2RlbE5hbWUiLCJub3JtYWxpemVJZGVudGlmaWVyIiwiY29udmVydGVkQXNzZXRzIiwiYXNzZXREYXRhUGF0aCIsInByb3BlcnR5IiwibmVzdGVkRGF0YVBhdGgiLCJpbmRleCIsImdldFByb3BlcnR5T3JSZWxhdGlvbkF0RGF0YVBhdGgiLCJub3JtYWxpemVkTmFtZSIsImRhdGFQYXRoIiwiYXNzZXRDb25maWdzIiwiYWRkU3RvcmFnZSIsInN0b3JhZ2UiLCJzdG9yYWdlQ2xhc3MiLCJTdG9yYWdlIiwiZ2V0IiwidHlwZSIsImdldFN0b3JhZ2UiLCJjb21waWxlVmFsaWRhdG9yIiwianNvblNjaGVtYSIsIm9wdGlvbnMiLCJjb21waWxlIiwiY29tcGlsZVBhcmFtZXRlcnNWYWxpZGF0b3IiLCJwYXJhbWV0ZXJzIiwiZGF0YU5hbWUiLCJwcm9wZXJ0aWVzIiwiYWRkUGFyYW1ldGVyIiwicHVzaCIsIm1lbWJlciIsImFzT2JqZWN0IiwidmFsaWRhdGUiLCJjb2VyY2VUeXBlcyIsImN0eCIsImNhbGwiLCJjcmVhdGVWYWxpZGF0aW9uRXJyb3IiLCJtZXNzYWdlIiwiZXJyb3JzIiwianNvbiIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwiY3JlYXRlRGF0YWJhc2VFcnJvciIsImVycm9yIiwic3FsIiwibWF0Y2giLCJEYXRhYmFzZUVycm9yIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwidHlwZVBhcnNlcnMiLCJwYXJzZXIiLCJkcml2ZXIiLCJ0eXBlcyIsInNldFR5cGVQYXJzZXIiLCJzZXR1cEtuZXhMb2dnaW5nIiwic3RhcnRUaW1lcyIsImVuZCIsInF1ZXJ5IiwicmVzcG9uc2UiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwic3RyIiwic3RhY2siLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsIm9zIiwiRU9MIiwibG9nRXJyb3IiLCJleHBvc2UiLCJ0ZXh0IiwiUmVzcG9uc2VFcnJvciIsInN0YXR1cyIsImUiLCJzdGFydCIsImVtaXQiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInJlc29sdmUiLCJyZWplY3QiLCJsaXN0ZW4iLCJhZGRyZXNzIiwic3RvcCIsImNsb3NlIiwic2V0SW1tZWRpYXRlIiwib2ZmIiwic3RhcnRPckV4aXQiLCJleGl0IiwiY3JlYXRlQXNzZXRzIiwiZmlsZXMiLCJjb3VudCIsInRyeCIsIkFzc2V0TW9kZWwiLCJmaWxlIiwiaW5zZXJ0IiwiaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyIsImFkZGVkRmlsZXMiLCJyZW1vdmVkRmlsZXMiLCJjbGVhbnVwVGltZVRocmVzaG9sZCIsInRpbWVUaHJlc2hvbGQiLCJpbXBvcnRlZEZpbGVzIiwiYWRkRm9yZWlnbkFzc2V0cyIsImNoYW5nZUNvdW50IiwiaW5jcmVtZW50Iiwid2hlcmVJbiIsInNldFRpbWVvdXQiLCJyZWxlYXNlVW51c2VkQXNzZXRzIiwiYXNzZXQiLCJmaW5kT25lIiwicmVkIiwiZ3JlZW4iLCJheGlvcyIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZVR5cGUiLCJpbXBvcnRlZEZpbGUiLCJhZGRGaWxlIiwiYXNzaWduIiwiQXNzZXRFcnJvciIsImhhbmRsZU1vZGlmaWVkQXNzZXRzIiwibW9kaWZpZWRGaWxlcyIsImNoYW5nZWRGaWxlIiwidHJhbnNhY3Rpb24iLCJkYXRlIiwiRGF0ZSIsInNldE1pbGxpc2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIm9ycGhhbmVkQXNzZXRzIiwid2hlcmUiLCJhbmRXaGVyZSIsIm9ycGhhbmVkS2V5cyIsInJlbW92ZUZpbGUiLCJkZWxldGUiLCJFdmVudEVtaXR0ZXIiLCJtaXhpbiIsInByb3RvdHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOztBQUNBOztBQUNBOztBQVNBOztBQUlBOzs7O0FBT08sTUFBTUEsV0FBTixTQUEwQkMsWUFBMUIsQ0FBOEI7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBQztBQUNWQyxJQUFBQSxNQUFNLEdBQUcsRUFEQztBQUVWQyxJQUFBQSxTQUZVO0FBR1ZDLElBQUFBLE1BSFU7QUFJVkMsSUFBQUEsTUFKVTtBQUtWQyxJQUFBQSxVQUxVO0FBTVZDLElBQUFBLE1BTlU7QUFPVkMsSUFBQUEsUUFQVTtBQVFWQyxJQUFBQTtBQVJVLE1BU1IsRUFUTyxFQVNIO0FBQ047O0FBQ0EsU0FBS0MsYUFBTCxDQUFtQkwsTUFBbkI7O0FBQ0EsVUFBTTtBQUVKTSxNQUFBQSxHQUFHLEVBQUU7QUFBRUMsUUFBQUEsSUFBRjtBQUFRLFdBQUdEO0FBQVgsVUFBbUIsRUFGcEI7QUFHSkUsTUFBQUEsR0FBRyxHQUFHLEVBSEY7QUFJSixTQUFHQztBQUpDLFFBS0ZaLE1BTEo7QUFNQSxTQUFLQSxNQUFMLEdBQWM7QUFDWlMsTUFBQUEsR0FEWTtBQUVaRSxNQUFBQSxHQUFHLEVBQUVBLEdBQUcsQ0FBQ0UsTUFBSixJQUFjQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkNMLEdBRnRDO0FBR1osU0FBR0M7QUFIUyxLQUFkO0FBS0EsU0FBS0YsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS08sS0FBTCxHQUFhLENBQUMsQ0FBQ1IsR0FBRyxDQUFDUSxLQUFuQjtBQUNBLFNBQUtoQixTQUFMLEdBQWlCQSxTQUFTLElBQUksSUFBSWlCLG9CQUFKLEVBQTlCO0FBQ0EsU0FBS2hCLE1BQUwsR0FBY0EsTUFBTSxJQUFJLElBQUlpQixlQUFKLEVBQXhCO0FBQ0EsU0FBS2xCLFNBQUwsQ0FBZVEsR0FBZixHQUFxQixJQUFyQjtBQUNBLFNBQUtXLFFBQUwsR0FBZ0JDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLElBQWQsQ0FBaEI7QUFDQSxTQUFLakIsTUFBTCxHQUFjZ0IsTUFBTSxDQUFDQyxNQUFQLENBQWMsSUFBZCxDQUFkO0FBQ0EsU0FBS2hCLFFBQUwsR0FBZ0JlLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLElBQWQsQ0FBaEI7QUFDQSxTQUFLZixXQUFMLEdBQW1CYyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxJQUFkLENBQW5CO0FBQ0EsU0FBS0MsdUJBQUwsR0FBK0IsS0FBL0I7QUFDQSxTQUFLQyxXQUFMO0FBQ0EsU0FBS0MsU0FBTDtBQUNBLFNBQUtDLHFCQUFMOztBQUNBLFFBQUl0QixVQUFKLEVBQWdCO0FBQ2QsV0FBS3VCLEdBQUwsQ0FBU3ZCLFVBQVQ7QUFDRDs7QUFDRCxRQUFJSixNQUFNLENBQUNvQixRQUFYLEVBQXFCO0FBQ25CLFdBQUtRLFdBQUwsQ0FBaUI1QixNQUFNLENBQUNvQixRQUF4QjtBQUNEOztBQUNELFFBQUlmLE1BQUosRUFBWTtBQUNWLFdBQUt3QixTQUFMLENBQWV4QixNQUFmO0FBQ0Q7O0FBQ0QsUUFBSUMsUUFBSixFQUFjO0FBQ1osV0FBS3dCLFdBQUwsQ0FBaUJ4QixRQUFqQjtBQUNEOztBQUNELFFBQUlDLFdBQUosRUFBaUI7QUFDZixXQUFLd0IsY0FBTCxDQUFvQnhCLFdBQXBCO0FBQ0Q7QUFDRjs7QUFFRHlCLEVBQUFBLFFBQVEsQ0FBQ0MsSUFBRCxFQUFPQyxJQUFQLEVBQWFDLFVBQWIsRUFBeUJDLFFBQXpCLEVBQW1DQyxVQUFVLEdBQUcsSUFBaEQsRUFBc0RDLE1BQU0sR0FBRyxJQUEvRCxFQUFxRTtBQUMzRUYsSUFBQUEsUUFBUSxHQUFHLHFCQUFRQSxRQUFSLENBQVg7QUFDQSxVQUFNRyxPQUFPLEdBQUdILFFBQVEsQ0FBQ0ksTUFBVCxHQUFrQixDQUFsQixHQUFzQix5QkFBUUosUUFBUixDQUF0QixHQUEwQ0EsUUFBUSxDQUFDLENBQUQsQ0FBbEU7QUFHQSxVQUFNSyxLQUFLLEdBQUc7QUFDWlIsTUFBQUEsSUFEWTtBQUVaQyxNQUFBQSxJQUZZO0FBR1pDLE1BQUFBLFVBSFk7QUFJWkksTUFBQUEsT0FKWTtBQUtaRixNQUFBQSxVQUxZO0FBTVpDLE1BQUFBO0FBTlksS0FBZDtBQVFBLFNBQUtwQyxNQUFMLENBQVkrQixJQUFaLEVBQWtCQyxJQUFsQixFQUF3Qk8sS0FBeEI7QUFDRDs7QUFFRFosRUFBQUEsU0FBUyxDQUFDeEIsTUFBRCxFQUFTO0FBR2hCLFNBQUssTUFBTXFDLFVBQVgsSUFBeUJyQixNQUFNLENBQUNzQixNQUFQLENBQWN0QyxNQUFkLENBQXpCLEVBQWdEO0FBQzlDLFdBQUt1QyxRQUFMLENBQWNGLFVBQWQ7QUFDRDs7QUFFRCxTQUFLckMsTUFBTCxHQUFjLEtBQUt3QyxVQUFMLENBQWdCLEtBQUt4QyxNQUFyQixDQUFkO0FBRUEsVUFBTXlDLFlBQVksR0FBR3pCLE1BQU0sQ0FBQ3NCLE1BQVAsQ0FBYyxLQUFLdEMsTUFBbkIsRUFBMkIwQyxNQUEzQixDQUNuQkwsVUFBVSxJQUFJckMsTUFBTSxDQUFDcUMsVUFBVSxDQUFDTSxJQUFaLENBQU4sS0FBNEJOLFVBRHZCLENBQXJCOztBQUtBLFNBQUssTUFBTUEsVUFBWCxJQUF5QkksWUFBekIsRUFBdUM7QUFDckMsVUFBSXpDLE1BQU0sQ0FBQ3FDLFVBQVUsQ0FBQ00sSUFBWixDQUFOLEtBQTRCTixVQUFoQyxFQUE0QztBQUMxQ0EsUUFBQUEsVUFBVSxDQUFDTyxLQUFYLENBQWlCLEtBQUtDLElBQXRCO0FBR0FSLFFBQUFBLFVBQVUsQ0FBQ1MsVUFBWDtBQUNBLGFBQUtsRCxTQUFMLENBQWVtRCxTQUFmLENBQXlCVixVQUFVLENBQUNXLGFBQVgsRUFBekI7QUFDRDtBQUNGOztBQUNELFVBQU07QUFBRTFDLE1BQUFBO0FBQUYsUUFBVSxLQUFLWCxNQUFyQjs7QUFDQSxRQUFJVyxHQUFHLENBQUMyQyxNQUFKLElBQWMzQyxHQUFHLENBQUM0QyxTQUF0QixFQUFpQztBQUMvQixXQUFLLE1BQU1iLFVBQVgsSUFBeUJJLFlBQXpCLEVBQXVDO0FBQ3JDLGNBQU1VLFNBQVMsR0FBR0MsTUFBTSxJQUN0QkEsTUFBTSxLQUFLLElBQVgsSUFDQSxxQkFBUUEsTUFBUixFQUFnQkMsUUFBaEIsQ0FBeUJoQixVQUFVLENBQUNNLElBQXBDLENBRkY7O0FBSUEsY0FBTVcsSUFBSSxHQUFHLEVBQWI7O0FBQ0EsWUFBSUgsU0FBUyxDQUFDN0MsR0FBRyxDQUFDMkMsTUFBTCxDQUFiLEVBQTJCO0FBQ3pCSyxVQUFBQSxJQUFJLENBQUNMLE1BQUwsR0FBY1osVUFBVSxDQUFDVyxhQUFYLEVBQWQ7QUFDRDs7QUFDRCxZQUFJRyxTQUFTLENBQUM3QyxHQUFHLENBQUM0QyxTQUFMLENBQWIsRUFBOEI7QUFDNUJJLFVBQUFBLElBQUksQ0FBQ0osU0FBTCxHQUFpQixtQkFBTWIsVUFBVSxDQUFDa0IsZ0JBQWpCLEVBQW1DQyxLQUFLLElBQ3ZEQyxpQkFBTUMsYUFBTixDQUFvQkYsS0FBcEIsSUFBOEIsV0FBVUEsS0FBSyxDQUFDYixJQUFLLEdBQW5ELEdBQXdEYSxLQUR6QyxDQUFqQjtBQUdEOztBQUNELFlBQUl4QyxNQUFNLENBQUNYLElBQVAsQ0FBWWlELElBQVosRUFBa0JuQixNQUFsQixHQUEyQixDQUEvQixFQUFrQztBQUNoQ3dCLFVBQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUNFQyxvQkFBS0MsTUFBTCxDQUFZQyxJQUFaLENBQWtCLEtBQUkxQixVQUFVLENBQUNNLElBQUssS0FBdEMsQ0FERixFQUVFcUIsY0FBS0MsT0FBTCxDQUFhWCxJQUFiLEVBQW1CO0FBQ2pCWSxZQUFBQSxNQUFNLEVBQUUsSUFEUztBQUVqQkMsWUFBQUEsS0FBSyxFQUFFLElBRlU7QUFHakJDLFlBQUFBLGNBQWMsRUFBRTtBQUhDLFdBQW5CLENBRkY7QUFRRDtBQUNGO0FBQ0Y7QUFDRjs7QUFFRDdCLEVBQUFBLFFBQVEsQ0FBQ0YsVUFBRCxFQUFhO0FBQ25CLFFBQUlvQixpQkFBTUMsYUFBTixDQUFvQnJCLFVBQXBCLENBQUosRUFBcUM7QUFDbkNBLE1BQUFBLFVBQVUsQ0FBQ2pDLEdBQVgsR0FBaUIsSUFBakI7QUFDQSxXQUFLSixNQUFMLENBQVlxQyxVQUFVLENBQUNNLElBQXZCLElBQStCTixVQUEvQjtBQUNELEtBSEQsTUFHTztBQUNMLFlBQU0sSUFBSWdDLEtBQUosQ0FBVyx3QkFBdUJoQyxVQUFXLEVBQTdDLENBQU47QUFDRDtBQUNGOztBQUVERyxFQUFBQSxVQUFVLENBQUN4QyxNQUFELEVBQVM7QUFDakIsVUFBTXNFLGVBQWUsR0FBRyxDQUFDQyxJQUFELEVBQU9DLFNBQVMsR0FBRyxFQUFuQixFQUF1QkMsUUFBUSxHQUFHLEVBQWxDLEtBQXlDO0FBQy9ELFdBQUssTUFBTXBDLFVBQVgsSUFBeUJrQyxJQUF6QixFQUErQjtBQUM3QixjQUFNO0FBQUU1QixVQUFBQTtBQUFGLFlBQVdOLFVBQWpCOztBQUNBLFlBQUksQ0FBQ21DLFNBQVMsQ0FBQzdCLElBQUQsQ0FBVixJQUFvQixDQUFDOEIsUUFBUSxDQUFDOUIsSUFBRCxDQUFqQyxFQUF5QztBQUN2QyxlQUFLLE1BQU0rQixRQUFYLElBQXVCMUQsTUFBTSxDQUFDc0IsTUFBUCxDQUFjRCxVQUFVLENBQUNzQyxZQUFYLEVBQWQsQ0FBdkIsRUFBaUU7QUFDL0QsZ0JBQUksRUFBRUQsUUFBUSxZQUFZRSwrQkFBdEIsQ0FBSixFQUFpRDtBQUMvQyxvQkFBTTtBQUFFQyxnQkFBQUEsaUJBQUY7QUFBcUJDLGdCQUFBQTtBQUFyQixrQkFBNkNKLFFBQW5EOztBQUNBLG1CQUFLLE1BQU1LLE9BQVgsSUFBc0IsQ0FBQ0QsbUJBQUQsRUFBc0JELGlCQUF0QixDQUF0QixFQUFnRTtBQUU5RCxvQkFBSUUsT0FBTyxJQUFJQSxPQUFPLEtBQUsxQyxVQUF2QixJQUFxQ3JDLE1BQU0sQ0FBQytFLE9BQU8sQ0FBQ3BDLElBQVQsQ0FBL0MsRUFBK0Q7QUFDN0QyQixrQkFBQUEsZUFBZSxDQUFDLENBQUNTLE9BQUQsQ0FBRCxFQUFZUCxTQUFaLEVBQXVCO0FBRXBDLHFCQUFDN0IsSUFBRCxHQUFRTixVQUY0QjtBQUdwQyx1QkFBR29DO0FBSGlDLG1CQUF2QixDQUFmO0FBS0Q7QUFDRjtBQUNGO0FBQ0Y7O0FBQ0RELFVBQUFBLFNBQVMsQ0FBQzdCLElBQUQsQ0FBVCxHQUFrQk4sVUFBbEI7QUFDRDtBQUNGOztBQUNELGFBQU9yQixNQUFNLENBQUNzQixNQUFQLENBQWNrQyxTQUFkLENBQVA7QUFDRCxLQXZCRDs7QUEyQkEsV0FBT0YsZUFBZSxDQUFDdEQsTUFBTSxDQUFDc0IsTUFBUCxDQUFjdEMsTUFBZCxFQUFzQmdGLE9BQXRCLEVBQUQsQ0FBZixDQUFpREEsT0FBakQsR0FBMkRDLE1BQTNELENBQ0wsQ0FBQ2pGLE1BQUQsRUFBU3FDLFVBQVQsS0FBd0I7QUFDdEJyQyxNQUFBQSxNQUFNLENBQUNxQyxVQUFVLENBQUNNLElBQVosQ0FBTixHQUEwQk4sVUFBMUI7QUFDQSxhQUFPckMsTUFBUDtBQUNELEtBSkksRUFLTGdCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLElBQWQsQ0FMSyxDQUFQO0FBT0Q7O0FBRURpRSxFQUFBQSxRQUFRLENBQUN2QyxJQUFELEVBQU87QUFDYixXQUNFLEtBQUszQyxNQUFMLENBQVkyQyxJQUFaLEtBQ0EsQ0FBQ0EsSUFBSSxDQUFDd0MsUUFBTCxDQUFjLE9BQWQsQ0FBRCxJQUEyQixLQUFLbkYsTUFBTCxDQUFhLEdBQUUyQyxJQUFLLE9BQXBCLENBRDNCLElBRUEsSUFIRjtBQUtEOztBQUVEeUMsRUFBQUEsU0FBUyxDQUFDQyxRQUFELEVBQVc7QUFDbEIsV0FBT3JFLE1BQU0sQ0FBQ3NCLE1BQVAsQ0FBYyxLQUFLdEMsTUFBbkIsRUFBMkJzRixJQUEzQixDQUFnQ0QsUUFBaEMsQ0FBUDtBQUNEOztBQUVENUQsRUFBQUEsV0FBVyxDQUFDeEIsUUFBRCxFQUFXO0FBQ3BCLFNBQUssTUFBTSxDQUFDMEMsSUFBRCxFQUFPNEMsT0FBUCxDQUFYLElBQThCdkUsTUFBTSxDQUFDd0UsT0FBUCxDQUFldkYsUUFBZixDQUE5QixFQUF3RDtBQUV0RCxVQUFJMEMsSUFBSSxLQUFLLFNBQVQsSUFBc0IsMkJBQWM0QyxPQUFkLENBQTFCLEVBQWtEO0FBQ2hELGFBQUs5RCxXQUFMLENBQWlCOEQsT0FBakI7QUFDRCxPQUZELE1BRU87QUFDTCxhQUFLRSxVQUFMLENBQWdCRixPQUFoQixFQUF5QjVDLElBQXpCO0FBQ0Q7QUFDRjtBQUNGOztBQUVEOEMsRUFBQUEsVUFBVSxDQUFDRixPQUFELEVBQVU1QyxJQUFWLEVBQWdCO0FBRXhCLFFBQUkrQyxrQkFBUWhDLGFBQVIsQ0FBc0I2QixPQUF0QixDQUFKLEVBQW9DO0FBRWxDQSxNQUFBQSxPQUFPLEdBQUcsSUFBSUEsT0FBSixDQUFZLElBQVosRUFBa0I1QyxJQUFsQixDQUFWO0FBQ0Q7O0FBQ0QsUUFBSSxFQUFFNEMsT0FBTyxZQUFZRyxpQkFBckIsQ0FBSixFQUFtQztBQUNqQyxZQUFNLElBQUlyQixLQUFKLENBQVcsb0JBQW1Ca0IsT0FBUSxFQUF0QyxDQUFOO0FBQ0Q7O0FBR0QsS0FBQztBQUFFNUMsTUFBQUE7QUFBRixRQUFXNEMsT0FBWjtBQUNBLFVBQU01RixNQUFNLEdBQUcsS0FBS0EsTUFBTCxDQUFZTSxRQUFaLENBQXFCMEMsSUFBckIsQ0FBZjs7QUFDQSxRQUFJaEQsTUFBTSxLQUFLZ0csU0FBZixFQUEwQjtBQUN4QixZQUFNLElBQUl0QixLQUFKLENBQVcsc0NBQXFDMUIsSUFBSyxHQUFyRCxDQUFOO0FBQ0Q7O0FBR0QsUUFBSWhELE1BQU0sS0FBSyxLQUFmLEVBQXNCO0FBQ3BCNEYsTUFBQUEsT0FBTyxDQUFDM0MsS0FBUixDQUFjakQsTUFBZDtBQUNBLFdBQUtNLFFBQUwsQ0FBYzBDLElBQWQsSUFBc0I0QyxPQUF0QjtBQUdBQSxNQUFBQSxPQUFPLENBQUN6QyxVQUFSO0FBQ0Q7QUFDRjs7QUFFRDhDLEVBQUFBLFVBQVUsQ0FBQ2pELElBQUQsRUFBTztBQUNmLFdBQU8sS0FBSzFDLFFBQUwsQ0FBYzBDLElBQWQsS0FBdUIsSUFBOUI7QUFDRDs7QUFFRGtELEVBQUFBLFdBQVcsQ0FBQ1IsUUFBRCxFQUFXO0FBQ3BCLFdBQU9yRSxNQUFNLENBQUNzQixNQUFQLENBQWMsS0FBS3JDLFFBQW5CLEVBQTZCcUYsSUFBN0IsQ0FBa0NELFFBQWxDLENBQVA7QUFDRDs7QUFFRFMsRUFBQUEsY0FBYyxDQUFDVCxRQUFELEVBQVc7QUFDdkIsV0FBT1UsT0FBTyxDQUFDQyxHQUFSLENBQVloRixNQUFNLENBQUNzQixNQUFQLENBQWMsS0FBS3JDLFFBQW5CLEVBQTZCZ0csR0FBN0IsQ0FBaUNaLFFBQWpDLENBQVosQ0FBUDtBQUNEOztBQUVEM0QsRUFBQUEsY0FBYyxDQUFDeEIsV0FBRCxFQUFjZ0csU0FBZCxFQUF5QjtBQUNyQyxTQUFLLE1BQU0sQ0FBQ0MsR0FBRCxFQUFNM0MsS0FBTixDQUFYLElBQTJCeEMsTUFBTSxDQUFDd0UsT0FBUCxDQUFldEYsV0FBZixDQUEzQixFQUF3RDtBQUN0RCxVQUFJLDJCQUFjc0QsS0FBZCxDQUFKLEVBQTBCO0FBQ3hCLGFBQUs5QixjQUFMLENBQW9COEIsS0FBcEIsRUFBMkIwQyxTQUFTLEdBQUksR0FBRUEsU0FBVSxJQUFHQyxHQUFJLEVBQXZCLEdBQTJCQSxHQUEvRDtBQUNELE9BRkQsTUFFTztBQUNMLGFBQUtDLGFBQUwsQ0FBbUI1QyxLQUFuQixFQUEwQjBDLFNBQTFCO0FBQ0Q7QUFDRjtBQUNGOztBQUVERSxFQUFBQSxhQUFhLENBQUNwRSxVQUFELEVBQWFrRSxTQUFiLEVBQXdCO0FBRW5DLFNBQUtHLHlCQUFMOztBQUVBLFFBQUlDLHdCQUFXNUMsYUFBWCxDQUF5QjFCLFVBQXpCLENBQUosRUFBMEM7QUFFeENBLE1BQUFBLFVBQVUsR0FBRyxJQUFJQSxVQUFKLENBQWUsSUFBZixFQUFxQmtFLFNBQXJCLENBQWI7QUFDRDs7QUFDRCxRQUFJLEVBQUVsRSxVQUFVLFlBQVlzRSx1QkFBeEIsQ0FBSixFQUF5QztBQUN2QyxZQUFNLElBQUlqQyxLQUFKLENBQVcsdUJBQXNCckMsVUFBVyxFQUE1QyxDQUFOO0FBQ0Q7O0FBR0RBLElBQUFBLFVBQVUsQ0FBQ1ksS0FBWDtBQUNBLFNBQUsxQyxXQUFMLENBQWlCOEIsVUFBVSxDQUFDdUUsR0FBNUIsSUFBbUN2RSxVQUFuQztBQUdBQSxJQUFBQSxVQUFVLENBQUNjLFVBQVg7QUFHQSxVQUFNL0MsVUFBVSxHQUFHaUMsVUFBVSxDQUFDd0UsT0FBWCxFQUFuQjs7QUFDQSxRQUFJekcsVUFBSixFQUFnQjtBQUNkLFdBQUt1QixHQUFMLENBQVN2QixVQUFUO0FBQ0Q7QUFDRjs7QUFFRDBHLEVBQUFBLGFBQWEsQ0FBQ0YsR0FBRCxFQUFNO0FBQ2pCLFdBQU8sS0FBS3JHLFdBQUwsQ0FBaUJxRyxHQUFqQixLQUF5QixJQUFoQztBQUNEOztBQUVERyxFQUFBQSxjQUFjLENBQUNyQixRQUFELEVBQVc7QUFDdkIsV0FBT3JFLE1BQU0sQ0FBQ3NCLE1BQVAsQ0FBYyxLQUFLcEMsV0FBbkIsRUFBZ0NvRixJQUFoQyxDQUFxQ0QsUUFBckMsQ0FBUDtBQUNEOztBQUVEc0IsRUFBQUEsa0JBQWtCLEdBQUc7QUFDbkIsV0FBTyxLQUFLRCxjQUFMLENBQ0wxRSxVQUFVLElBQUlBLFVBQVUsWUFBWTRFLDRCQUQvQixDQUFQO0FBR0Q7O0FBRURDLEVBQUFBLGlCQUFpQixHQUFHO0FBQUE7O0FBQ2xCLFdBQU8sK0JBQUtGLGtCQUFMLDZDQUEyQkcsWUFBM0IsT0FBNkMsSUFBcEQ7QUFDRDs7QUFFREMsRUFBQUEsY0FBYyxDQUFDO0FBQ2IvRyxJQUFBQSxNQUFNLEdBQUdnQixNQUFNLENBQUNYLElBQVAsQ0FBWSxLQUFLTCxNQUFqQixDQURJO0FBRWJnSCxJQUFBQSxnQkFBZ0IsR0FBRyxLQUFLckgsTUFBTCxDQUFZa0QsSUFBWixDQUFpQm1FO0FBRnZCLE1BR1gsRUFIVSxFQUdOO0FBQ04sVUFBTUMsV0FBVyxHQUFHLEVBQXBCOztBQUNBLFNBQUssTUFBTUMsU0FBWCxJQUF3QmxILE1BQXhCLEVBQWdDO0FBQzlCLFlBQU1xQyxVQUFVLEdBQUcsS0FBS3JDLE1BQUwsQ0FBWWtILFNBQVosQ0FBbkI7QUFDQSxZQUFNO0FBQUVDLFFBQUFBO0FBQUYsVUFBYTlFLFVBQVUsQ0FBQytFLFVBQTlCOztBQUNBLFVBQUlELE1BQUosRUFBWTtBQUNWLGNBQU1FLG1CQUFtQixHQUFHTCxnQkFBZ0IsR0FDeEMsS0FBS00sbUJBQUwsQ0FBeUJKLFNBQXpCLENBRHdDLEdBRXhDQSxTQUZKO0FBR0EsY0FBTUssZUFBZSxHQUFHLEVBQXhCOztBQUNBLGFBQUssTUFBTSxDQUFDQyxhQUFELEVBQWdCN0gsTUFBaEIsQ0FBWCxJQUFzQ3FCLE1BQU0sQ0FBQ3dFLE9BQVAsQ0FBZTJCLE1BQWYsQ0FBdEMsRUFBOEQ7QUFDNUQsZ0JBQU07QUFDSk0sWUFBQUEsUUFESTtBQUVKQyxZQUFBQSxjQUZJO0FBR0ovRSxZQUFBQSxJQUhJO0FBSUpnRixZQUFBQTtBQUpJLGNBS0Z0RixVQUFVLENBQUN1RiwrQkFBWCxDQUEyQ0osYUFBM0MsQ0FMSjs7QUFNQSxjQUFJQyxRQUFRLElBQUlFLEtBQUssS0FBSyxDQUExQixFQUE2QjtBQUMzQixrQkFBTUUsY0FBYyxHQUFHYixnQkFBZ0IsR0FDbkMsS0FBS00sbUJBQUwsQ0FBeUIzRSxJQUF6QixDQURtQyxHQUVuQ0EsSUFGSjtBQUdBLGtCQUFNbUYsUUFBUSxHQUFHLCtCQUFrQixDQUNqQ0QsY0FEaUMsRUFFakMsR0FBRywyQkFBY0gsY0FBZCxDQUY4QixDQUFsQixDQUFqQjtBQUlBLGtCQUFNSyxZQUFZLEdBQUdSLGVBQWUsQ0FBQ00sY0FBRCxDQUFsQixLQUFHTixlQUFlLENBQUNNLGNBQUQsQ0FBbEIsR0FBdUMsRUFBdkMsQ0FBbEI7QUFDQUUsWUFBQUEsWUFBWSxDQUFDRCxRQUFELENBQVosR0FBeUJuSSxNQUF6QjtBQUNELFdBVkQsTUFVTztBQUNMLGtCQUFNLElBQUkwRSxLQUFKLENBQVUsK0NBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBQ0Q0QyxRQUFBQSxXQUFXLENBQUNJLG1CQUFELENBQVgsR0FBbUNFLGVBQW5DO0FBQ0Q7QUFDRjs7QUFDRCxXQUFPTixXQUFQO0FBQ0Q7O0FBRUQxRixFQUFBQSxXQUFXLENBQUNSLFFBQUQsRUFBVztBQUNwQixTQUFLLE1BQU0sQ0FBQzRCLElBQUQsRUFBT2hELE1BQVAsQ0FBWCxJQUE2QnFCLE1BQU0sQ0FBQ3dFLE9BQVAsQ0FBZXpFLFFBQWYsQ0FBN0IsRUFBdUQ7QUFDckQsV0FBS2lILFVBQUwsQ0FBZ0JySSxNQUFoQixFQUF3QmdELElBQXhCO0FBQ0Q7QUFDRjs7QUFFRHFGLEVBQUFBLFVBQVUsQ0FBQ3JJLE1BQUQsRUFBU2dELElBQVQsRUFBZTtBQUN2QixRQUFJc0YsT0FBTyxHQUFHLElBQWQ7O0FBQ0EsUUFBSSwyQkFBY3RJLE1BQWQsQ0FBSixFQUEyQjtBQUN6QixZQUFNdUksWUFBWSxHQUFHQyxpQkFBUUMsR0FBUixDQUFZekksTUFBTSxDQUFDMEksSUFBbkIsQ0FBckI7O0FBQ0EsVUFBSSxDQUFDSCxZQUFMLEVBQW1CO0FBQ2pCLGNBQU0sSUFBSTdELEtBQUosQ0FBVyx3QkFBdUIxRSxNQUFPLEVBQXpDLENBQU47QUFDRDs7QUFFRHNJLE1BQUFBLE9BQU8sR0FBRyxJQUFJQyxZQUFKLENBQWlCLElBQWpCLEVBQXVCdkksTUFBdkIsQ0FBVjtBQUNELEtBUEQsTUFPTyxJQUFJQSxNQUFNLFlBQVl3SSxnQkFBdEIsRUFBK0I7QUFDcENGLE1BQUFBLE9BQU8sR0FBR3RJLE1BQVY7QUFDRDs7QUFDRCxRQUFJc0ksT0FBSixFQUFhO0FBQ1gsVUFBSXRGLElBQUosRUFBVTtBQUNSc0YsUUFBQUEsT0FBTyxDQUFDdEYsSUFBUixHQUFlQSxJQUFmO0FBQ0Q7O0FBQ0QsV0FBSzVCLFFBQUwsQ0FBY2tILE9BQU8sQ0FBQ3RGLElBQXRCLElBQThCc0YsT0FBOUI7QUFDRDs7QUFDRCxXQUFPQSxPQUFQO0FBQ0Q7O0FBRURLLEVBQUFBLFVBQVUsQ0FBQzNGLElBQUQsRUFBTztBQUNmLFdBQU8sS0FBSzVCLFFBQUwsQ0FBYzRCLElBQWQsS0FBdUIsSUFBOUI7QUFDRDs7QUFFRDRGLEVBQUFBLGdCQUFnQixDQUFDQyxVQUFELEVBQWFDLE9BQWIsRUFBc0I7QUFDcEMsV0FBT0QsVUFBVSxHQUNiLEtBQUs1SSxTQUFMLENBQWU4SSxPQUFmLENBQXVCRixVQUF2QixFQUFtQ0MsT0FBbkMsQ0FEYSxHQUViLElBRko7QUFHRDs7QUFFREUsRUFBQUEsMEJBQTBCLENBQUNDLFVBQUQsRUFBYUgsT0FBTyxHQUFHLEVBQXZCLEVBQTJCO0FBQ25ELFVBQU1sRSxJQUFJLEdBQUcsRUFBYjtBQUNBLFVBQU07QUFBRXNFLE1BQUFBLFFBQVEsR0FBRztBQUFiLFFBQXdCSixPQUE5QjtBQUVBLFFBQUlLLFVBQVUsR0FBRyxJQUFqQjs7QUFDQSxVQUFNQyxZQUFZLEdBQUcsQ0FBQ3BHLElBQUQsRUFBT00sTUFBUCxLQUFrQjtBQUNyQ3NCLE1BQUFBLElBQUksQ0FBQ3lFLElBQUwsQ0FBVTtBQUNSckcsUUFBQUEsSUFBSSxFQUFFQSxJQUFGLFdBQUVBLElBQUYsR0FBVSxJQUROO0FBRVIsV0FBR007QUFGSyxPQUFWOztBQUlBLFVBQUksQ0FBQ0EsTUFBTSxDQUFDZ0csTUFBWixFQUFvQjtBQUNsQkgsUUFBQUEsVUFBVSxLQUFWQSxVQUFVLEdBQUssRUFBTCxDQUFWO0FBQ0FBLFFBQUFBLFVBQVUsQ0FBQ25HLElBQUksSUFBSWtHLFFBQVQsQ0FBVixHQUErQjVGLE1BQS9CO0FBQ0Q7QUFDRixLQVREOztBQW1CQSxRQUFJaUcsUUFBUSxHQUFHLEtBQWY7O0FBQ0EsUUFBSSxxQkFBUU4sVUFBUixDQUFKLEVBQXlCO0FBQ3ZCLFdBQUssTUFBTTtBQUFFakcsUUFBQUEsSUFBRjtBQUFRLFdBQUdNO0FBQVgsT0FBWCxJQUFrQzJGLFVBQWxDLEVBQThDO0FBQzVDRyxRQUFBQSxZQUFZLENBQUNwRyxJQUFELEVBQU9NLE1BQVAsQ0FBWjtBQUNEO0FBQ0YsS0FKRCxNQUlPLElBQUksc0JBQVMyRixVQUFULENBQUosRUFBMEI7QUFDL0JNLE1BQUFBLFFBQVEsR0FBRyxJQUFYOztBQUNBLFdBQUssTUFBTSxDQUFDdkcsSUFBRCxFQUFPTSxNQUFQLENBQVgsSUFBNkJqQyxNQUFNLENBQUN3RSxPQUFQLENBQWVvRCxVQUFmLENBQTdCLEVBQXlEO0FBQ3ZELFlBQUkzRixNQUFKLEVBQVk7QUFDVjhGLFVBQUFBLFlBQVksQ0FBQ3BHLElBQUQsRUFBT00sTUFBUCxDQUFaO0FBQ0Q7QUFDRjtBQUNGLEtBUE0sTUFPQSxJQUFJMkYsVUFBSixFQUFnQjtBQUNyQixZQUFNLElBQUl2RSxLQUFKLENBQVcsa0NBQWlDdUUsVUFBVyxFQUF2RCxDQUFOO0FBQ0Q7O0FBR0QsVUFBTTNGLE1BQU0sR0FBRywyQkFBYzZGLFVBQWQsRUFBMEJMLE9BQTFCLENBQWY7QUFDQSxVQUFNVSxRQUFRLEdBQUcsS0FBS1osZ0JBQUwsQ0FBc0J0RixNQUF0QixFQUE4QjtBQUU3Q21HLE1BQUFBLFdBQVcsRUFBRSxPQUZnQztBQUc3QyxTQUFHWDtBQUgwQyxLQUE5QixDQUFqQjtBQUtBLFVBQU1ZLEdBQUcsR0FBRztBQUNWakosTUFBQUEsR0FBRyxFQUFFLElBREs7QUFFVlIsTUFBQUEsU0FBUyxFQUFFLEtBQUtBLFNBRk47QUFHVjZJLE1BQUFBO0FBSFUsS0FBWjtBQUtBLFdBQU87QUFDTGxFLE1BQUFBLElBREs7QUFFTHRCLE1BQUFBLE1BRks7QUFHTGlHLE1BQUFBLFFBSEs7QUFJTEwsTUFBQUEsUUFKSztBQUtMTSxNQUFBQSxRQUFRLEVBQUVBLFFBQVEsR0FFZDdGLElBQUksSUFBSTZGLFFBQVEsQ0FBQ0csSUFBVCxDQUFjRCxHQUFkLEVBQW1CL0YsSUFBbkIsQ0FGTSxHQUdkO0FBUkMsS0FBUDtBQVVEOztBQUVEaUcsRUFBQUEscUJBQXFCLENBQUM7QUFBRWxCLElBQUFBLElBQUY7QUFBUW1CLElBQUFBLE9BQVI7QUFBaUJDLElBQUFBLE1BQWpCO0FBQXlCaEIsSUFBQUEsT0FBekI7QUFBa0NpQixJQUFBQTtBQUFsQyxHQUFELEVBQTJDO0FBQUE7O0FBQzlELFdBQU8sSUFBSUMsdUJBQUosQ0FBb0I7QUFDekJ0QixNQUFBQSxJQUR5QjtBQUV6Qm1CLE1BQUFBLE9BRnlCO0FBR3pCQyxNQUFBQSxNQUFNLEVBQUUsS0FBSzdKLFNBQUwsQ0FBZWdLLFdBQWYsQ0FBMkJILE1BQTNCLEVBQW1DaEIsT0FBbkMsQ0FIaUI7QUFLekJpQixNQUFBQSxJQUFJLEVBQUUsOEJBQUsvSixNQUFMLENBQVlXLEdBQVosQ0FBZ0JtSixNQUFoQixtQ0FBd0JDLElBQXhCLEdBQStCQSxJQUEvQixHQUFzQy9EO0FBTG5CLEtBQXBCLENBQVA7QUFPRDs7QUFFRGtFLEVBQUFBLG1CQUFtQixDQUFDQyxLQUFELEVBQVE7QUFBQTs7QUFJekIsVUFBTSxHQUFHQyxHQUFILEVBQVFQLE9BQVIsSUFBbUJNLEtBQUssQ0FBQ04sT0FBTixDQUFjUSxLQUFkLENBQW9CLDBCQUFwQixLQUN2QixDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWFGLEtBQUssQ0FBQ04sT0FBbkIsQ0FERjtBQUVBLFdBQU8sSUFBSVMscUJBQUosQ0FBa0JILEtBQWxCLEVBQXlCO0FBQzlCTixNQUFBQSxPQUQ4QjtBQUc5Qk8sTUFBQUEsR0FBRyxFQUFFLCtCQUFLcEssTUFBTCxDQUFZVyxHQUFaLENBQWdCbUosTUFBaEIsb0NBQXdCTSxHQUF4QixHQUE4QkEsR0FBOUIsR0FBb0NwRTtBQUhYLEtBQXpCLENBQVA7QUFLRDs7QUFFRHRFLEVBQUFBLHFCQUFxQixHQUFHO0FBQ3RCLFVBQU07QUFBRWpCLE1BQUFBLEdBQUY7QUFBT0UsTUFBQUE7QUFBUCxRQUFlLEtBQUtYLE1BQTFCO0FBRUEsU0FBSzJCLEdBQUwsQ0FBUyw4QkFBYSxLQUFLNEksTUFBbEIsQ0FBVDs7QUFFQSxRQUFJOUosR0FBRyxDQUFDK0osWUFBSixLQUFxQixLQUF6QixFQUFnQztBQUM5QixXQUFLN0ksR0FBTCxDQUFTLDhCQUFhOEksVUFBVSxDQUFDaEssR0FBRyxDQUFDK0osWUFBTCxDQUF2QixDQUFUO0FBQ0Q7O0FBQ0QsUUFBSTdKLEdBQUcsQ0FBQytKLFFBQVIsRUFBa0I7QUFDaEIsV0FBSy9JLEdBQUwsQ0FBUyw4QkFBVDtBQUNEOztBQUdELFNBQUtBLEdBQUwsQ0FBUyw4QkFBVDs7QUFDQSxRQUFJbEIsR0FBRyxDQUFDa0ssTUFBSixLQUFlLEtBQW5CLEVBQTBCO0FBQ3hCLFdBQUtoSixHQUFMLENBQVMsd0JBQU84SSxVQUFVLENBQUNoSyxHQUFHLENBQUNrSyxNQUFMLENBQWpCLENBQVQ7QUFDRDs7QUFDRCxRQUFJbEssR0FBRyxDQUFDbUssSUFBSixLQUFhLEtBQWpCLEVBQXdCO0FBQ3RCLFdBQUtqSixHQUFMLENBQVMsbUJBQUs4SSxVQUFVLENBQUNoSyxHQUFHLENBQUNtSyxJQUFMLENBQWYsQ0FBVDtBQUNEOztBQUNELFFBQUluSyxHQUFHLENBQUNvSyxRQUFKLEtBQWlCLEtBQXJCLEVBQTRCO0FBQzFCLFdBQUtsSixHQUFMLENBQVMsMEJBQVMsbUJBQ2hCO0FBR0VtSixRQUFBQSxFQUFFLEVBQUU7QUFDRkMsVUFBQUEsTUFBTSxFQUFFO0FBQ04sYUFBQ0MsY0FBS0MsU0FBTCxDQUFlQyxvQkFBaEIsR0FBdUM7QUFEakM7QUFETjtBQUhOLE9BRGdCLEVBVWhCVCxVQUFVLENBQUNoSyxHQUFHLENBQUNvSyxRQUFMLENBVk0sQ0FBVCxDQUFUO0FBWUQ7O0FBQ0QsUUFBSXBLLEdBQUcsQ0FBQzBLLElBQUosS0FBYSxLQUFqQixFQUF3QjtBQUN0QixXQUFLeEosR0FBTCxDQUFTLGlDQUFUO0FBQ0EsV0FBS0EsR0FBTCxDQUFTLHVCQUFUO0FBQ0Q7QUFDRjs7QUFFRCtFLEVBQUFBLHlCQUF5QixHQUFHO0FBSzFCLFFBQUksQ0FBQyxLQUFLbkYsdUJBQVYsRUFBbUM7QUFDakMsWUFBTTtBQUFFZCxRQUFBQTtBQUFGLFVBQVUsS0FBS1QsTUFBckI7QUFHQSxXQUFLMkIsR0FBTCxDQUFTLDRCQUFXOEksVUFBVSxDQUFDaEssR0FBRyxDQUFDMkssVUFBTCxDQUFyQixDQUFUO0FBRUEsV0FBS3pKLEdBQUwsQ0FBUywyQkFBVSxLQUFLekIsTUFBZixDQUFUO0FBRUEsV0FBS3lCLEdBQUwsQ0FBUyxvQ0FBVDs7QUFFQSxVQUFJbEIsR0FBRyxDQUFDNEssT0FBUixFQUFpQjtBQUNmLGNBQU07QUFDSjNJLFVBQUFBLFVBREk7QUFFSixhQUFHb0c7QUFGQyxZQUdGMkIsVUFBVSxDQUFDaEssR0FBRyxDQUFDNEssT0FBTCxDQUhkOztBQUlBLFlBQUkzSSxVQUFKLEVBQWdCO0FBS2RvRyxVQUFBQSxPQUFPLENBQUN3QyxZQUFSLEdBQXVCLDJCQUFhNUksVUFBYixDQUF2QjtBQUNEOztBQUNELGFBQUtmLEdBQUwsQ0FBUyx5QkFBUW1ILE9BQVIsRUFBaUIsSUFBakIsQ0FBVDtBQUNEOztBQUVELFVBQUlySSxHQUFHLENBQUM4SyxRQUFSLEVBQWtCO0FBQ2hCLGFBQUs1SixHQUFMLENBQVM0SixxQkFBU3BJLFVBQVQsRUFBVDs7QUFDQSxZQUFJMUMsR0FBRyxDQUFDNEssT0FBUixFQUFpQjtBQUNmLGVBQUsxSixHQUFMLENBQVM0SixxQkFBU0YsT0FBVCxFQUFUO0FBQ0Q7O0FBQ0QsYUFBSzFKLEdBQUwsQ0FBUyw2QkFBVDtBQUNEOztBQUdELFdBQUtBLEdBQUwsQ0FBUyw4QkFBVDtBQUNBLFdBQUtKLHVCQUFMLEdBQStCLElBQS9CO0FBQ0Q7QUFDRjs7QUFFREMsRUFBQUEsV0FBVyxHQUFHO0FBQ1osVUFBTTtBQUFFZ0ssTUFBQUEsR0FBRjtBQUFPQyxNQUFBQSxHQUFQO0FBQVlDLE1BQUFBO0FBQVosUUFBb0JDLGNBQUtDLGNBQS9COztBQUVBLFVBQU1DLElBQUksR0FBR0EsSUFBSSxLQUFLO0FBQUVDLE1BQUFBLEVBQUUsRUFBRUQsSUFBSSxDQUFDQztBQUFYLEtBQUwsQ0FBakI7O0FBQ0EsVUFBTUMsV0FBVyxHQUFHO0FBQUVQLE1BQUFBLEdBQUY7QUFBT0MsTUFBQUEsR0FBUDtBQUFZQyxNQUFBQSxHQUFaO0FBQWlCRyxNQUFBQTtBQUFqQixLQUFwQjtBQUVBLFVBQU10QixNQUFNLEdBQUcsbUJBQUssbUJBQ2xCO0FBQ0V5QixNQUFBQSxLQUFLLEVBQUUsTUFEVDtBQUVFRCxNQUFBQSxXQUZGO0FBR0VFLE1BQUFBLFdBQVcsRUFBRTtBQUVYQyxRQUFBQSxNQUFNLEVBQUUsbUNBRkc7QUFJWEMsUUFBQUEsYUFBYSxFQUFFO0FBSkosT0FIZjtBQVVFQyxNQUFBQSxNQUFNLEVBQUUsQ0FDTixxQkFETSxFQUVOLHlCQUZNLEVBR04sNEJBSE0sQ0FWVjtBQWVFQyxNQUFBQSxJQUFJLEVBQUU7QUFmUixLQURrQixFQWtCbEI1QixVQUFVLENBQUMsS0FBS3pLLE1BQUwsQ0FBWXVLLE1BQWIsQ0FsQlEsQ0FBTCxDQUFmO0FBcUJBLFNBQUtBLE1BQUwsR0FBY0EsTUFBTSxDQUFDK0IsS0FBUCxDQUFhO0FBQUV0SixNQUFBQSxJQUFJLEVBQUU7QUFBUixLQUFiLENBQWQ7QUFDRDs7QUFFRHZCLEVBQUFBLFNBQVMsR0FBRztBQUFBOztBQUNWLFFBQUk7QUFBRXlCLE1BQUFBLElBQUY7QUFBUXZDLE1BQUFBO0FBQVIsUUFBZ0IsS0FBS1gsTUFBekI7O0FBQ0EsaUJBQUlrRCxJQUFKLGFBQUksTUFBTXFKLE1BQVYsRUFBa0I7QUFDaEIsWUFBTUMsZ0JBQWdCLEdBQUd0SixJQUFJLENBQUNtRSxnQkFBTCxLQUEwQixJQUExQixHQUNyQixFQURxQixHQUVyQm5FLElBQUksQ0FBQ21FLGdCQUZUOztBQUdBLFVBQUltRixnQkFBSixFQUFzQjtBQUNwQnRKLFFBQUFBLElBQUksR0FBRyxFQUNMLEdBQUdBLElBREU7QUFFTCxhQUFHLHFDQUFxQnNKLGdCQUFyQjtBQUZFLFNBQVA7QUFJRDs7QUFDRCxXQUFLdEosSUFBTCxHQUFZLG9CQUFLQSxJQUFMLENBQVo7O0FBRUEsVUFBSUEsSUFBSSxDQUFDcUosTUFBTCxLQUFnQixZQUFoQixJQUFnQ3JKLElBQUksQ0FBQ3VKLFdBQXpDLEVBQXNEO0FBQ3BELGFBQUssTUFBTSxDQUFDL0QsSUFBRCxFQUFPZ0UsTUFBUCxDQUFYLElBQTZCckwsTUFBTSxDQUFDd0UsT0FBUCxDQUFlM0MsSUFBSSxDQUFDdUosV0FBcEIsQ0FBN0IsRUFBK0Q7QUFDN0QsZUFBS3ZKLElBQUwsQ0FBVXFKLE1BQVYsQ0FBaUJJLE1BQWpCLENBQXdCQyxLQUF4QixDQUE4QkMsYUFBOUIsQ0FBNENuRSxJQUE1QyxFQUFrRGdFLE1BQWxEO0FBQ0Q7QUFDRjs7QUFDRCxVQUFJL0wsR0FBRyxDQUFDeUosR0FBUixFQUFhO0FBQ1gsYUFBSzBDLGdCQUFMO0FBQ0Q7QUFDRjtBQUNGOztBQUVEQSxFQUFBQSxnQkFBZ0IsR0FBRztBQUNqQixVQUFNQyxVQUFVLEdBQUcsRUFBbkI7QUFDQSxVQUFNeEMsTUFBTSxHQUFHLEtBQUtBLE1BQUwsQ0FBWStCLEtBQVosQ0FBa0I7QUFBRXRKLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBQWxCLENBQWY7O0FBQ0EsYUFBU2dLLEdBQVQsQ0FBYUMsS0FBYixFQUFvQjtBQUFFQyxNQUFBQSxRQUFGO0FBQVkvQyxNQUFBQTtBQUFaLEtBQXBCLEVBQXlDO0FBQ3ZDLFlBQU0yQixFQUFFLEdBQUdtQixLQUFLLENBQUNFLGNBQWpCO0FBQ0EsWUFBTUMsSUFBSSxHQUFHdE0sT0FBTyxDQUFDdU0sTUFBUixDQUFlTixVQUFVLENBQUNqQixFQUFELENBQXpCLENBQWI7QUFDQSxZQUFNd0IsUUFBUSxHQUFHRixJQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVUsR0FBVixHQUFnQkEsSUFBSSxDQUFDLENBQUQsQ0FBSixHQUFVLEdBQTNDO0FBQ0EsYUFBT0wsVUFBVSxDQUFDakIsRUFBRCxDQUFqQjtBQUNBLFlBQU07QUFBRTFCLFFBQUFBLEdBQUY7QUFBT21ELFFBQUFBO0FBQVAsVUFBb0JOLEtBQTFCO0FBQ0FDLE1BQUFBLFFBQVEsR0FBRzdMLE1BQU0sQ0FBQ21NLFdBQVAsQ0FDVG5NLE1BQU0sQ0FBQ3dFLE9BQVAsQ0FBZXFILFFBQWYsRUFBeUJuSyxNQUF6QixDQUNFLENBQUMsQ0FBQ3lELEdBQUQsQ0FBRCxLQUFXLENBQUNBLEdBQUcsQ0FBQ2lILFVBQUosQ0FBZSxHQUFmLENBRGQsQ0FEUyxDQUFYO0FBS0FsRCxNQUFBQSxNQUFNLENBQUN0RyxJQUFQLENBQVk7QUFBRXFKLFFBQUFBLFFBQUY7QUFBWUMsUUFBQUEsUUFBWjtBQUFzQkwsUUFBQUEsUUFBdEI7QUFBZ0MvQyxRQUFBQTtBQUFoQyxPQUFaLEVBQXFEQyxHQUFyRDtBQUNEOztBQUVELFNBQUtsSCxJQUFMLENBQ0d3SyxFQURILENBQ00sT0FETixFQUNlVCxLQUFLLElBQUk7QUFDcEJGLE1BQUFBLFVBQVUsQ0FBQ0UsS0FBSyxDQUFDRSxjQUFQLENBQVYsR0FBbUNyTSxPQUFPLENBQUN1TSxNQUFSLEVBQW5DO0FBQ0QsS0FISCxFQUlHSyxFQUpILENBSU0sZ0JBSk4sRUFJd0IsQ0FBQ1IsUUFBRCxFQUFXRCxLQUFYLEtBQXFCO0FBQ3pDRCxNQUFBQSxHQUFHLENBQUNDLEtBQUQsRUFBUTtBQUFFQyxRQUFBQTtBQUFGLE9BQVIsQ0FBSDtBQUNELEtBTkgsRUFPR1EsRUFQSCxDQU9NLGFBUE4sRUFPcUIsQ0FBQ3ZELEtBQUQsRUFBUThDLEtBQVIsS0FBa0I7QUFDbkNELE1BQUFBLEdBQUcsQ0FBQ0MsS0FBRCxFQUFRO0FBQUU5QyxRQUFBQTtBQUFGLE9BQVIsQ0FBSDtBQUNELEtBVEg7QUFVRDs7QUFFRHhDLEVBQUFBLG1CQUFtQixDQUFDZ0csVUFBRCxFQUFhO0FBQzlCLFdBQU8sS0FBS3pLLElBQUwsQ0FBVXFKLE1BQVYsQ0FBaUJxQixjQUFqQixDQUFnQ0QsVUFBaEMsRUFBNENFLE9BQTVDLENBQW9ELFFBQXBELEVBQThELEVBQTlELENBQVA7QUFDRDs7QUFFREMsRUFBQUEscUJBQXFCLENBQUNILFVBQUQsRUFBYTtBQUNoQyxVQUFNSSxHQUFHLEdBQUcsS0FBSzdLLElBQUwsQ0FBVXFKLE1BQVYsQ0FBaUJ5QixtQkFBakIsQ0FBcUM7QUFBRSxPQUFDTCxVQUFELEdBQWM7QUFBaEIsS0FBckMsQ0FBWjtBQUNBLFdBQU90TSxNQUFNLENBQUNYLElBQVAsQ0FBWXFOLEdBQVosRUFBaUIsQ0FBakIsQ0FBUDtBQUNEOztBQUVERSxFQUFBQSxhQUFhLENBQUMvTCxJQUFELEVBQU87QUFDbEIsV0FBTyxLQUFLbEMsTUFBTCxDQUFZUyxHQUFaLENBQWdCeU4sY0FBaEIsR0FBaUMsdUJBQVVoTSxJQUFWLENBQWpDLEdBQW1EQSxJQUExRDtBQUNEOztBQUVEaU0sRUFBQUEsV0FBVyxDQUFDM0MsR0FBRCxFQUFNO0FBQUE7O0FBQ2YsVUFBTTNCLE9BQU8sR0FBRzJCLEdBQUcsQ0FBQzRDLE1BQUosR0FDWix1QkFBVzVDLEdBQUcsQ0FBQzRDLE1BQUosRUFBWCxDQURZLEdBRVo1QyxHQUFHLENBQUMzQixPQUFKLElBQWUyQixHQUZuQjtBQUdBLFVBQU02QyxHQUFHLEdBQUksR0FBRTdDLEdBQUcsQ0FBQ3hJLElBQUssS0FBSTZHLE9BQVEsRUFBcEM7QUFDQSxXQUFPMkIsR0FBRyxDQUFDOEMsS0FBSixJQUFhLGdDQUFLdE8sTUFBTCxDQUFZVyxHQUFaLENBQWdCbUosTUFBaEIsNENBQXdCd0UsS0FBeEIsTUFBa0MsS0FBL0MsR0FDRixHQUFFRCxHQUFJLEtBQUk3QyxHQUFHLENBQUM4QyxLQUFKLENBQVVDLEtBQVYsQ0FBZ0IsWUFBaEIsRUFBOEJDLEtBQTlCLENBQW9DLENBQXBDLEVBQXVDQyxJQUF2QyxDQUE0Q0MsWUFBR0MsR0FBL0MsQ0FBb0QsRUFENUQsR0FFSE4sR0FGSjtBQUdEOztBQUVETyxFQUFBQSxRQUFRLENBQUNwRCxHQUFELEVBQU05QixHQUFOLEVBQVc7QUFDakIsUUFBSSxDQUFDOEIsR0FBRyxDQUFDcUQsTUFBTCxJQUFlLENBQUMsS0FBS2hPLE1BQXpCLEVBQWlDO0FBQy9CLFVBQUk7QUFDRixjQUFNaU8sSUFBSSxHQUFHLEtBQUtYLFdBQUwsQ0FBaUIzQyxHQUFqQixDQUFiO0FBQ0EsY0FBTVEsS0FBSyxHQUNUUixHQUFHLFlBQVl1RCxxQkFBZixJQUFnQ3ZELEdBQUcsQ0FBQ3dELE1BQUosR0FBYSxHQUE3QyxHQUFtRCxNQUFuRCxHQUE0RCxPQUQ5RDtBQUVBLGNBQU16RSxNQUFNLEdBQUcsQ0FBQWIsR0FBRyxRQUFILFlBQUFBLEdBQUcsQ0FBRWEsTUFBTCxLQUFlLEtBQUtBLE1BQW5DO0FBQ0FBLFFBQUFBLE1BQU0sQ0FBQ3lCLEtBQUQsQ0FBTixDQUFjOEMsSUFBZDtBQUNELE9BTkQsQ0FNRSxPQUFPRyxDQUFQLEVBQVU7QUFDVmpMLFFBQUFBLE9BQU8sQ0FBQ21HLEtBQVIsQ0FBYyxxQkFBZCxFQUFxQzhFLENBQXJDO0FBQ0Q7QUFDRjtBQUNGOztBQUVVLFFBQUxDLEtBQUssR0FBRztBQUNaLFFBQUksS0FBS2xQLE1BQUwsQ0FBWVcsR0FBWixDQUFnQm1KLE1BQWhCLEtBQTJCLEtBQS9CLEVBQXNDO0FBQ3BDLFdBQUs0RCxFQUFMLENBQVEsT0FBUixFQUFpQixLQUFLa0IsUUFBdEI7QUFDRDs7QUFDRCxVQUFNLEtBQUtPLElBQUwsQ0FBVSxjQUFWLENBQU47QUFDQSxVQUFNLEtBQUtoSixjQUFMLENBQW9CUCxPQUFPLElBQUlBLE9BQU8sQ0FBQ3NKLEtBQVIsRUFBL0IsQ0FBTjtBQUNBLFVBQU07QUFDSkUsTUFBQUEsTUFBTSxFQUFFO0FBQUVDLFFBQUFBLElBQUY7QUFBUUMsUUFBQUE7QUFBUixPQURKO0FBRUp2TyxNQUFBQTtBQUZJLFFBR0YsS0FBS2YsTUFIVDtBQUlBLFNBQUtvUCxNQUFMLEdBQWMsTUFBTSxJQUFJaEosT0FBSixDQUFZLENBQUNtSixPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDbkQsWUFBTUosTUFBTSxHQUFHLEtBQUtLLE1BQUwsQ0FBWUgsSUFBWixFQUFrQkQsSUFBbEIsRUFBd0IsTUFBTTtBQUMzQyxjQUFNO0FBQUVDLFVBQUFBO0FBQUYsWUFBV0YsTUFBTSxDQUFDTSxPQUFQLEVBQWpCO0FBQ0ExTCxRQUFBQSxPQUFPLENBQUNDLElBQVIsQ0FDRyxHQUFFbEQsR0FBSSw2QkFBNEJzTyxJQUFLLElBQUdDLElBQUssRUFEbEQ7QUFHQUMsUUFBQUEsT0FBTyxDQUFDSCxNQUFELENBQVA7QUFDRCxPQU5jLENBQWY7O0FBT0EsVUFBSSxDQUFDQSxNQUFMLEVBQWE7QUFDWEksUUFBQUEsTUFBTSxDQUFDLElBQUk5SyxLQUFKLENBQVcsb0NBQW1DMkssSUFBSyxJQUFHQyxJQUFLLEVBQTNELENBQUQsQ0FBTjtBQUNEO0FBQ0YsS0FYbUIsQ0FBcEI7QUFZQSxVQUFNLEtBQUtILElBQUwsQ0FBVSxhQUFWLENBQU47QUFDRDs7QUFFUyxRQUFKUSxJQUFJLEdBQUc7QUFDWCxVQUFNLEtBQUtSLElBQUwsQ0FBVSxhQUFWLENBQU47QUFDQSxTQUFLQyxNQUFMLEdBQWMsTUFBTSxJQUFJaEosT0FBSixDQUFZLENBQUNtSixPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDbkQsWUFBTTtBQUFFSixRQUFBQTtBQUFGLFVBQWEsSUFBbkI7O0FBQ0EsVUFBSUEsTUFBSixFQUFZO0FBQ1ZBLFFBQUFBLE1BQU0sQ0FBQ1EsS0FBUCxDQUFhcEUsR0FBRyxJQUFJO0FBQ2xCLGNBQUlBLEdBQUosRUFBUztBQUNQZ0UsWUFBQUEsTUFBTSxDQUFDaEUsR0FBRCxDQUFOO0FBQ0QsV0FGRCxNQUVPO0FBQ0wrRCxZQUFBQSxPQUFPLENBQUMsSUFBRCxDQUFQO0FBQ0Q7QUFDRixTQU5EO0FBV0FNLFFBQUFBLFlBQVksQ0FBQyxNQUFNVCxNQUFNLENBQUNELElBQVAsQ0FBWSxPQUFaLENBQVAsQ0FBWjtBQUNELE9BYkQsTUFhTztBQUNMSyxRQUFBQSxNQUFNLENBQUMsSUFBSTlLLEtBQUosQ0FBVSx1QkFBVixDQUFELENBQU47QUFDRDtBQUNGLEtBbEJtQixDQUFwQjtBQW1CQSxVQUFNLEtBQUt5QixjQUFMLENBQW9CUCxPQUFPLElBQUlBLE9BQU8sQ0FBQytKLElBQVIsRUFBL0IsQ0FBTjtBQUNBLFVBQU0sS0FBS1IsSUFBTCxDQUFVLFlBQVYsQ0FBTjs7QUFDQSxRQUFJLEtBQUtuUCxNQUFMLENBQVlXLEdBQVosQ0FBZ0JtSixNQUFoQixLQUEyQixLQUEvQixFQUFzQztBQUNwQyxXQUFLZ0csR0FBTCxDQUFTLE9BQVQsRUFBa0IsS0FBS2xCLFFBQXZCO0FBQ0Q7QUFDRjs7QUFFZ0IsUUFBWG1CLFdBQVcsR0FBRztBQUNsQixRQUFJO0FBQ0YsWUFBTSxLQUFLYixLQUFMLEVBQU47QUFDRCxLQUZELENBRUUsT0FBTzFELEdBQVAsRUFBWTtBQUNaLFdBQUtvRCxRQUFMLENBQWNwRCxHQUFkO0FBQ0ExSyxNQUFBQSxPQUFPLENBQUNrUCxJQUFSLENBQWEsQ0FBQyxDQUFkO0FBQ0Q7QUFDRjs7QUFJaUIsUUFBWkMsWUFBWSxDQUFDM0gsT0FBRCxFQUFVNEgsS0FBVixFQUFpQkMsS0FBSyxHQUFHLENBQXpCLEVBQTRCQyxHQUFHLEdBQUcsSUFBbEMsRUFBd0M7QUFDeEQsVUFBTUMsVUFBVSxHQUFHLEtBQUs5SyxRQUFMLENBQWMsT0FBZCxDQUFuQjs7QUFDQSxRQUFJOEssVUFBSixFQUFnQjtBQUNkLFlBQU03SSxNQUFNLEdBQUcwSSxLQUFLLENBQUM1SixHQUFOLENBQVVnSyxJQUFJLEtBQUs7QUFDaEM5SixRQUFBQSxHQUFHLEVBQUU4SixJQUFJLENBQUM5SixHQURzQjtBQUVoQzhKLFFBQUFBLElBRmdDO0FBR2hDaEksUUFBQUEsT0FBTyxFQUFFQSxPQUFPLENBQUN0RixJQUhlO0FBSWhDbU4sUUFBQUE7QUFKZ0MsT0FBTCxDQUFkLENBQWY7QUFNQSxhQUFPRSxVQUFVLENBQ2RwRCxLQURJLENBQ0VtRCxHQURGLEVBRUpHLE1BRkksQ0FFRy9JLE1BRkgsQ0FBUDtBQUdEOztBQUNELFdBQU8sSUFBUDtBQUNEOztBQUVpQyxRQUE1QmdKLDRCQUE0QixDQUNoQ2xJLE9BRGdDLEVBRWhDbUksVUFGZ0MsRUFHaENDLFlBSGdDLEVBSWhDTixHQUFHLEdBQUcsSUFKMEIsRUFLaEM7QUFDQSxVQUFNO0FBQ0o1SSxNQUFBQSxNQUFNLEVBQUU7QUFDTm1KLFFBQUFBLG9CQUFvQixHQUFHO0FBRGpCLFVBRUo7QUFIQSxRQUlGLEtBQUszUSxNQUpUO0FBTUEsVUFBTTRRLGFBQWEsR0FBRyxzQkFBU0Qsb0JBQVQsSUFDbEIsNEJBQWNBLG9CQUFkLENBRGtCLEdBRWxCQSxvQkFGSjtBQUlBLFVBQU1FLGFBQWEsR0FBRyxFQUF0QjtBQUNBLFVBQU1SLFVBQVUsR0FBRyxLQUFLOUssUUFBTCxDQUFjLE9BQWQsQ0FBbkI7O0FBQ0EsUUFBSThLLFVBQUosRUFBZ0I7QUFDZFEsTUFBQUEsYUFBYSxDQUFDeEgsSUFBZCxDQUNFLElBQUcsTUFBTSxLQUFLeUgsZ0JBQUwsQ0FBc0J4SSxPQUF0QixFQUErQm1JLFVBQS9CLEVBQTJDTCxHQUEzQyxDQUFULENBREY7O0FBR0EsVUFDRUssVUFBVSxDQUFDak8sTUFBWCxHQUFvQixDQUFwQixJQUNBa08sWUFBWSxDQUFDbE8sTUFBYixHQUFzQixDQUZ4QixFQUdFO0FBQ0EsY0FBTXVPLFdBQVcsR0FBRyxDQUFDYixLQUFELEVBQVFjLFNBQVIsS0FDbEJkLEtBQUssQ0FBQzFOLE1BQU4sR0FBZSxDQUFmLElBQ0E2TixVQUFVLENBQUNwRCxLQUFYLENBQWlCbUQsR0FBakIsRUFDR2EsT0FESCxDQUNXLEtBRFgsRUFDa0JmLEtBQUssQ0FBQzVKLEdBQU4sQ0FBVWdLLElBQUksSUFBSUEsSUFBSSxDQUFDOUosR0FBdkIsQ0FEbEIsRUFFR3dLLFNBRkgsQ0FFYSxPQUZiLEVBRXNCQSxTQUZ0QixDQUZGOztBQU1BLGNBQU01SyxPQUFPLENBQUNDLEdBQVIsQ0FBWSxDQUNoQjBLLFdBQVcsQ0FBQ04sVUFBRCxFQUFhLENBQWIsQ0FESyxFQUVoQk0sV0FBVyxDQUFDTCxZQUFELEVBQWUsQ0FBQyxDQUFoQixDQUZLLENBQVosQ0FBTjs7QUFJQSxZQUFJRSxhQUFhLEdBQUcsQ0FBcEIsRUFBdUI7QUFDckJNLFVBQUFBLFVBQVUsQ0FHUixNQUFNLEtBQUtDLG1CQUFMLENBQXlCUCxhQUF6QixDQUhFLEVBSVJBLGFBSlEsQ0FBVjtBQU1EO0FBQ0Y7O0FBR0QsWUFBTSxLQUFLTyxtQkFBTCxDQUF5QlAsYUFBekIsRUFBd0NSLEdBQXhDLENBQU47QUFDQSxhQUFPUyxhQUFQO0FBQ0Q7QUFDRjs7QUFFcUIsUUFBaEJDLGdCQUFnQixDQUFDeEksT0FBRCxFQUFVNEgsS0FBVixFQUFpQkUsR0FBRyxHQUFHLElBQXZCLEVBQTZCO0FBQ2pELFVBQU1TLGFBQWEsR0FBRyxFQUF0QjtBQUNBLFVBQU1SLFVBQVUsR0FBRyxLQUFLOUssUUFBTCxDQUFjLE9BQWQsQ0FBbkI7O0FBQ0EsUUFBSThLLFVBQUosRUFBZ0I7QUFFZCxZQUFNakssT0FBTyxDQUFDQyxHQUFSLENBQ0o2SixLQUFLLENBQUM1SixHQUFOLENBQVUsTUFBTWdLLElBQU4sSUFBYztBQUN0QixjQUFNYyxLQUFLLEdBQUcsTUFBTWYsVUFBVSxDQUFDcEQsS0FBWCxDQUFpQm1ELEdBQWpCLEVBQXNCaUIsT0FBdEIsQ0FBOEIsS0FBOUIsRUFBcUNmLElBQUksQ0FBQzlKLEdBQTFDLENBQXBCOztBQUNBLFlBQUksQ0FBQzRLLEtBQUwsRUFBWTtBQUNWLGNBQUlkLElBQUksQ0FBQzNNLElBQUwsSUFBYTJNLElBQUksQ0FBQzFKLEdBQXRCLEVBQTJCO0FBQ3pCLGdCQUFJO0FBQUVqRCxjQUFBQTtBQUFGLGdCQUFXMk0sSUFBZjs7QUFDQSxnQkFBSSxDQUFDM00sSUFBTCxFQUFXO0FBQ1RLLGNBQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUNHLEdBQ0NDLG9CQUFLb04sR0FBTCxDQUFTLE9BQVQsQ0FDRCxVQUNDcE4sb0JBQUtxTixLQUFMLENBQVksSUFBR2pCLElBQUksQ0FBQ3ROLElBQUssR0FBekIsQ0FDRCw0Q0FDQ2tCLG9CQUFLcU4sS0FBTCxDQUFZLElBQUdqQixJQUFJLENBQUMxSixHQUFJLEdBQXhCLENBQ0QsMEJBQ0MxQyxvQkFBS3FOLEtBQUwsQ0FBWSxJQUFHakosT0FBTyxDQUFDdEYsSUFBSyxHQUE1QixDQUNELEtBVEg7QUFXQSxvQkFBTWtLLFFBQVEsR0FBRyxNQUFNc0UsZUFBTUMsT0FBTixDQUFjO0FBQ25DQyxnQkFBQUEsTUFBTSxFQUFFLEtBRDJCO0FBRW5DOUssZ0JBQUFBLEdBQUcsRUFBRTBKLElBQUksQ0FBQzFKLEdBRnlCO0FBR25DK0ssZ0JBQUFBLFlBQVksRUFBRTtBQUhxQixlQUFkLENBQXZCO0FBS0FoTyxjQUFBQSxJQUFJLEdBQUd1SixRQUFRLENBQUN2SixJQUFoQjtBQUNEOztBQUNELGtCQUFNaU8sWUFBWSxHQUFHLE1BQU10SixPQUFPLENBQUN1SixPQUFSLENBQWdCdkIsSUFBaEIsRUFBc0IzTSxJQUF0QixDQUEzQjtBQUNBLGtCQUFNLEtBQUtzTSxZQUFMLENBQWtCM0gsT0FBbEIsRUFBMkIsQ0FBQ3NKLFlBQUQsQ0FBM0IsRUFBMkMsQ0FBM0MsRUFBOEN4QixHQUE5QyxDQUFOO0FBSUEvTyxZQUFBQSxNQUFNLENBQUN5USxNQUFQLENBQWN4QixJQUFkLEVBQW9Cc0IsWUFBcEI7QUFDQWYsWUFBQUEsYUFBYSxDQUFDeEgsSUFBZCxDQUFtQnVJLFlBQW5CO0FBQ0QsV0E1QkQsTUE0Qk87QUFDTCxrQkFBTSxJQUFJRyxrQkFBSixDQUNILGdEQUNDekIsSUFBSSxDQUFDdE4sSUFDTixPQUNDc04sSUFBSSxDQUFDOUosR0FDTixJQUxHLENBQU47QUFPRDtBQUNGLFNBdENELE1Bc0NPO0FBR0xuRixVQUFBQSxNQUFNLENBQUN5USxNQUFQLENBQWN4QixJQUFkLEVBQW9CYyxLQUFLLENBQUNkLElBQTFCO0FBR0Q7QUFDRixPQS9DRCxDQURJLENBQU47QUFrREQ7O0FBQ0QsV0FBT08sYUFBUDtBQUNEOztBQUV5QixRQUFwQm1CLG9CQUFvQixDQUFDMUosT0FBRCxFQUFVNEgsS0FBVixFQUFpQkUsR0FBRyxHQUFHLElBQXZCLEVBQTZCO0FBQ3JELFVBQU02QixhQUFhLEdBQUcsRUFBdEI7QUFDQSxVQUFNNUIsVUFBVSxHQUFHLEtBQUs5SyxRQUFMLENBQWMsT0FBZCxDQUFuQjs7QUFDQSxRQUFJOEssVUFBSixFQUFnQjtBQUNkLFlBQU1qSyxPQUFPLENBQUNDLEdBQVIsQ0FDSjZKLEtBQUssQ0FBQzVKLEdBQU4sQ0FBVSxNQUFNZ0ssSUFBTixJQUFjO0FBQ3RCLFlBQUlBLElBQUksQ0FBQzNNLElBQVQsRUFBZTtBQUNiLGdCQUFNeU4sS0FBSyxHQUFHLE1BQU1mLFVBQVUsQ0FBQ3BELEtBQVgsQ0FBaUJtRCxHQUFqQixFQUFzQmlCLE9BQXRCLENBQThCLEtBQTlCLEVBQXFDZixJQUFJLENBQUM5SixHQUExQyxDQUFwQjs7QUFDQSxjQUFJNEssS0FBSixFQUFXO0FBQ1Qsa0JBQU1jLFdBQVcsR0FBRyxNQUFNNUosT0FBTyxDQUFDdUosT0FBUixDQUFnQnZCLElBQWhCLEVBQXNCQSxJQUFJLENBQUMzTSxJQUEzQixDQUExQjtBQUlBdEMsWUFBQUEsTUFBTSxDQUFDeVEsTUFBUCxDQUFjeEIsSUFBZCxFQUFvQjRCLFdBQXBCO0FBQ0FELFlBQUFBLGFBQWEsQ0FBQzVJLElBQWQsQ0FBbUI2SSxXQUFuQjtBQUNELFdBUEQsTUFPTztBQUNMLGtCQUFNLElBQUlILGtCQUFKLENBQ0gsd0RBQ0N6QixJQUFJLENBQUN0TixJQUNOLE9BQ0NzTixJQUFJLENBQUM5SixHQUNOLElBTEcsQ0FBTjtBQU9EO0FBQ0Y7QUFDRixPQXBCRCxDQURJLENBQU47QUF1QkQ7O0FBQ0QsV0FBT3lMLGFBQVA7QUFDRDs7QUFFd0IsUUFBbkJkLG1CQUFtQixDQUFDUCxhQUFhLEdBQUcsQ0FBakIsRUFBb0JSLEdBQUcsR0FBRyxJQUExQixFQUFnQztBQUN2RCxVQUFNQyxVQUFVLEdBQUcsS0FBSzlLLFFBQUwsQ0FBYyxPQUFkLENBQW5COztBQUNBLFFBQUk4SyxVQUFKLEVBQWdCO0FBQ2QsYUFBT0EsVUFBVSxDQUFDOEIsV0FBWCxDQUF1Qi9CLEdBQXZCLEVBQTRCLE1BQU1BLEdBQU4sSUFBYTtBQUc5QyxjQUFNZ0MsSUFBSSxHQUFHLElBQUlDLElBQUosRUFBYjtBQUNBRCxRQUFBQSxJQUFJLENBQUNFLGVBQUwsQ0FBcUJGLElBQUksQ0FBQ0csZUFBTCxLQUF5QjNCLGFBQTlDO0FBQ0EsY0FBTTRCLGNBQWMsR0FBRyxNQUFNbkMsVUFBVSxDQUNwQ3BELEtBRDBCLENBQ3BCbUQsR0FEb0IsRUFFMUJxQyxLQUYwQixDQUVwQixPQUZvQixFQUVYLENBRlcsRUFHMUJDLFFBSDBCLENBR2pCLFdBSGlCLEVBR0osSUFISSxFQUdFTixJQUhGLEVBTTFCTSxRQU4wQixDQU1qQixXQU5pQixFQU1KLEdBTkksRUFNQyxvQkFBSSxXQUFKLENBTkQsQ0FBN0I7O0FBT0EsWUFBSUYsY0FBYyxDQUFDaFEsTUFBZixHQUF3QixDQUE1QixFQUErQjtBQUM3QixnQkFBTW1RLFlBQVksR0FBRyxNQUFNdk0sT0FBTyxDQUFDQyxHQUFSLENBQ3pCbU0sY0FBYyxDQUFDbE0sR0FBZixDQUFtQixNQUFNOEssS0FBTixJQUFlO0FBQ2hDLGdCQUFJO0FBQ0Ysb0JBQU0sS0FBS3pJLFVBQUwsQ0FBZ0J5SSxLQUFLLENBQUM5SSxPQUF0QixFQUErQnNLLFVBQS9CLENBQTBDeEIsS0FBSyxDQUFDZCxJQUFoRCxDQUFOO0FBQ0QsYUFGRCxDQUVFLE9BQU9uRyxLQUFQLEVBQWM7QUFDZCxtQkFBS2dGLElBQUwsQ0FBVSxPQUFWLEVBQW1CaEYsS0FBbkI7QUFDQWlILGNBQUFBLEtBQUssQ0FBQ2pILEtBQU4sR0FBY0EsS0FBZDtBQUNEOztBQUNELG1CQUFPaUgsS0FBSyxDQUFDNUssR0FBYjtBQUNELFdBUkQsQ0FEeUIsQ0FBM0I7QUFXQSxnQkFBTTZKLFVBQVUsQ0FDYnBELEtBREcsQ0FDR21ELEdBREgsRUFFSHlDLE1BRkcsR0FHSDVCLE9BSEcsQ0FHSyxLQUhMLEVBR1kwQixZQUhaLENBQU47QUFJRDs7QUFDRCxlQUFPSCxjQUFQO0FBQ0QsT0E5Qk0sQ0FBUDtBQStCRDtBQUNGOztBQS80QmtDOzs7O0FBbzVCckNNLGtCQUFhQyxLQUFiLENBQW1CbFQsV0FBVyxDQUFDbVQsU0FBL0I7O0FBRUEsU0FBU3ZJLFVBQVQsQ0FBb0IzQixPQUFwQixFQUE2QjtBQUMzQixTQUFPLHNCQUFTQSxPQUFULElBQW9CQSxPQUFwQixHQUE4QixFQUFyQztBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEtvYSBmcm9tICdrb2EnXG5pbXBvcnQgS25leCBmcm9tICdrbmV4J1xuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCdcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcbmltcG9ydCBwaWNvIGZyb20gJ3BpY29jb2xvcnMnXG5pbXBvcnQgemxpYiBmcm9tICd6bGliJ1xuaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBvcyBmcm9tICdvcydcbmltcG9ydCBwYXJzZUR1cmF0aW9uIGZyb20gJ3BhcnNlLWR1cmF0aW9uJ1xuaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAna29hLWJvZHlwYXJzZXInXG5pbXBvcnQgY29ycyBmcm9tICdAa29hL2NvcnMnXG5pbXBvcnQgY29tcG9zZSBmcm9tICdrb2EtY29tcG9zZSdcbmltcG9ydCBjb21wcmVzcyBmcm9tICdrb2EtY29tcHJlc3MnXG5pbXBvcnQgY29uZGl0aW9uYWwgZnJvbSAna29hLWNvbmRpdGlvbmFsLWdldCdcbmltcG9ydCBwYXNzcG9ydCBmcm9tICdrb2EtcGFzc3BvcnQnXG5pbXBvcnQgc2Vzc2lvbiBmcm9tICdrb2Etc2Vzc2lvbidcbmltcG9ydCBldGFnIGZyb20gJ2tvYS1ldGFnJ1xuaW1wb3J0IGhlbG1ldCBmcm9tICdrb2EtaGVsbWV0J1xuaW1wb3J0IHJlc3BvbnNlVGltZSBmcm9tICdrb2EtcmVzcG9uc2UtdGltZSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGRpdG9qcy9yb3V0ZXInXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAL2xpYidcbmltcG9ydCB7IENvbnRyb2xsZXIsIEFkbWluQ29udHJvbGxlciB9IGZyb20gJ0AvY29udHJvbGxlcnMnXG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnQC9zZXJ2aWNlcydcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAL3N0b3JhZ2UnXG5pbXBvcnQgeyBjb252ZXJ0U2NoZW1hIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBmb3JtYXRKc29uIH0gZnJvbSAnQC91dGlscydcbmltcG9ydCB7XG4gIFJlc3BvbnNlRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbiAgQXNzZXRFcnJvclxufSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgcGljby55ZWxsb3cuYm9sZChgXFxuJHttb2RlbENsYXNzLm5hbWV9OlxcbmApLFxuICAgICAgICAgICAgdXRpbC5pbnNwZWN0KGRhdGEsIHtcbiAgICAgICAgICAgICAgY29sb3JzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXB0aDogbnVsbCxcbiAgICAgICAgICAgICAgbWF4QXJyYXlMZW5ndGg6IG51bGxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkTW9kZWwobW9kZWxDbGFzcykge1xuICAgIGlmIChNb2RlbC5pc1Byb3RvdHlwZU9mKG1vZGVsQ2xhc3MpKSB7XG4gICAgICBtb2RlbENsYXNzLmFwcCA9IHRoaXNcbiAgICAgIHRoaXMubW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtb2RlbCBjbGFzczogJHttb2RlbENsYXNzfWApXG4gICAgfVxuICB9XG5cbiAgc29ydE1vZGVscyhtb2RlbHMpIHtcbiAgICBjb25zdCBzb3J0QnlSZWxhdGlvbnMgPSAobGlzdCwgY29sbGVjdGVkID0ge30sIGV4Y2x1ZGVkID0ge30pID0+IHtcbiAgICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBsaXN0KSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gbW9kZWxDbGFzc1xuICAgICAgICBpZiAoIWNvbGxlY3RlZFtuYW1lXSAmJiAhZXhjbHVkZWRbbmFtZV0pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIE9iamVjdC52YWx1ZXMobW9kZWxDbGFzcy5nZXRSZWxhdGlvbnMoKSkpIHtcbiAgICAgICAgICAgIGlmICghKHJlbGF0aW9uIGluc3RhbmNlb2YgQmVsb25nc1RvT25lUmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgcmVsYXRlZE1vZGVsQ2xhc3MsIGpvaW5UYWJsZU1vZGVsQ2xhc3MgfSA9IHJlbGF0aW9uXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZCBvZiBbam9pblRhYmxlTW9kZWxDbGFzcywgcmVsYXRlZE1vZGVsQ2xhc3NdKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBzZWxmLXJlZmVyZW5jZXMgYW5kIGdlbmVyYXRlZCBqb2luIG1vZGVsczpcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRlZCAmJiByZWxhdGVkICE9PSBtb2RlbENsYXNzICYmIG1vZGVsc1tyZWxhdGVkLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICBzb3J0QnlSZWxhdGlvbnMoW3JlbGF0ZWRdLCBjb2xsZWN0ZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBtb2RlbENsYXNzIHRvIHByZXZlbnQgZW5kbGVzcyByZWN1cnNpb25zOlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV06IG1vZGVsQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb2xsZWN0ZWRbbmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvbGxlY3RlZClcbiAgICB9XG4gICAgLy8gUmV0dXJuIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzb3J0ZWQgbW9kZWxzIGFzIGl0cyBrZXkvdmFsdWUgcGFpcnMuXG4gICAgLy8gTk9URTogV2UgbmVlZCB0byByZXZlcnNlIGZvciB0aGUgYWJvdmUgYWxnb3JpdGhtIHRvIHNvcnQgcHJvcGVybHksXG4gICAgLy8gYW5kIHRoZW4gcmV2ZXJzZSB0aGUgcmVzdWx0IGJhY2suXG4gICAgcmV0dXJuIHNvcnRCeVJlbGF0aW9ucyhPYmplY3QudmFsdWVzKG1vZGVscykucmV2ZXJzZSgpKS5yZXZlcnNlKCkucmVkdWNlKFxuICAgICAgKG1vZGVscywgbW9kZWxDbGFzcykgPT4ge1xuICAgICAgICBtb2RlbHNbbW9kZWxDbGFzcy5uYW1lXSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgcmV0dXJuIG1vZGVsc1xuICAgICAgfSxcbiAgICAgIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICApXG4gIH1cblxuICBnZXRNb2RlbChuYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubW9kZWxzW25hbWVdIHx8XG4gICAgICAhbmFtZS5lbmRzV2l0aCgnTW9kZWwnKSAmJiB0aGlzLm1vZGVsc1tgJHtuYW1lfU1vZGVsYF0gfHxcbiAgICAgIG51bGxcbiAgICApXG4gIH1cblxuICBmaW5kTW9kZWwoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm1vZGVscykuZmluZChjYWxsYmFjaylcbiAgfVxuXG4gIGFkZFNlcnZpY2VzKHNlcnZpY2VzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgc2VydmljZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZXMpKSB7XG4gICAgICAvLyBIYW5kbGUgRVM2IG1vZHVsZSB3ZWlyZG5lc3MgdGhhdCBjYW4gaGFwcGVuLCBhcHBhcmVudGx5OlxuICAgICAgaWYgKG5hbWUgPT09ICdkZWZhdWx0JyAmJiBpc1BsYWluT2JqZWN0KHNlcnZpY2UpKSB7XG4gICAgICAgIHRoaXMuYWRkU2VydmljZXMoc2VydmljZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkU2VydmljZShzZXJ2aWNlLCBuYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSkge1xuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChTZXJ2aWNlLmlzUHJvdG90eXBlT2Yoc2VydmljZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBzZXJ2aWNlID0gbmV3IHNlcnZpY2UodGhpcywgbmFtZSlcbiAgICB9XG4gICAgaWYgKCEoc2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2VydmljZTogJHtzZXJ2aWNlfWApXG4gICAgfVxuICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCwgYHNlcnZpY2UubmFtZWAgaXMgZ3VhcmFudGVlZCB0byBiZVxuICAgIC8vIHNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgZS5nLiB3aXRoIGFuIGFmdGVyLWNvbnN0cnVjdG9yIGNsYXNzIHByb3BlcnR5LlxuICAgICh7IG5hbWUgfSA9IHNlcnZpY2UpXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcuc2VydmljZXNbbmFtZV1cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uZmlndXJhdGlvbiBtaXNzaW5nIGZvciBzZXJ2aWNlICcke25hbWV9J2ApXG4gICAgfVxuICAgIC8vIEFzIGEgY29udmVudGlvbiwgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBzZXJ2aWNlIGNhbiBiZSBzZXQgdG8gYGZhbHNlYFxuICAgIC8vIGluIG9yZGVyIHRvIGVudGlyZWx5IGRlYWN0aXZhdGUgdGhlIHNlcnZpY2UuXG4gICAgaWYgKGNvbmZpZyAhPT0gZmFsc2UpIHtcbiAgICAgIHNlcnZpY2Uuc2V0dXAoY29uZmlnKVxuICAgICAgdGhpcy5zZXJ2aWNlc1tuYW1lXSA9IHNlcnZpY2VcbiAgICAgIC8vIE5vdyB0aGF0IHRoZSBzZXJ2aWNlIGlzIHNldCB1cCwgY2FsbCBgaW5pdGlhbGl6ZSgpYCB3aGljaCBjYW4gYmVcbiAgICAgIC8vIG92ZXJyaWRkZW4gYnkgc2VydmljZXMuXG4gICAgICBzZXJ2aWNlLmluaXRpYWxpemUoKVxuICAgIH1cbiAgfVxuXG4gIGdldFNlcnZpY2UobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzW25hbWVdIHx8IG51bGxcbiAgfVxuXG4gIGZpbmRTZXJ2aWNlKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5zZXJ2aWNlcykuZmluZChjYWxsYmFjaylcbiAgfVxuXG4gIGZvckVhY2hTZXJ2aWNlKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXModGhpcy5zZXJ2aWNlcykubWFwKGNhbGxiYWNrKSlcbiAgfVxuXG4gIGFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzLCBuYW1lc3BhY2UpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb250cm9sbGVycykpIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKHZhbHVlLCBuYW1lc3BhY2UgPyBgJHtuYW1lc3BhY2V9LyR7a2V5fWAgOiBrZXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZENvbnRyb2xsZXIodmFsdWUsIG5hbWVzcGFjZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRDb250cm9sbGVyKGNvbnRyb2xsZXIsIG5hbWVzcGFjZSkge1xuICAgIC8vIENvbnRyb2xsZXJzIHJlcXVpcmUgYWRkaXRpb25hbCBtaWRkbGV3YXJlIHRvIGJlIGluc3RhbGxlZCBvbmNlLlxuICAgIHRoaXMuc2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSgpXG4gICAgLy8gQXV0by1pbnN0YW50aWF0ZSBjb250cm9sbGVyIGNsYXNzZXM6XG4gICAgaWYgKENvbnRyb2xsZXIuaXNQcm90b3R5cGVPZihjb250cm9sbGVyKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgY29udHJvbGxlcih0aGlzLCBuYW1lc3BhY2UpXG4gICAgfVxuICAgIGlmICghKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBDb250cm9sbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRyb2xsZXI6ICR7Y29udHJvbGxlcn1gKVxuICAgIH1cbiAgICAvLyBJbmhlcml0YW5jZSBvZiBhY3Rpb24gbWV0aG9kcyBjYW5ub3QgaGFwcGVuIGluIHRoZSBjb25zdHJ1Y3RvciBpdHNlbGYsXG4gICAgLy8gc28gY2FsbCBzZXBhcmF0ZSBgc2V0dXAoKWAgbWV0aG9kIGFmdGVyIGluIG9yZGVyIHRvIHRha2UgY2FyZSBvZiBpdC5cbiAgICBjb250cm9sbGVyLnNldHVwKClcbiAgICB0aGlzLmNvbnRyb2xsZXJzW2NvbnRyb2xsZXIudXJsXSA9IGNvbnRyb2xsZXJcbiAgICAvLyBOb3cgdGhhdCB0aGUgY29udHJvbGxlciBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgLy8gb3ZlcnJpZGRlbiBieSBjb250cm9sbGVycy5cbiAgICBjb250cm9sbGVyLmluaXRpYWxpemUoKVxuICAgIC8vIEVhY2ggY29udHJvbGxlciBjYW4gYWxzbyBwcm92aWRlIGZ1cnRoZXIgbWlkZGxld2FyZSwgZS5nLlxuICAgIC8vIGBBZG1pbkNvbnRyb2xsZXJgOlxuICAgIGNvbnN0IG1pZGRsZXdhcmUgPSBjb250cm9sbGVyLmNvbXBvc2UoKVxuICAgIGlmIChtaWRkbGV3YXJlKSB7XG4gICAgICB0aGlzLnVzZShtaWRkbGV3YXJlKVxuICAgIH1cbiAgfVxuXG4gIGdldENvbnRyb2xsZXIodXJsKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlcnNbdXJsXSB8fCBudWxsXG4gIH1cblxuICBmaW5kQ29udHJvbGxlcihjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29udHJvbGxlcnMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBnZXRBZG1pbkNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZENvbnRyb2xsZXIoXG4gICAgICBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBBZG1pbkNvbnRyb2xsZXJcbiAgICApXG4gIH1cblxuICBnZXRBZG1pblZ1ZUNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBZG1pbkNvbnRyb2xsZXIoKT8uZ2V0VnVlQ29uZmlnKCkgfHwgbnVsbFxuICB9XG5cbiAgZ2V0QXNzZXRDb25maWcoe1xuICAgIG1vZGVscyA9IE9iamVjdC5rZXlzKHRoaXMubW9kZWxzKSxcbiAgICBub3JtYWxpemVEYk5hbWVzID0gdGhpcy5jb25maWcua25leC5ub3JtYWxpemVEYk5hbWVzXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IGFzc2V0Q29uZmlnID0ge31cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBvZiBtb2RlbHMpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLm1vZGVsc1ttb2RlbE5hbWVdXG4gICAgICBjb25zdCB7IGFzc2V0cyB9ID0gbW9kZWxDbGFzcy5kZWZpbml0aW9uXG4gICAgICBpZiAoYXNzZXRzKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNb2RlbE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgPyB0aGlzLm5vcm1hbGl6ZUlkZW50aWZpZXIobW9kZWxOYW1lKVxuICAgICAgICAgIDogbW9kZWxOYW1lXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZEFzc2V0cyA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgW2Fzc2V0RGF0YVBhdGgsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoYXNzZXRzKSkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgbmVzdGVkRGF0YVBhdGgsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICB9ID0gbW9kZWxDbGFzcy5nZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoKGFzc2V0RGF0YVBhdGgpXG4gICAgICAgICAgaWYgKHByb3BlcnR5ICYmIGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZURiTmFtZXNcbiAgICAgICAgICAgICAgPyB0aGlzLm5vcm1hbGl6ZUlkZW50aWZpZXIobmFtZSlcbiAgICAgICAgICAgICAgOiBuYW1lXG4gICAgICAgICAgICBjb25zdCBkYXRhUGF0aCA9IG5vcm1hbGl6ZURhdGFQYXRoKFtcbiAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUsXG4gICAgICAgICAgICAgIC4uLnBhcnNlRGF0YVBhdGgobmVzdGVkRGF0YVBhdGgpXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICAgY29uc3QgYXNzZXRDb25maWdzID0gY29udmVydGVkQXNzZXRzW25vcm1hbGl6ZWROYW1lXSB8fD0ge31cbiAgICAgICAgICAgIGFzc2V0Q29uZmlnc1tkYXRhUGF0aF0gPSBjb25maWdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXN0ZWQgZ3JhcGggcHJvcGVydGllcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NldENvbmZpZ1tub3JtYWxpemVkTW9kZWxOYW1lXSA9IGNvbnZlcnRlZEFzc2V0c1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXNzZXRDb25maWdcbiAgfVxuXG4gIGFkZFN0b3JhZ2VzKHN0b3JhZ2VzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhzdG9yYWdlcykpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZShjb25maWcsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgYWRkU3RvcmFnZShjb25maWcsIG5hbWUpIHtcbiAgICBsZXQgc3RvcmFnZSA9IG51bGxcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjb25maWcpKSB7XG4gICAgICBjb25zdCBzdG9yYWdlQ2xhc3MgPSBTdG9yYWdlLmdldChjb25maWcudHlwZSlcbiAgICAgIGlmICghc3RvcmFnZUNsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc3RvcmFnZTogJHtjb25maWd9YClcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBzdG9yYWdlID0gbmV3IHN0b3JhZ2VDbGFzcyh0aGlzLCBjb25maWcpXG4gICAgfSBlbHNlIGlmIChjb25maWcgaW5zdGFuY2VvZiBTdG9yYWdlKSB7XG4gICAgICBzdG9yYWdlID0gY29uZmlnXG4gICAgfVxuICAgIGlmIChzdG9yYWdlKSB7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBzdG9yYWdlLm5hbWUgPSBuYW1lXG4gICAgICB9XG4gICAgICB0aGlzLnN0b3JhZ2VzW3N0b3JhZ2UubmFtZV0gPSBzdG9yYWdlXG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlXG4gIH1cblxuICBnZXRTdG9yYWdlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBjb21waWxlVmFsaWRhdG9yKGpzb25TY2hlbWEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4ganNvblNjaGVtYVxuICAgICAgPyB0aGlzLnZhbGlkYXRvci5jb21waWxlKGpzb25TY2hlbWEsIG9wdGlvbnMpXG4gICAgICA6IG51bGxcbiAgfVxuXG4gIGNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yKHBhcmFtZXRlcnMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGxpc3QgPSBbXVxuICAgIGNvbnN0IHsgZGF0YU5hbWUgPSAnZGF0YScgfSA9IG9wdGlvbnNcblxuICAgIGxldCBwcm9wZXJ0aWVzID0gbnVsbFxuICAgIGNvbnN0IGFkZFBhcmFtZXRlciA9IChuYW1lLCBzY2hlbWEpID0+IHtcbiAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUgPz8gbnVsbCxcbiAgICAgICAgLi4uc2NoZW1hXG4gICAgICB9KVxuICAgICAgaWYgKCFzY2hlbWEubWVtYmVyKSB7XG4gICAgICAgIHByb3BlcnRpZXMgfHw9IHt9XG4gICAgICAgIHByb3BlcnRpZXNbbmFtZSB8fCBkYXRhTmFtZV0gPSBzY2hlbWFcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdXBwb3J0IHR3byBmb3JtYXRzIG9mIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnM6XG4gICAgLy8gLSBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgc2NoZW1hcywgbmFtZWQgYnkgdGhlaXIgYG5hbWVgIGtleS5cbiAgICAvLyAtIEFuIG9iamVjdCBvZiBwYXJhbWV0ZXIgc2NoZW1hcywgbmFtZWQgYnkgdGhlIGtleSB1bmRlciB3aGljaCBlYWNoXG4gICAgLy8gICBzY2hlbWEgaXMgc3RvcmVkIGluIHRoZSByb290IG9iamVjdC5cbiAgICAvLyBJZiBhbiBhcnJheSBpcyBwYXNzZWQsIHRoZW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9ucyByZWNlaXZlcyB0aGVcbiAgICAvLyBwYXJhbWV0ZXJzIGFzIHNlcGFyYXRlIGFyZ3VtZW50cy4gSWYgYW4gb2JqZWN0IGlzIHBhc3NlZCwgdGhlbiB0aGVcbiAgICAvLyBhY3Rpb25zIHJlY2VpdmVzIG9uZSBwYXJhbWV0ZXIgb2JqZWN0IHdoZXJlIHVuZGVyIHRoZSBzYW1lIGtleXMgdGhlXG4gICAgLy8gc3BlY2lmaWVkIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHN0b3JlZC5cbiAgICBsZXQgYXNPYmplY3QgPSBmYWxzZVxuICAgIGlmIChpc0FycmF5KHBhcmFtZXRlcnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgLi4uc2NoZW1hIH0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICBhZGRQYXJhbWV0ZXIobmFtZSwgc2NoZW1hKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QocGFyYW1ldGVycykpIHtcbiAgICAgIGFzT2JqZWN0ID0gdHJ1ZVxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2NoZW1hXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcnMgZGVmaW5pdGlvbjogJHtwYXJhbWV0ZXJzfWApXG4gICAgfVxuICAgIC8vIE5PVEU6IElmIHByb3BlcnRpZXMgaXMgbnVsbCwgc2NoZW1hIGFuZCB2YWxpZGF0ZSB3aWxsIGJlY29tZSBudWxsIHRvby5cbiAgICAvLyBOT1RFOiBJZiBpdCBpcyBub3QgbnVsbCwgaXQgd2lsbCBnZXQgZXhwYW5kZWQgdG8gYW4gb2JqZWN0IHNjaGVtYS5cbiAgICBjb25zdCBzY2hlbWEgPSBjb252ZXJ0U2NoZW1hKHByb3BlcnRpZXMsIG9wdGlvbnMpXG4gICAgY29uc3QgdmFsaWRhdGUgPSB0aGlzLmNvbXBpbGVWYWxpZGF0b3Ioc2NoZW1hLCB7XG4gICAgICAvLyBGb3IgcGFyYW1ldGVycywgYWx3YXlzIGNvZXJjZSB0eXBlcywgaW5jbHVkaW5nIGFycmF5cy5cbiAgICAgIGNvZXJjZVR5cGVzOiAnYXJyYXknLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pXG4gICAgY29uc3QgY3R4ID0ge1xuICAgICAgYXBwOiB0aGlzLFxuICAgICAgdmFsaWRhdG9yOiB0aGlzLnZhbGlkYXRvcixcbiAgICAgIG9wdGlvbnNcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3QsXG4gICAgICBzY2hlbWEsXG4gICAgICBhc09iamVjdCxcbiAgICAgIGRhdGFOYW1lLFxuICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlXG4gICAgICAgIC8vIFVzZSBgY2FsbCgpYCB0byBwYXNzIGN0eCBhcyBjb250ZXh0IHRvIEFqdiwgc2VlIHBhc3NDb250ZXh0OlxuICAgICAgICA/IGRhdGEgPT4gdmFsaWRhdGUuY2FsbChjdHgsIGRhdGEpXG4gICAgICAgIDogbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVZhbGlkYXRpb25FcnJvcih7IHR5cGUsIG1lc3NhZ2UsIGVycm9ycywgb3B0aW9ucywganNvbiB9KSB7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgdHlwZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBlcnJvcnM6IHRoaXMudmFsaWRhdG9yLnBhcnNlRXJyb3JzKGVycm9ycywgb3B0aW9ucyksXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIEpTT04gZGF0YSBpbiB0aGUgZXJyb3IgaWYgYGxvZy5lcnJvcnMuanNvbmBpcyBzZXQuXG4gICAgICBqc29uOiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5qc29uID8ganNvbiA6IHVuZGVmaW5lZFxuICAgIH0pXG4gIH1cblxuICBjcmVhdGVEYXRhYmFzZUVycm9yKGVycm9yKSB7XG4gICAgLy8gUmVtb3ZlIGtuZXggU1FMIHF1ZXJ5IGFuZCBtb3ZlIHRvIHNlcGFyYXRlIGBzcWxgIHByb3BlcnR5LlxuICAgIC8vIFRPRE86IEZpeCB0aGlzIHByb3Blcmx5IGluIEtuZXggLyBPYmplY3Rpb24gaW5zdGVhZCwgc2VlOlxuICAgIC8vIGh0dHBzOi8vZ2l0dGVyLmltL1ZpbmNpdC9vYmplY3Rpb24uanM/YXQ9NWE2ODcyOGY1YTllYmU0Zjc1Y2E0MGIwXG4gICAgY29uc3QgWywgc3FsLCBtZXNzYWdlXSA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL14oW1xcc1xcU10qKSAtIChbXFxzXFxTXSo/KSQvKSB8fFxuICAgICAgW251bGwsIG51bGwsIGVycm9yLm1lc3NhZ2VdXG4gICAgcmV0dXJuIG5ldyBEYXRhYmFzZUVycm9yKGVycm9yLCB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHRoZSBTUUwgcXVlcnkgaW4gdGhlIGVycm9yIGlmIGBsb2cuZXJyb3JzLnNxbGBpcyBzZXQuXG4gICAgICBzcWw6IHRoaXMuY29uZmlnLmxvZy5lcnJvcnM/LnNxbCA/IHNxbCA6IHVuZGVmaW5lZFxuICAgIH0pXG4gIH1cblxuICBzZXR1cEdsb2JhbE1pZGRsZXdhcmUoKSB7XG4gICAgY29uc3QgeyBhcHAsIGxvZyB9ID0gdGhpcy5jb25maWdcblxuICAgIHRoaXMudXNlKGF0dGFjaExvZ2dlcih0aGlzLmxvZ2dlcikpXG5cbiAgICBpZiAoYXBwLnJlc3BvbnNlVGltZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKHJlc3BvbnNlVGltZShnZXRPcHRpb25zKGFwcC5yZXNwb25zZVRpbWUpKSlcbiAgICB9XG4gICAgaWYgKGxvZy5yZXF1ZXN0cykge1xuICAgICAgdGhpcy51c2UobG9nUmVxdWVzdHMoKSlcbiAgICB9XG4gICAgLy8gTmVlZHMgdG8gYmUgcG9zaXRpb25lZCBhZnRlciB0aGUgcmVxdWVzdCBsb2dnZXIgdG8gbG9nIHRoZSBjb3JyZWN0XG4gICAgLy8gcmVzcG9uc2Ugc3RhdHVzLlxuICAgIHRoaXMudXNlKGhhbmRsZUVycm9yKCkpXG4gICAgaWYgKGFwcC5oZWxtZXQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShoZWxtZXQoZ2V0T3B0aW9ucyhhcHAuaGVsbWV0KSkpXG4gICAgfVxuICAgIGlmIChhcHAuY29ycyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvcnMoZ2V0T3B0aW9ucyhhcHAuY29ycykpKVxuICAgIH1cbiAgICBpZiAoYXBwLmNvbXByZXNzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29tcHJlc3MobWVyZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBVc2UgYSByZWFzb25hYmxlIGRlZmF1bHQgZm9yIEJyb3RsaSBjb21wcmVzc2lvbi5cbiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2tvYWpzL2NvbXByZXNzL2lzc3Vlcy8xMjZcbiAgICAgICAgICBicjoge1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIFt6bGliLmNvbnN0YW50cy5CUk9UTElfUEFSQU1fUVVBTElUWV06IDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldE9wdGlvbnMoYXBwLmNvbXByZXNzKVxuICAgICAgKSkpXG4gICAgfVxuICAgIGlmIChhcHAuZXRhZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvbmRpdGlvbmFsKCkpXG4gICAgICB0aGlzLnVzZShldGFnKCkpXG4gICAgfVxuICB9XG5cbiAgc2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSgpIHtcbiAgICAvLyBOT1RFOiBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBhdXRvbWF0aWMgYHNldHVwR2xvYmFsTWlkZGxld2FyZSgpYCBzbyB0aGF0XG4gICAgLy8gYXBwcyBjYW4gc2V0IHVwIHRoZSBzdGF0aWMgc2VydmluZyBvZiBhc3NldHMgYmVmb3JlIGluc3RhbGxpbmcgdGhlXG4gICAgLy8gc2Vzc2lvbiBhbmQgcGFzc3BvcnQgbWlkZGxld2FyZS4gSXQgaXMgY2FsbGVkIGZyb20gYGFkZENvbnRyb2xsZXIoKWAuXG4gICAgLy8gVXNlIGEgZmxhZyB0byBvbmx5IGluc3RhbGwgdGhlIG1pZGRsZXdhcmUgb25jZTpcbiAgICBpZiAoIXRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUpIHtcbiAgICAgIGNvbnN0IHsgYXBwIH0gPSB0aGlzLmNvbmZpZ1xuICAgICAgLy8gU2VxdWVuY2UgaXMgaW1wb3J0YW50OlxuICAgICAgLy8gMS4gYm9keSBwYXJzZXJcbiAgICAgIHRoaXMudXNlKGJvZHlQYXJzZXIoZ2V0T3B0aW9ucyhhcHAuYm9keVBhcnNlcikpKVxuICAgICAgLy8gMi4gZmluZCByb3V0ZSBmcm9tIHJvdXRlcyBpbnN0YWxsZWQgYnkgY29udHJvbGxlcnMuXG4gICAgICB0aGlzLnVzZShmaW5kUm91dGUodGhpcy5yb3V0ZXIpKVxuICAgICAgLy8gMy4gcmVzcGVjdCB0cmFuc2FjdGVkIHNldHRpbmdzLCBjcmVhdGUgYW5kIGhhbmRsZSB0cmFuc2FjdGlvbnMuXG4gICAgICB0aGlzLnVzZShjcmVhdGVUcmFuc2FjdGlvbigpKVxuICAgICAgLy8gNC4gc2Vzc2lvblxuICAgICAgaWYgKGFwcC5zZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSA9IGdldE9wdGlvbnMoYXBwLnNlc3Npb24pXG4gICAgICAgIGlmIChtb2RlbENsYXNzKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgQ29udGV4dFN0b3JlIHRoYXQgcmVzb2x2ZWQgdGhlIHNwZWNpZmllZCBtb2RlbCBjbGFzcyxcbiAgICAgICAgICAvLyB1c2VzIGl0IHRvIHBlcnNpc3QgYW5kIHJldHJpZXZlIHRoZSBzZXNzaW9uLCBhbmQgYXV0b21hdGljYWxseVxuICAgICAgICAgIC8vIGJpbmRzIGFsbCBkYiBvcGVyYXRpb25zIHRvIGBjdHgudHJhbnNhY3Rpb25gLCBpZiBpdCBpcyBzZXQuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgICAgICBvcHRpb25zLkNvbnRleHRTdG9yZSA9IFNlc3Npb25TdG9yZShtb2RlbENsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlKHNlc3Npb24ob3B0aW9ucywgdGhpcykpXG4gICAgICB9XG4gICAgICAvLyA1LiBwYXNzcG9ydFxuICAgICAgaWYgKGFwcC5wYXNzcG9ydCkge1xuICAgICAgICB0aGlzLnVzZShwYXNzcG9ydC5pbml0aWFsaXplKCkpXG4gICAgICAgIGlmIChhcHAuc2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMudXNlKHBhc3Nwb3J0LnNlc3Npb24oKSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZShoYW5kbGVVc2VyKCkpXG4gICAgICB9XG5cbiAgICAgIC8vIDYuIGZpbmFsbHkgaGFuZGxlIHRoZSBmb3VuZCByb3V0ZSwgb3Igc2V0IHN0YXR1cyAvIGFsbG93IGFjY29yZGluZ2x5LlxuICAgICAgdGhpcy51c2UoaGFuZGxlUm91dGUoKSlcbiAgICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgc2V0dXBMb2dnZXIoKSB7XG4gICAgY29uc3QgeyBlcnIsIHJlcSwgcmVzIH0gPSBwaW5vLnN0ZFNlcmlhbGl6ZXJzXG4gICAgLy8gT25seSBpbmNsdWRlIGBpZGAgZnJvbSB0aGUgdXNlciwgdG8gbm90IGluYWR2ZXJ0ZW50bHkgbG9nIFBJSS5cbiAgICBjb25zdCB1c2VyID0gdXNlciA9PiAoeyBpZDogdXNlci5pZCB9KVxuICAgIGNvbnN0IHNlcmlhbGl6ZXJzID0geyBlcnIsIHJlcSwgcmVzLCB1c2VyIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IHBpbm8obWVyZ2UoXG4gICAgICB7XG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIHNlcmlhbGl6ZXJzLFxuICAgICAgICBwcmV0dHlQcmludDoge1xuICAgICAgICAgIC8vIExpc3Qgb2Yga2V5cyB0byBpZ25vcmUgaW4gcHJldHR5IG1vZGUuXG4gICAgICAgICAgaWdub3JlOiAncmVxLHJlcyxkdXJhdGlvbk1zLHVzZXIscmVxdWVzdElkJyxcbiAgICAgICAgICAvLyBTWVMgdG8gdXNlIHN5c3RlbSB0aW1lIGFuZCBub3QgVVRDLlxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6ICdTWVM6SEg6TU06c3MubCdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUmVkYWN0IGNvbW1vbiBzZW5zaXRpdmUgaGVhZGVycy5cbiAgICAgICAgcmVkYWN0OiBbXG4gICAgICAgICAgJyouaGVhZGVyc1tcImNvb2tpZVwiXScsXG4gICAgICAgICAgJyouaGVhZGVyc1tcInNldC1jb29raWVcIl0nLFxuICAgICAgICAgICcqLmhlYWRlcnNbXCJhdXRob3JpemF0aW9uXCJdJ1xuICAgICAgICBdLFxuICAgICAgICBiYXNlOiBudWxsIC8vIG5vIHBpZCxob3N0bmFtZSxuYW1lXG4gICAgICB9LFxuICAgICAgZ2V0T3B0aW9ucyh0aGlzLmNvbmZpZy5sb2dnZXIpXG4gICAgKSlcblxuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyLmNoaWxkKHsgbmFtZTogJ2FwcCcgfSlcbiAgfVxuXG4gIHNldHVwS25leCgpIHtcbiAgICBsZXQgeyBrbmV4LCBsb2cgfSA9IHRoaXMuY29uZmlnXG4gICAgaWYgKGtuZXg/LmNsaWVudCkge1xuICAgICAgY29uc3Qgc25ha2VDYXNlT3B0aW9ucyA9IGtuZXgubm9ybWFsaXplRGJOYW1lcyA9PT0gdHJ1ZVxuICAgICAgICA/IHt9XG4gICAgICAgIDoga25leC5ub3JtYWxpemVEYk5hbWVzXG4gICAgICBpZiAoc25ha2VDYXNlT3B0aW9ucykge1xuICAgICAgICBrbmV4ID0ge1xuICAgICAgICAgIC4uLmtuZXgsXG4gICAgICAgICAgLi4ua25leFNuYWtlQ2FzZU1hcHBlcnMoc25ha2VDYXNlT3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5rbmV4ID0gS25leChrbmV4KVxuICAgICAgLy8gU3VwcG9ydCBQb3N0Z3JlU1FMIHR5cGUgcGFyc2VyIG1hcHBpbmdzIGluIHRoZSBjb25maWcuXG4gICAgICBpZiAoa25leC5jbGllbnQgPT09ICdwb3N0Z3Jlc3FsJyAmJiBrbmV4LnR5cGVQYXJzZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3R5cGUsIHBhcnNlcl0gb2YgT2JqZWN0LmVudHJpZXMoa25leC50eXBlUGFyc2VycykpIHtcbiAgICAgICAgICB0aGlzLmtuZXguY2xpZW50LmRyaXZlci50eXBlcy5zZXRUeXBlUGFyc2VyKHR5cGUsIHBhcnNlcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvZy5zcWwpIHtcbiAgICAgICAgdGhpcy5zZXR1cEtuZXhMb2dnaW5nKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXR1cEtuZXhMb2dnaW5nKCkge1xuICAgIGNvbnN0IHN0YXJ0VGltZXMgPSB7fVxuICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyLmNoaWxkKHsgbmFtZTogJ3NxbCcgfSlcbiAgICBmdW5jdGlvbiBlbmQocXVlcnksIHsgcmVzcG9uc2UsIGVycm9yIH0pIHtcbiAgICAgIGNvbnN0IGlkID0gcXVlcnkuX19rbmV4UXVlcnlVaWRcbiAgICAgIGNvbnN0IGRpZmYgPSBwcm9jZXNzLmhydGltZShzdGFydFRpbWVzW2lkXSlcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gZGlmZlswXSAqIDFlMyArIGRpZmZbMV0gLyAxZTZcbiAgICAgIGRlbGV0ZSBzdGFydFRpbWVzW2lkXVxuICAgICAgY29uc3QgeyBzcWwsIGJpbmRpbmdzIH0gPSBxdWVyeVxuICAgICAgcmVzcG9uc2UgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlKS5maWx0ZXIoXG4gICAgICAgICAgKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ18nKVxuICAgICAgICApXG4gICAgICApXG4gICAgICBsb2dnZXIuaW5mbyh7IGR1cmF0aW9uLCBiaW5kaW5ncywgcmVzcG9uc2UsIGVycm9yIH0sIHNxbClcbiAgICB9XG5cbiAgICB0aGlzLmtuZXhcbiAgICAgIC5vbigncXVlcnknLCBxdWVyeSA9PiB7XG4gICAgICAgIHN0YXJ0VGltZXNbcXVlcnkuX19rbmV4UXVlcnlVaWRdID0gcHJvY2Vzcy5ocnRpbWUoKVxuICAgICAgfSlcbiAgICAgIC5vbigncXVlcnktcmVzcG9uc2UnLCAocmVzcG9uc2UsIHF1ZXJ5KSA9PiB7XG4gICAgICAgIGVuZChxdWVyeSwgeyByZXNwb25zZSB9KVxuICAgICAgfSlcbiAgICAgIC5vbigncXVlcnktZXJyb3InLCAoZXJyb3IsIHF1ZXJ5KSA9PiB7XG4gICAgICAgIGVuZChxdWVyeSwgeyBlcnJvciB9KVxuICAgICAgfSlcbiAgfVxuXG4gIG5vcm1hbGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgIHJldHVybiB0aGlzLmtuZXguY2xpZW50LndyYXBJZGVudGlmaWVyKGlkZW50aWZpZXIpLnJlcGxhY2UoL1snYFwiXS9nLCAnJylcbiAgfVxuXG4gIGRlbm9ybWFsaXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5rbmV4LmNsaWVudC5wb3N0UHJvY2Vzc1Jlc3BvbnNlKHsgW2lkZW50aWZpZXJdOiAxIH0pXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailbMF1cbiAgfVxuXG4gIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hcHAubm9ybWFsaXplUGF0aHMgPyBoeXBoZW5hdGUocGF0aCkgOiBwYXRoXG4gIH1cblxuICBmb3JtYXRFcnJvcihlcnIpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyLnRvSlNPTlxuICAgICAgPyBmb3JtYXRKc29uKGVyci50b0pTT04oKSlcbiAgICAgIDogZXJyLm1lc3NhZ2UgfHwgZXJyXG4gICAgY29uc3Qgc3RyID0gYCR7ZXJyLm5hbWV9OiAke21lc3NhZ2V9YFxuICAgIHJldHVybiBlcnIuc3RhY2sgJiYgdGhpcy5jb25maWcubG9nLmVycm9ycz8uc3RhY2sgIT09IGZhbHNlXG4gICAgICA/IGAke3N0cn1cXG4ke2Vyci5zdGFjay5zcGxpdCgvXFxufFxcclxcbnxcXHIvKS5zbGljZSgxKS5qb2luKG9zLkVPTCl9YFxuICAgICAgOiBzdHJcbiAgfVxuXG4gIGxvZ0Vycm9yKGVyciwgY3R4KSB7XG4gICAgaWYgKCFlcnIuZXhwb3NlICYmICF0aGlzLnNpbGVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuZm9ybWF0RXJyb3IoZXJyKVxuICAgICAgICBjb25zdCBsZXZlbCA9XG4gICAgICAgICAgZXJyIGluc3RhbmNlb2YgUmVzcG9uc2VFcnJvciAmJiBlcnIuc3RhdHVzIDwgNTAwID8gJ2luZm8nIDogJ2Vycm9yJ1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBjdHg/LmxvZ2dlciB8fCB0aGlzLmxvZ2dlclxuICAgICAgICBsb2dnZXJbbGV2ZWxdKHRleHQpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBsb2cgZXJyb3InLCBlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vbignZXJyb3InLCB0aGlzLmxvZ0Vycm9yKVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2JlZm9yZTpzdGFydCcpXG4gICAgYXdhaXQgdGhpcy5mb3JFYWNoU2VydmljZShzZXJ2aWNlID0+IHNlcnZpY2Uuc3RhcnQoKSlcbiAgICBjb25zdCB7XG4gICAgICBzZXJ2ZXI6IHsgaG9zdCwgcG9ydCB9LFxuICAgICAgZW52XG4gICAgfSA9IHRoaXMuY29uZmlnXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLmxpc3Rlbihwb3J0LCBob3N0LCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcG9ydCB9ID0gc2VydmVyLmFkZHJlc3MoKVxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgYCR7ZW52fSBzZXJ2ZXIgc3RhcnRlZCBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YFxuICAgICAgICApXG4gICAgICAgIHJlc29sdmUoc2VydmVyKVxuICAgICAgfSlcbiAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBzdGFydCBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fWApKVxuICAgICAgfVxuICAgIH0pXG4gICAgYXdhaXQgdGhpcy5lbWl0KCdhZnRlcjpzdGFydCcpXG4gIH1cblxuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0b3AnKVxuICAgIHRoaXMuc2VydmVyID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgeyBzZXJ2ZXIgfSA9IHRoaXNcbiAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgc2VydmVyLmNsb3NlKGVyciA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLy8gSGFjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBjbG9zZSB0aGUgc2VydmVyLFxuICAgICAgICAvLyAgZXZlbiBpZiBzb2NrZXRzIGFyZSBzdGlsbCBvcGVuLlxuICAgICAgICAvLyAgVGFrZW4gZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzY4MzAwNzIuXG4gICAgICAgIC8vICBBIHByb3BlciBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgYSBsaWJyYXJ5LCBleDogaHR0cHM6Ly9naXRodWIuY29tL2dvZGFkZHkvdGVybWludXNcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHNlcnZlci5lbWl0KCdjbG9zZScpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignU2VydmVyIGlzIG5vdCBydW5uaW5nJykpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdG9wKCkpXG4gICAgYXdhaXQgdGhpcy5lbWl0KCdhZnRlcjpzdG9wJylcbiAgICBpZiAodGhpcy5jb25maWcubG9nLmVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMub2ZmKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRPckV4aXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnQoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dFcnJvcihlcnIpXG4gICAgICBwcm9jZXNzLmV4aXQoLTEpXG4gICAgfVxuICB9XG5cbiAgLy8gQXNzZXRzIGhhbmRsaW5nXG5cbiAgYXN5bmMgY3JlYXRlQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCBjb3VudCA9IDAsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBjb25zdCBhc3NldHMgPSBmaWxlcy5tYXAoZmlsZSA9PiAoe1xuICAgICAgICBrZXk6IGZpbGUua2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBzdG9yYWdlOiBzdG9yYWdlLm5hbWUsXG4gICAgICAgIGNvdW50XG4gICAgICB9KSlcbiAgICAgIHJldHVybiBBc3NldE1vZGVsXG4gICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgIC5pbnNlcnQoYXNzZXRzKVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgYXN5bmMgaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyhcbiAgICBzdG9yYWdlLFxuICAgIGFkZGVkRmlsZXMsXG4gICAgcmVtb3ZlZEZpbGVzLFxuICAgIHRyeCA9IG51bGxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXNzZXRzOiB7XG4gICAgICAgIGNsZWFudXBUaW1lVGhyZXNob2xkID0gMFxuICAgICAgfSA9IHt9XG4gICAgfSA9IHRoaXMuY29uZmlnXG4gICAgLy8gT25seSByZW1vdmUgdW51c2VkIGFzc2V0cyB0aGF0IGhhdmVuJ3Qgc2VlbiBjaGFuZ2VzIGZvciBnaXZlbiB0aW1lZnJhbWUuXG4gICAgY29uc3QgdGltZVRocmVzaG9sZCA9IGlzU3RyaW5nKGNsZWFudXBUaW1lVGhyZXNob2xkKVxuICAgICAgPyBwYXJzZUR1cmF0aW9uKGNsZWFudXBUaW1lVGhyZXNob2xkKVxuICAgICAgOiBjbGVhbnVwVGltZVRocmVzaG9sZFxuXG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgaW1wb3J0ZWRGaWxlcy5wdXNoKFxuICAgICAgICAuLi5hd2FpdCB0aGlzLmFkZEZvcmVpZ25Bc3NldHMoc3RvcmFnZSwgYWRkZWRGaWxlcywgdHJ4KVxuICAgICAgKVxuICAgICAgaWYgKFxuICAgICAgICBhZGRlZEZpbGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgcmVtb3ZlZEZpbGVzLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjaGFuZ2VDb3VudCA9IChmaWxlcywgaW5jcmVtZW50KSA9PiAoXG4gICAgICAgICAgZmlsZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIEFzc2V0TW9kZWwucXVlcnkodHJ4KVxuICAgICAgICAgICAgLndoZXJlSW4oJ2tleScsIGZpbGVzLm1hcChmaWxlID0+IGZpbGUua2V5KSlcbiAgICAgICAgICAgIC5pbmNyZW1lbnQoJ2NvdW50JywgaW5jcmVtZW50KVxuICAgICAgICApXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBjaGFuZ2VDb3VudChhZGRlZEZpbGVzLCAxKSxcbiAgICAgICAgICBjaGFuZ2VDb3VudChyZW1vdmVkRmlsZXMsIC0xKVxuICAgICAgICBdKVxuICAgICAgICBpZiAodGltZVRocmVzaG9sZCA+IDApIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgLy8gRG9uJ3QgcGFzcyBgdHJ4YCBoZXJlLCBhcyB3ZSB3YW50IHRoaXMgZGVsYXllZCBleGVjdXRpb24gdG9cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBpdHMgb3duIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQpLFxuICAgICAgICAgICAgdGltZVRocmVzaG9sZFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQWxzbyBleGVjdXRlIHJlbGVhc2VVbnVzZWRBc3NldHMoKSBpbW1lZGlhdGVseSBpbiB0aGUgc2FtZVxuICAgICAgLy8gdHJhbnNhY3Rpb24sIHRvIHBvdGVudGlhbGx5IGNsZWFuIHVwIG90aGVyIHBlbmRpbmcgYXNzZXRzLlxuICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQsIHRyeClcbiAgICAgIHJldHVybiBpbXBvcnRlZEZpbGVzXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBmaWxlcywgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IGltcG9ydGVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIC8vIEZpbmQgbWlzc2luZyBhc3NldHMgKGNvcGllZCBmcm9tIGFub3RoZXIgc3lzdGVtKSwgYW5kIGFkZCB0aGVtLlxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICBjb25zdCBhc3NldCA9IGF3YWl0IEFzc2V0TW9kZWwucXVlcnkodHJ4KS5maW5kT25lKCdrZXknLCBmaWxlLmtleSlcbiAgICAgICAgICBpZiAoIWFzc2V0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5kYXRhIHx8IGZpbGUudXJsKSB7XG4gICAgICAgICAgICAgIGxldCB7IGRhdGEgfSA9IGZpbGVcbiAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICAgICAgYCR7XG4gICAgICAgICAgICAgICAgICAgIHBpY28ucmVkKCdJTkZPOicpXG4gICAgICAgICAgICAgICAgICB9IEFzc2V0ICR7XG4gICAgICAgICAgICAgICAgICAgIHBpY28uZ3JlZW4oYCcke2ZpbGUubmFtZX0nYClcbiAgICAgICAgICAgICAgICAgIH0gaXMgZnJvbSBhIGZvcmVpZ24gc291cmNlLCBmZXRjaGluZyBmcm9tICR7XG4gICAgICAgICAgICAgICAgICAgIHBpY28uZ3JlZW4oYCcke2ZpbGUudXJsfSdgKVxuICAgICAgICAgICAgICAgICAgfSBhbmQgYWRkaW5nIHRvIHN0b3JhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5ncmVlbihgJyR7c3RvcmFnZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfS4uLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkRmlsZSA9IGF3YWl0IHN0b3JhZ2UuYWRkRmlsZShmaWxlLCBkYXRhKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBbaW1wb3J0ZWRGaWxlXSwgMCwgdHJ4KVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgICBpbXBvcnRlZEZpbGVzLnB1c2goaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBpbXBvcnQgYXNzZXQgZnJvbSBmb3JlaWduIHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBc3NldCBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGJ1dCB3YXMgYWxyZWFkeSBpbXBvcnRlZCBhbmQgY2FuXG4gICAgICAgICAgICAvLyBiZSByZXVzZWQuIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyBtZXJnZS5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgYXNzZXQuZmlsZSlcbiAgICAgICAgICAgIC8vIE5PVEU6IE5vIG5lZWQgdG8gYWRkIGBmaWxlYCB0byBgaW1wb3J0ZWRGaWxlc2AsIHNpbmNlIGl0J3NcbiAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBpbXBvcnRlZCB0byB0aGUgc3RvcmFnZSBiZWZvcmUuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kaWZpZWRBc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgICAgaWYgKGFzc2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGZpbGUuZGF0YSlcbiAgICAgICAgICAgICAgLy8gTWVyZ2UgYmFjayB0aGUgY2hhbmdlZCBmaWxlIHByb3BlcnRpZXMgaW50byB0aGUgYWN0dWFsIGZpbGVzXG4gICAgICAgICAgICAgIC8vIG9iamVjdCwgc28gdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBzdGF0aWMgbW9kZWwgaG9vayBjYW4gYmUgdXNlZFxuICAgICAgICAgICAgICAvLyBkaXJlY3RseSBmb3IgdGhlIGFjdHVhbCBydW5uaW5nIHF1ZXJ5LlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGZpbGUsIGNoYW5nZWRGaWxlKVxuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHVwZGF0ZSBtb2RpZmllZCBhc3NldCBmcm9tIG1lbW9yeSBzb3VyY2U6ICcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5uYW1lXG4gICAgICAgICAgICAgICAgfScgKCcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5rZXlcbiAgICAgICAgICAgICAgICB9JylgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllZEZpbGVzXG4gIH1cblxuICBhc3luYyByZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgcmV0dXJuIEFzc2V0TW9kZWwudHJhbnNhY3Rpb24odHJ4LCBhc3luYyB0cnggPT4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHRpbWUgdGhyZXNob2xkIGluIEpTIGluc3RlYWQgb2YgU1FMLCBhcyB0aGVyZSBpcyBub1xuICAgICAgICAvLyBlYXN5IGNyb3NzLVNRTCB3YXkgdG8gZG8gYG5vdygpIC0gaW50ZXJ2YWwgWCBob3Vyc2A6XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSB0aW1lVGhyZXNob2xkKVxuICAgICAgICBjb25zdCBvcnBoYW5lZEFzc2V0cyA9IGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgIC53aGVyZSgnY291bnQnLCAwKVxuICAgICAgICAgIC5hbmRXaGVyZSgndXBkYXRlZEF0JywgJzw9JywgZGF0ZSlcbiAgICAgICAgICAvLyBQcm90ZWN0IGZyZXNobHkgY3JlYXRlZCBhc3NldHMgZnJvbSBiZWluZyBkZWxldGVkIGFnYWluIHJpZ2h0IGF3YXksXG4gICAgICAgICAgLy8gLmUuZy4gd2hlbiBgY29uZmlnLmFzc2V0cy5jbGVhbnVwVGltZVRocmVzaG9sZCA9IDBgXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPicsIHJlZignY3JlYXRlZEF0JykpXG4gICAgICAgIGlmIChvcnBoYW5lZEFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgb3JwaGFuZWRLZXlzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBvcnBoYW5lZEFzc2V0cy5tYXAoYXN5bmMgYXNzZXQgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmFnZShhc3NldC5zdG9yYWdlKS5yZW1vdmVGaWxlKGFzc2V0LmZpbGUpXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICAgICAgICAgICAgICAgIGFzc2V0LmVycm9yID0gZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXNzZXQua2V5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBBc3NldE1vZGVsXG4gICAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5Jywgb3JwaGFuZWRLZXlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcnBoYW5lZEFzc2V0c1xuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3ZlcnJpZGUgS29hJ3MgZXZlbnRzIHdpdGggb3VyIG93biBFdmVudEVtaXR0ZXIgdGhhdCBhZGRzIHN1cHBvcnQgZm9yXG4vLyBhc3luY2hyb25vdXMgZXZlbnRzLlxuRXZlbnRFbWl0dGVyLm1peGluKEFwcGxpY2F0aW9uLnByb3RvdHlwZSlcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBpc09iamVjdChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fVxufVxuIl19