@ditojs/server 0.272.0 → 0.273.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.
- package/lib/app/Application.js +39 -5
- package/lib/app/SessionStore.js +3 -1
- package/lib/app/Validator.js +13 -1
- package/lib/app/index.js +7 -1
- package/lib/cli/console.js +11 -1
- package/lib/cli/db/createMigration.js +13 -1
- package/lib/cli/db/index.js +7 -1
- package/lib/cli/db/seed.js +10 -2
- package/lib/cli/index.js +6 -2
- package/lib/controllers/AdminController.js +12 -2
- package/lib/controllers/CollectionController.js +15 -1
- package/lib/controllers/Controller.js +25 -1
- package/lib/controllers/ControllerAction.js +23 -14
- package/lib/controllers/RelationController.js +7 -1
- package/lib/controllers/UserController.js +15 -1
- package/lib/controllers/index.js +7 -1
- package/lib/decorators/index.js +7 -1
- package/lib/decorators/parameters.js +3 -1
- package/lib/decorators/returns.js +3 -1
- package/lib/errors/DatabaseError.js +5 -19
- package/lib/errors/ResponseError.js +4 -16
- package/lib/errors/index.js +7 -1
- package/lib/graph/DitoGraphProcessor.js +5 -1
- package/lib/graph/expression.js +5 -1
- package/lib/graph/graph.js +18 -2
- package/lib/graph/index.js +7 -1
- package/lib/index.js +7 -1
- package/lib/lib/index.js +7 -1
- package/lib/middleware/findRoute.js +7 -1
- package/lib/middleware/index.js +7 -1
- package/lib/mixins/AssetMixin.js +4 -4
- package/lib/mixins/SessionMixin.js +4 -4
- package/lib/mixins/TimeStampedMixin.js +4 -4
- package/lib/mixins/UserMixin.js +10 -4
- package/lib/mixins/index.js +7 -1
- package/lib/models/Model.js +21 -4
- package/lib/models/definitions/filters.js +9 -1
- package/lib/models/definitions/properties.js +7 -1
- package/lib/models/definitions/scopes.js +9 -1
- package/lib/models/index.js +7 -1
- package/lib/query/QueryBuilder.js +11 -1
- package/lib/query/QueryFilters.js +11 -1
- package/lib/query/index.js +7 -1
- package/lib/schema/formats/index.js +7 -1
- package/lib/schema/index.js +10 -2
- package/lib/schema/keywords/index.js +7 -1
- package/lib/schema/properties.js +11 -1
- package/lib/schema/relations.js +18 -4
- package/lib/services/index.js +7 -1
- package/lib/storage/DiskStorage.js +7 -1
- package/lib/storage/Storage.js +5 -1
- package/lib/storage/index.js +7 -1
- package/lib/utils/emitter.js +5 -1
- package/lib/utils/index.js +7 -1
- package/lib/utils/object.js +9 -3
- package/package.json +29 -29
- package/src/app/Application.js +23 -3
- package/src/controllers/AdminController.js +1 -1
- package/src/controllers/ControllerAction.js +7 -13
- package/src/errors/DatabaseError.js +2 -23
- package/src/errors/ResponseError.js +1 -9
- package/src/models/Model.js +10 -8
package/lib/app/Application.js
CHANGED
|
@@ -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"));
|
|
@@ -487,12 +507,26 @@ class Application extends _koa.default {
|
|
|
487
507
|
type,
|
|
488
508
|
message,
|
|
489
509
|
errors,
|
|
490
|
-
options
|
|
510
|
+
options,
|
|
511
|
+
json
|
|
491
512
|
}) {
|
|
513
|
+
var _this$config$log$erro;
|
|
514
|
+
|
|
492
515
|
return new _errors.ValidationError({
|
|
493
516
|
type,
|
|
494
517
|
message,
|
|
495
|
-
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
|
|
496
530
|
});
|
|
497
531
|
}
|
|
498
532
|
|
|
@@ -687,11 +721,11 @@ class Application extends _koa.default {
|
|
|
687
721
|
}
|
|
688
722
|
|
|
689
723
|
formatError(err) {
|
|
690
|
-
var _this$config$log$
|
|
724
|
+
var _this$config$log$erro3;
|
|
691
725
|
|
|
692
726
|
const message = err.toJSON ? (0, _utils.formatJson)(err.toJSON()) : err.message || err;
|
|
693
727
|
const str = `${err.name}: ${message}`;
|
|
694
|
-
return err.stack && ((_this$config$log$
|
|
728
|
+
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;
|
|
695
729
|
}
|
|
696
730
|
|
|
697
731
|
logError(err, ctx) {
|
|
@@ -918,4 +952,4 @@ _lib.EventEmitter.mixin(Application.prototype);
|
|
|
918
952
|
function getOptions(options) {
|
|
919
953
|
return (0, _utils2.isObject)(options) ? options : {};
|
|
920
954
|
}
|
|
921
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsImNoYWxrIiwieWVsbG93IiwiYm9sZCIsInV0aWwiLCJpbnNwZWN0IiwiY29sb3JzIiwiZGVwdGgiLCJtYXhBcnJheUxlbmd0aCIsIkVycm9yIiwic29ydEJ5UmVsYXRpb25zIiwibGlzdCIsImNvbGxlY3RlZCIsImV4Y2x1ZGVkIiwicmVsYXRpb24iLCJnZXRSZWxhdGlvbnMiLCJCZWxvbmdzVG9PbmVSZWxhdGlvbiIsInJlbGF0ZWRNb2RlbENsYXNzIiwiam9pblRhYmxlTW9kZWxDbGFzcyIsInJlbGF0ZWQiLCJyZXZlcnNlIiwicmVkdWNlIiwiZ2V0TW9kZWwiLCJlbmRzV2l0aCIsImZpbmRNb2RlbCIsImNhbGxiYWNrIiwiZmluZCIsInNlcnZpY2UiLCJlbnRyaWVzIiwiYWRkU2VydmljZSIsIlNlcnZpY2UiLCJ1bmRlZmluZWQiLCJnZXRTZXJ2aWNlIiwiZmluZFNlcnZpY2UiLCJmb3JFYWNoU2VydmljZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJuYW1lc3BhY2UiLCJrZXkiLCJhZGRDb250cm9sbGVyIiwic2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSIsIkNvbnRyb2xsZXIiLCJ1cmwiLCJjb21wb3NlIiwiZ2V0Q29udHJvbGxlciIsImZpbmRDb250cm9sbGVyIiwiZ2V0QWRtaW5Db250cm9sbGVyIiwiQWRtaW5Db250cm9sbGVyIiwiZ2V0QWRtaW5WdWVDb25maWciLCJnZXRWdWVDb25maWciLCJnZXRBc3NldENvbmZpZyIsIm5vcm1hbGl6ZURiTmFtZXMiLCJhc3NldENvbmZpZyIsIm1vZGVsTmFtZSIsImFzc2V0cyIsImRlZmluaXRpb24iLCJub3JtYWxpemVkTW9kZWxOYW1lIiwibm9ybWFsaXplSWRlbnRpZmllciIsImNvbnZlcnRlZEFzc2V0cyIsImFzc2V0RGF0YVBhdGgiLCJwcm9wZXJ0eSIsIm5lc3RlZERhdGFQYXRoIiwiaW5kZXgiLCJnZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoIiwibm9ybWFsaXplZE5hbWUiLCJkYXRhUGF0aCIsImFzc2V0Q29uZmlncyIsImFkZFN0b3JhZ2UiLCJzdG9yYWdlIiwic3RvcmFnZUNsYXNzIiwiU3RvcmFnZSIsImdldCIsInR5cGUiLCJnZXRTdG9yYWdlIiwiY29tcGlsZVZhbGlkYXRvciIsImpzb25TY2hlbWEiLCJvcHRpb25zIiwiY29tcGlsZSIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwicGFyYW1ldGVycyIsImRhdGFOYW1lIiwicHJvcGVydGllcyIsImFkZFBhcmFtZXRlciIsInB1c2giLCJtZW1iZXIiLCJhc09iamVjdCIsInZhbGlkYXRlIiwiY29lcmNlVHlwZXMiLCJjdHgiLCJjYWxsIiwiY3JlYXRlVmFsaWRhdGlvbkVycm9yIiwibWVzc2FnZSIsImVycm9ycyIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwic3FsIiwic2V0dXBLbmV4TG9nZ2luZyIsInN0YXJ0VGltZXMiLCJlbmQiLCJxdWVyeSIsInJlc3BvbnNlIiwiZXJyb3IiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwic3RyIiwic3RhY2siLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsIm9zIiwiRU9MIiwibG9nRXJyb3IiLCJleHBvc2UiLCJ0ZXh0IiwiUmVzcG9uc2VFcnJvciIsInN0YXR1cyIsImUiLCJzdGFydCIsImVtaXQiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInJlc29sdmUiLCJyZWplY3QiLCJsaXN0ZW4iLCJhZGRyZXNzIiwic3RvcCIsImNsb3NlIiwic2V0SW1tZWRpYXRlIiwib2ZmIiwic3RhcnRPckV4aXQiLCJleGl0IiwiY3JlYXRlQXNzZXRzIiwiZmlsZXMiLCJjb3VudCIsInRyeCIsIkFzc2V0TW9kZWwiLCJmaWxlIiwiaW5zZXJ0IiwiaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyIsImFkZGVkRmlsZXMiLCJyZW1vdmVkRmlsZXMiLCJjbGVhbnVwVGltZVRocmVzaG9sZCIsInRpbWVUaHJlc2hvbGQiLCJpbXBvcnRlZEZpbGVzIiwiYWRkRm9yZWlnbkFzc2V0cyIsImNoYW5nZUNvdW50IiwiaW5jcmVtZW50Iiwid2hlcmVJbiIsInNldFRpbWVvdXQiLCJyZWxlYXNlVW51c2VkQXNzZXRzIiwiYXNzZXQiLCJmaW5kT25lIiwicmVkIiwiZ3JlZW4iLCJheGlvcyIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZVR5cGUiLCJpbXBvcnRlZEZpbGUiLCJhZGRGaWxlIiwiYXNzaWduIiwiQXNzZXRFcnJvciIsImhhbmRsZU1vZGlmaWVkQXNzZXRzIiwibW9kaWZpZWRGaWxlcyIsImNoYW5nZWRGaWxlIiwidHJhbnNhY3Rpb24iLCJkYXRlIiwiRGF0ZSIsInNldE1pbGxpc2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIm9ycGhhbmVkQXNzZXRzIiwid2hlcmUiLCJhbmRXaGVyZSIsIm9ycGhhbmVkS2V5cyIsInJlbW92ZUZpbGUiLCJkZWxldGUiLCJFdmVudEVtaXR0ZXIiLCJtaXhpbiIsInByb3RvdHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFB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RixjQUFjLENBQUN2UCxNQUFmLEdBQXdCLENBQTVCLEVBQStCO0FBQzdCLGdCQUFNMFAsWUFBWSxHQUFHLE1BQU05TCxPQUFPLENBQUNDLEdBQVIsQ0FDekIwTCxjQUFjLENBQUN6TCxHQUFmLENBQW1CLE1BQU1xSyxLQUFOLElBQWU7QUFDaEMsZ0JBQUk7QUFDRixvQkFBTSxLQUFLaEksVUFBTCxDQUFnQmdJLEtBQUssQ0FBQ3JJLE9BQXRCLEVBQStCNkosVUFBL0IsQ0FBMEN4QixLQUFLLENBQUNkLElBQWhELENBQU47QUFDRCxhQUZELENBRUUsT0FBT3BELEtBQVAsRUFBYztBQUNkLG1CQUFLaUMsSUFBTCxDQUFVLE9BQVYsRUFBbUJqQyxLQUFuQjtBQUNBa0UsY0FBQUEsS0FBSyxDQUFDbEUsS0FBTixHQUFjQSxLQUFkO0FBQ0Q7O0FBQ0QsbUJBQU9rRSxLQUFLLENBQUNuSyxHQUFiO0FBQ0QsV0FSRCxDQUR5QixDQUEzQjtBQVdBLGdCQUFNb0osVUFBVSxDQUNickQsS0FERyxDQUNHb0QsR0FESCxFQUVIeUMsTUFGRyxHQUdINUIsT0FIRyxDQUdLLEtBSEwsRUFHWTBCLFlBSFosQ0FBTjtBQUlEOztBQUNELGVBQU9ILGNBQVA7QUFDRCxPQTlCTSxDQUFQO0FBK0JEO0FBQ0Y7O0FBMTNCa0M7Ozs7QUErM0JyQ00sa0JBQWFDLEtBQWIsQ0FBbUJ6UyxXQUFXLENBQUMwUyxTQUEvQjs7QUFFQSxTQUFTcEksVUFBVCxDQUFvQnJCLE9BQXBCLEVBQTZCO0FBQzNCLFNBQU8sc0JBQVNBLE9BQVQsSUFBb0JBLE9BQXBCLEdBQThCLEVBQXJDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgS29hIGZyb20gJ2tvYSdcbmltcG9ydCBLbmV4IGZyb20gJ2tuZXgnXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJ1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHpsaWIgZnJvbSAnemxpYidcbmltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgb3MgZnJvbSAnb3MnXG5pbXBvcnQgcGFyc2VEdXJhdGlvbiBmcm9tICdwYXJzZS1kdXJhdGlvbidcbmltcG9ydCBib2R5UGFyc2VyIGZyb20gJ2tvYS1ib2R5cGFyc2VyJ1xuaW1wb3J0IGNvcnMgZnJvbSAnQGtvYS9jb3JzJ1xuaW1wb3J0IGNvbXBvc2UgZnJvbSAna29hLWNvbXBvc2UnXG5pbXBvcnQgY29tcHJlc3MgZnJvbSAna29hLWNvbXByZXNzJ1xuaW1wb3J0IGNvbmRpdGlvbmFsIGZyb20gJ2tvYS1jb25kaXRpb25hbC1nZXQnXG5pbXBvcnQgcGFzc3BvcnQgZnJvbSAna29hLXBhc3Nwb3J0J1xuaW1wb3J0IHNlc3Npb24gZnJvbSAna29hLXNlc3Npb24nXG5pbXBvcnQgZXRhZyBmcm9tICdrb2EtZXRhZydcbmltcG9ydCBoZWxtZXQgZnJvbSAna29hLWhlbG1ldCdcbmltcG9ydCByZXNwb25zZVRpbWUgZnJvbSAna29hLXJlc3BvbnNlLXRpbWUnXG5pbXBvcnQgUm91dGVyIGZyb20gJ0BkaXRvanMvcm91dGVyJ1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQC9saWInXG5pbXBvcnQgeyBDb250cm9sbGVyLCBBZG1pbkNvbnRyb2xsZXIgfSBmcm9tICdAL2NvbnRyb2xsZXJzJ1xuaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJ0Avc2VydmljZXMnXG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQC9zdG9yYWdlJ1xuaW1wb3J0IHsgY29udmVydFNjaGVtYSB9IGZyb20gJ0Avc2NoZW1hJ1xuaW1wb3J0IHsgZm9ybWF0SnNvbiB9IGZyb20gJ0AvdXRpbHMnXG5pbXBvcnQgeyBSZXNwb25zZUVycm9yLCBWYWxpZGF0aW9uRXJyb3IsIEFzc2V0RXJyb3IgfSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93LmJvbGQoYFxcbiR7bW9kZWxDbGFzcy5uYW1lfTpcXG5gKSxcbiAgICAgICAgICAgIHV0aWwuaW5zcGVjdChkYXRhLCB7XG4gICAgICAgICAgICAgIGNvbG9yczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IG51bGwsXG4gICAgICAgICAgICAgIG1heEFycmF5TGVuZ3RoOiBudWxsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZE1vZGVsKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoTW9kZWwuaXNQcm90b3R5cGVPZihtb2RlbENsYXNzKSkge1xuICAgICAgbW9kZWxDbGFzcy5hcHAgPSB0aGlzXG4gICAgICB0aGlzLm1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7bW9kZWxDbGFzc31gKVxuICAgIH1cbiAgfVxuXG4gIHNvcnRNb2RlbHMobW9kZWxzKSB7XG4gICAgY29uc3Qgc29ydEJ5UmVsYXRpb25zID0gKGxpc3QsIGNvbGxlY3RlZCA9IHt9LCBleGNsdWRlZCA9IHt9KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgaWYgKCFjb2xsZWN0ZWRbbmFtZV0gJiYgIWV4Y2x1ZGVkW25hbWVdKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zKCkpKSB7XG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbiBpbnN0YW5jZW9mIEJlbG9uZ3NUb09uZVJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IHJlbGF0ZWRNb2RlbENsYXNzLCBqb2luVGFibGVNb2RlbENsYXNzIH0gPSByZWxhdGlvblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgW2pvaW5UYWJsZU1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbENsYXNzXSkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc2VsZi1yZWZlcmVuY2VzIGFuZCBnZW5lcmF0ZWQgam9pbiBtb2RlbHM6XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWQgJiYgcmVsYXRlZCAhPT0gbW9kZWxDbGFzcyAmJiBtb2RlbHNbcmVsYXRlZC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgc29ydEJ5UmVsYXRpb25zKFtyZWxhdGVkXSwgY29sbGVjdGVkLCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgbW9kZWxDbGFzcyB0byBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uczpcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdOiBtb2RlbENsYXNzLFxuICAgICAgICAgICAgICAgICAgICAuLi5leGNsdWRlZFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdGVkW25hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb2xsZWN0ZWQpXG4gICAgfVxuICAgIC8vIFJldHVybiBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc29ydGVkIG1vZGVscyBhcyBpdHMga2V5L3ZhbHVlIHBhaXJzLlxuICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gcmV2ZXJzZSBmb3IgdGhlIGFib3ZlIGFsZ29yaXRobSB0byBzb3J0IHByb3Blcmx5LFxuICAgIC8vIGFuZCB0aGVuIHJldmVyc2UgdGhlIHJlc3VsdCBiYWNrLlxuICAgIHJldHVybiBzb3J0QnlSZWxhdGlvbnMoT2JqZWN0LnZhbHVlcyhtb2RlbHMpLnJldmVyc2UoKSkucmV2ZXJzZSgpLnJlZHVjZShcbiAgICAgIChtb2RlbHMsIG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIHJldHVybiBtb2RlbHNcbiAgICAgIH0sXG4gICAgICBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgKVxuICB9XG5cbiAgZ2V0TW9kZWwobmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGVsc1tuYW1lXSB8fFxuICAgICAgIW5hbWUuZW5kc1dpdGgoJ01vZGVsJykgJiYgdGhpcy5tb2RlbHNbYCR7bmFtZX1Nb2RlbGBdIHx8XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZmluZE1vZGVsKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBhZGRTZXJ2aWNlcyhzZXJ2aWNlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHNlcnZpY2VdIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgICAgLy8gSGFuZGxlIEVTNiBtb2R1bGUgd2VpcmRuZXNzIHRoYXQgY2FuIGhhcHBlbiwgYXBwYXJlbnRseTpcbiAgICAgIGlmIChuYW1lID09PSAnZGVmYXVsdCcgJiYgaXNQbGFpbk9iamVjdChzZXJ2aWNlKSkge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoU2VydmljZS5pc1Byb3RvdHlwZU9mKHNlcnZpY2UpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc2VydmljZSA9IG5ldyBzZXJ2aWNlKHRoaXMsIG5hbWUpXG4gICAgfVxuICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2U6ICR7c2VydmljZX1gKVxuICAgIH1cbiAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIGBzZXJ2aWNlLm5hbWVgIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgICAvLyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGUuZy4gd2l0aCBhbiBhZnRlci1jb25zdHJ1Y3RvciBjbGFzcyBwcm9wZXJ0eS5cbiAgICAoeyBuYW1lIH0gPSBzZXJ2aWNlKVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZpY2VzW25hbWVdXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gbWlzc2luZyBmb3Igc2VydmljZSAnJHtuYW1lfSdgKVxuICAgIH1cbiAgICAvLyBBcyBhIGNvbnZlbnRpb24sIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgc2VydmljZSBjYW4gYmUgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyBpbiBvcmRlciB0byBlbnRpcmVseSBkZWFjdGl2YXRlIHRoZSBzZXJ2aWNlLlxuICAgIGlmIChjb25maWcgIT09IGZhbHNlKSB7XG4gICAgICBzZXJ2aWNlLnNldHVwKGNvbmZpZylcbiAgICAgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBzZXJ2aWNlXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgc2VydmljZSBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgICAvLyBvdmVycmlkZGVuIGJ5IHNlcnZpY2VzLlxuICAgICAgc2VydmljZS5pbml0aWFsaXplKClcbiAgICB9XG4gIH1cblxuICBnZXRTZXJ2aWNlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBmaW5kU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBmb3JFYWNoU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLm1hcChjYWxsYmFjaykpXG4gIH1cblxuICBhZGRDb250cm9sbGVycyhjb250cm9sbGVycywgbmFtZXNwYWNlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udHJvbGxlcnMpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVycyh2YWx1ZSwgbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfS8ke2tleX1gIDoga2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVyKHZhbHVlLCBuYW1lc3BhY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyLCBuYW1lc3BhY2UpIHtcbiAgICAvLyBDb250cm9sbGVycyByZXF1aXJlIGFkZGl0aW9uYWwgbWlkZGxld2FyZSB0byBiZSBpbnN0YWxsZWQgb25jZS5cbiAgICB0aGlzLnNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKVxuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChDb250cm9sbGVyLmlzUHJvdG90eXBlT2YoY29udHJvbGxlcikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBjb250cm9sbGVyID0gbmV3IGNvbnRyb2xsZXIodGhpcywgbmFtZXNwYWNlKVxuICAgIH1cbiAgICBpZiAoIShjb250cm9sbGVyIGluc3RhbmNlb2YgQ29udHJvbGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9YClcbiAgICB9XG4gICAgLy8gSW5oZXJpdGFuY2Ugb2YgYWN0aW9uIG1ldGhvZHMgY2Fubm90IGhhcHBlbiBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmLFxuICAgIC8vIHNvIGNhbGwgc2VwYXJhdGUgYHNldHVwKClgIG1ldGhvZCBhZnRlciBpbiBvcmRlciB0byB0YWtlIGNhcmUgb2YgaXQuXG4gICAgY29udHJvbGxlci5zZXR1cCgpXG4gICAgdGhpcy5jb250cm9sbGVyc1tjb250cm9sbGVyLnVybF0gPSBjb250cm9sbGVyXG4gICAgLy8gTm93IHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgIC8vIG92ZXJyaWRkZW4gYnkgY29udHJvbGxlcnMuXG4gICAgY29udHJvbGxlci5pbml0aWFsaXplKClcbiAgICAvLyBFYWNoIGNvbnRyb2xsZXIgY2FuIGFsc28gcHJvdmlkZSBmdXJ0aGVyIG1pZGRsZXdhcmUsIGUuZy5cbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYDpcbiAgICBjb25zdCBtaWRkbGV3YXJlID0gY29udHJvbGxlci5jb21wb3NlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gIH1cblxuICBnZXRDb250cm9sbGVyKHVybCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzW3VybF0gfHwgbnVsbFxuICB9XG5cbiAgZmluZENvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbnRyb2xsZXJzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZ2V0QWRtaW5Db250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmRDb250cm9sbGVyKFxuICAgICAgY29udHJvbGxlciA9PiBjb250cm9sbGVyIGluc3RhbmNlb2YgQWRtaW5Db250cm9sbGVyXG4gICAgKVxuICB9XG5cbiAgZ2V0QWRtaW5WdWVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWRtaW5Db250cm9sbGVyKCk/LmdldFZ1ZUNvbmZpZygpIHx8IG51bGxcbiAgfVxuXG4gIGdldEFzc2V0Q29uZmlnKHtcbiAgICBtb2RlbHMgPSBPYmplY3Qua2V5cyh0aGlzLm1vZGVscyksXG4gICAgbm9ybWFsaXplRGJOYW1lcyA9IHRoaXMuY29uZmlnLmtuZXgubm9ybWFsaXplRGJOYW1lc1xuICB9ID0ge30pIHtcbiAgICBjb25zdCBhc3NldENvbmZpZyA9IHt9XG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgb2YgbW9kZWxzKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5tb2RlbHNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgeyBhc3NldHMgfSA9IG1vZGVsQ2xhc3MuZGVmaW5pdGlvblxuICAgICAgaWYgKGFzc2V0cykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTW9kZWxOYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG1vZGVsTmFtZSlcbiAgICAgICAgICA6IG1vZGVsTmFtZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRBc3NldHMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFthc3NldERhdGFQYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfSA9IG1vZGVsQ2xhc3MuZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aChhc3NldERhdGFQYXRoKVxuICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG5hbWUpXG4gICAgICAgICAgICAgIDogbmFtZVxuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBub3JtYWxpemVEYXRhUGF0aChbXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAuLi5wYXJzZURhdGFQYXRoKG5lc3RlZERhdGFQYXRoKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0Q29uZmlncyA9IGNvbnZlcnRlZEFzc2V0c1tub3JtYWxpemVkTmFtZV0gfHw9IHt9XG4gICAgICAgICAgICBhc3NldENvbmZpZ3NbZGF0YVBhdGhdID0gY29uZmlnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGVkIGdyYXBoIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXRDb25maWdbbm9ybWFsaXplZE1vZGVsTmFtZV0gPSBjb252ZXJ0ZWRBc3NldHNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0Q29uZmlnXG4gIH1cblxuICBhZGRTdG9yYWdlcyhzdG9yYWdlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmFnZXMpKSB7XG4gICAgICB0aGlzLmFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKSB7XG4gICAgbGV0IHN0b3JhZ2UgPSBudWxsXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3RvcmFnZUNsYXNzID0gU3RvcmFnZS5nZXQoY29uZmlnLnR5cGUpXG4gICAgICBpZiAoIXN0b3JhZ2VDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN0b3JhZ2U6ICR7Y29uZmlnfWApXG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc3RvcmFnZSA9IG5ldyBzdG9yYWdlQ2xhc3ModGhpcywgY29uZmlnKVxuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RvcmFnZSkge1xuICAgICAgc3RvcmFnZSA9IGNvbmZpZ1xuICAgIH1cbiAgICBpZiAoc3RvcmFnZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc3RvcmFnZS5uYW1lID0gbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlc1tzdG9yYWdlLm5hbWVdID0gc3RvcmFnZVxuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZVxuICB9XG5cbiAgZ2V0U3RvcmFnZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgY29tcGlsZVZhbGlkYXRvcihqc29uU2NoZW1hLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGpzb25TY2hlbWFcbiAgICAgID8gdGhpcy52YWxpZGF0b3IuY29tcGlsZShqc29uU2NoZW1hLCBvcHRpb25zKVxuICAgICAgOiBudWxsXG4gIH1cblxuICBjb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBsaXN0ID0gW11cbiAgICBjb25zdCB7IGRhdGFOYW1lID0gJ2RhdGEnIH0gPSBvcHRpb25zXG5cbiAgICBsZXQgcHJvcGVydGllcyA9IG51bGxcbiAgICBjb25zdCBhZGRQYXJhbWV0ZXIgPSAobmFtZSwgc2NoZW1hKSA9PiB7XG4gICAgICBsaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lID8/IG51bGwsXG4gICAgICAgIC4uLnNjaGVtYVxuICAgICAgfSlcbiAgICAgIGlmICghc2NoZW1hLm1lbWJlcikge1xuICAgICAgICBwcm9wZXJ0aWVzIHx8PSB7fVxuICAgICAgICBwcm9wZXJ0aWVzW25hbWUgfHwgZGF0YU5hbWVdID0gc2NoZW1hXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydCB0d28gZm9ybWF0cyBvZiBwYXJhbWV0ZXJzIGRlZmluaXRpb25zOlxuICAgIC8vIC0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZWlyIGBuYW1lYCBrZXkuXG4gICAgLy8gLSBBbiBvYmplY3Qgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZSBrZXkgdW5kZXIgd2hpY2ggZWFjaFxuICAgIC8vICAgc2NoZW1hIGlzIHN0b3JlZCBpbiB0aGUgcm9vdCBvYmplY3QuXG4gICAgLy8gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBjb250cm9sbGVyIGFjdGlvbnMgcmVjZWl2ZXMgdGhlXG4gICAgLy8gcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBhcmd1bWVudHMuIElmIGFuIG9iamVjdCBpcyBwYXNzZWQsIHRoZW4gdGhlXG4gICAgLy8gYWN0aW9ucyByZWNlaXZlcyBvbmUgcGFyYW1ldGVyIG9iamVjdCB3aGVyZSB1bmRlciB0aGUgc2FtZSBrZXlzIHRoZVxuICAgIC8vIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBzdG9yZWQuXG4gICAgbGV0IGFzT2JqZWN0ID0gZmFsc2VcbiAgICBpZiAoaXNBcnJheShwYXJhbWV0ZXJzKSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIC4uLnNjaGVtYSB9IG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBhcmFtZXRlcnMpKSB7XG4gICAgICBhc09iamVjdCA9IHRydWVcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXJzIGRlZmluaXRpb246ICR7cGFyYW1ldGVyc31gKVxuICAgIH1cbiAgICAvLyBOT1RFOiBJZiBwcm9wZXJ0aWVzIGlzIG51bGwsIHNjaGVtYSBhbmQgdmFsaWRhdGUgd2lsbCBiZWNvbWUgbnVsbCB0b28uXG4gICAgLy8gTk9URTogSWYgaXQgaXMgbm90IG51bGwsIGl0IHdpbGwgZ2V0IGV4cGFuZGVkIHRvIGFuIG9iamVjdCBzY2hlbWEuXG4gICAgY29uc3Qgc2NoZW1hID0gY29udmVydFNjaGVtYShwcm9wZXJ0aWVzLCBvcHRpb25zKVxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5jb21waWxlVmFsaWRhdG9yKHNjaGVtYSwge1xuICAgICAgLy8gRm9yIHBhcmFtZXRlcnMsIGFsd2F5cyBjb2VyY2UgdHlwZXMsIGluY2x1ZGluZyBhcnJheXMuXG4gICAgICBjb2VyY2VUeXBlczogJ2FycmF5JyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgIGFwcDogdGhpcyxcbiAgICAgIHZhbGlkYXRvcjogdGhpcy52YWxpZGF0b3IsXG4gICAgICBvcHRpb25zXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsaXN0LFxuICAgICAgc2NoZW1hLFxuICAgICAgYXNPYmplY3QsXG4gICAgICBkYXRhTmFtZSxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxuICAgICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBjdHggYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgICAgPyBkYXRhID0+IHZhbGlkYXRlLmNhbGwoY3R4LCBkYXRhKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMsIG9wdGlvbnMgfSkge1xuICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZXJyb3JzOiB0aGlzLnZhbGlkYXRvci5wYXJzZUVycm9ycyhlcnJvcnMsIG9wdGlvbnMpXG4gICAgfSlcbiAgfVxuXG4gIHNldHVwR2xvYmFsTWlkZGxld2FyZSgpIHtcbiAgICBjb25zdCB7IGFwcCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgdGhpcy51c2UoYXR0YWNoTG9nZ2VyKHRoaXMubG9nZ2VyKSlcblxuICAgIGlmIChhcHAucmVzcG9uc2VUaW1lICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UocmVzcG9uc2VUaW1lKGdldE9wdGlvbnMoYXBwLnJlc3BvbnNlVGltZSkpKVxuICAgIH1cbiAgICBpZiAobG9nLnJlcXVlc3RzKSB7XG4gICAgICB0aGlzLnVzZShsb2dSZXF1ZXN0cygpKVxuICAgIH1cbiAgICAvLyBOZWVkcyB0byBiZSBwb3NpdGlvbmVkIGFmdGVyIHRoZSByZXF1ZXN0IGxvZ2dlciB0byBsb2cgdGhlIGNvcnJlY3RcbiAgICAvLyByZXNwb25zZSBzdGF0dXMuXG4gICAgdGhpcy51c2UoaGFuZGxlRXJyb3IoKSlcbiAgICBpZiAoYXBwLmhlbG1ldCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGhlbG1ldChnZXRPcHRpb25zKGFwcC5oZWxtZXQpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29ycyhnZXRPcHRpb25zKGFwcC5jb3JzKSkpXG4gICAgfVxuICAgIGlmIChhcHAuY29tcHJlc3MgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb21wcmVzcyhtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIC8vIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgQnJvdGxpIGNvbXByZXNzaW9uLlxuICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20va29hanMvY29tcHJlc3MvaXNzdWVzLzEyNlxuICAgICAgICAgIGJyOiB7XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgW3psaWIuY29uc3RhbnRzLkJST1RMSV9QQVJBTV9RVUFMSVRZXTogNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3B0aW9ucyhhcHAuY29tcHJlc3MpXG4gICAgICApKSlcbiAgICB9XG4gICAgaWYgKGFwcC5ldGFnICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29uZGl0aW9uYWwoKSlcbiAgICAgIHRoaXMudXNlKGV0YWcoKSlcbiAgICB9XG4gIH1cblxuICBzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlKCkge1xuICAgIC8vIE5PVEU6IFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIGF1dG9tYXRpYyBgc2V0dXBHbG9iYWxNaWRkbGV3YXJlKClgIHNvIHRoYXRcbiAgICAvLyBhcHBzIGNhbiBzZXQgdXAgdGhlIHN0YXRpYyBzZXJ2aW5nIG9mIGFzc2V0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGVcbiAgICAvLyBzZXNzaW9uIGFuZCBwYXNzcG9ydCBtaWRkbGV3YXJlLiBJdCBpcyBjYWxsZWQgZnJvbSBgYWRkQ29udHJvbGxlcigpYC5cbiAgICAvLyBVc2UgYSBmbGFnIHRvIG9ubHkgaW5zdGFsbCB0aGUgbWlkZGxld2FyZSBvbmNlOlxuICAgIGlmICghdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSkge1xuICAgICAgY29uc3QgeyBhcHAgfSA9IHRoaXMuY29uZmlnXG4gICAgICAvLyBTZXF1ZW5jZSBpcyBpbXBvcnRhbnQ6XG4gICAgICAvLyAxLiBib2R5IHBhcnNlclxuICAgICAgdGhpcy51c2UoYm9keVBhcnNlcihnZXRPcHRpb25zKGFwcC5ib2R5UGFyc2VyKSkpXG4gICAgICAvLyAyLiBmaW5kIHJvdXRlIGZyb20gcm91dGVzIGluc3RhbGxlZCBieSBjb250cm9sbGVycy5cbiAgICAgIHRoaXMudXNlKGZpbmRSb3V0ZSh0aGlzLnJvdXRlcikpXG4gICAgICAvLyAzLiByZXNwZWN0IHRyYW5zYWN0ZWQgc2V0dGluZ3MsIGNyZWF0ZSBhbmQgaGFuZGxlIHRyYW5zYWN0aW9ucy5cbiAgICAgIHRoaXMudXNlKGNyZWF0ZVRyYW5zYWN0aW9uKCkpXG4gICAgICAvLyA0LiBzZXNzaW9uXG4gICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9ID0gZ2V0T3B0aW9ucyhhcHAuc2Vzc2lvbilcbiAgICAgICAgaWYgKG1vZGVsQ2xhc3MpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBDb250ZXh0U3RvcmUgdGhhdCByZXNvbHZlZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGNsYXNzLFxuICAgICAgICAgIC8vIHVzZXMgaXQgdG8gcGVyc2lzdCBhbmQgcmV0cmlldmUgdGhlIHNlc3Npb24sIGFuZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgLy8gYmluZHMgYWxsIGRiIG9wZXJhdGlvbnMgdG8gYGN0eC50cmFuc2FjdGlvbmAsIGlmIGl0IGlzIHNldC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgICAgIG9wdGlvbnMuQ29udGV4dFN0b3JlID0gU2Vzc2lvblN0b3JlKG1vZGVsQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2Uoc2Vzc2lvbihvcHRpb25zLCB0aGlzKSlcbiAgICAgIH1cbiAgICAgIC8vIDUuIHBhc3Nwb3J0XG4gICAgICBpZiAoYXBwLnBhc3Nwb3J0KSB7XG4gICAgICAgIHRoaXMudXNlKHBhc3Nwb3J0LmluaXRpYWxpemUoKSlcbiAgICAgICAgaWYgKGFwcC5zZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuc2Vzc2lvbigpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlKGhhbmRsZVVzZXIoKSlcbiAgICAgIH1cblxuICAgICAgLy8gNi4gZmluYWxseSBoYW5kbGUgdGhlIGZvdW5kIHJvdXRlLCBvciBzZXQgc3RhdHVzIC8gYWxsb3cgYWNjb3JkaW5nbHkuXG4gICAgICB0aGlzLnVzZShoYW5kbGVSb3V0ZSgpKVxuICAgICAgdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICBzZXR1cExvZ2dlcigpIHtcbiAgICBjb25zdCB7IGVyciwgcmVxLCByZXMgfSA9IHBpbm8uc3RkU2VyaWFsaXplcnNcbiAgICAvLyBPbmx5IGluY2x1ZGUgYGlkYCBmcm9tIHRoZSB1c2VyLCB0byBub3QgaW5hZHZlcnRlbnRseSBsb2cgUElJLlxuICAgIGNvbnN0IHVzZXIgPSB1c2VyID0+ICh7IGlkOiB1c2VyLmlkIH0pXG4gICAgY29uc3Qgc2VyaWFsaXplcnMgPSB7IGVyciwgcmVxLCByZXMsIHVzZXIgfVxuXG4gICAgY29uc3QgbG9nZ2VyID0gcGlubyhtZXJnZShcbiAgICAgIHtcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc2VyaWFsaXplcnMsXG4gICAgICAgIHByZXR0eVByaW50OiB7XG4gICAgICAgICAgLy8gTGlzdCBvZiBrZXlzIHRvIGlnbm9yZSBpbiBwcmV0dHkgbW9kZS5cbiAgICAgICAgICBpZ25vcmU6ICdyZXEscmVzLGR1cmF0aW9uTXMsdXNlcixyZXF1ZXN0SWQnLFxuICAgICAgICAgIC8vIFNZUyB0byB1c2Ugc3lzdGVtIHRpbWUgYW5kIG5vdCBVVEMuXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogJ1NZUzpISDpNTTpzcy5sJ1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZWRhY3QgY29tbW9uIHNlbnNpdGl2ZSBoZWFkZXJzLlxuICAgICAgICByZWRhY3Q6IFtcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wic2V0LWNvb2tpZVwiXScsXG4gICAgICAgICAgJyouaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl0nXG4gICAgICAgIF0sXG4gICAgICAgIGJhc2U6IG51bGwgLy8gbm8gcGlkLGhvc3RuYW1lLG5hbWVcbiAgICAgIH0sXG4gICAgICBnZXRPcHRpb25zKHRoaXMuY29uZmlnLmxvZ2dlcilcbiAgICApKVxuXG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIuY2hpbGQoeyBuYW1lOiAnYXBwJyB9KVxuICB9XG5cbiAgc2V0dXBLbmV4KCkge1xuICAgIGxldCB7IGtuZXgsIGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAoa25leD8uY2xpZW50KSB7XG4gICAgICBjb25zdCBzbmFrZUNhc2VPcHRpb25zID0ga25leC5ub3JtYWxpemVEYk5hbWVzID09PSB0cnVlXG4gICAgICAgID8ge31cbiAgICAgICAgOiBrbmV4Lm5vcm1hbGl6ZURiTmFtZXNcbiAgICAgIGlmIChzbmFrZUNhc2VPcHRpb25zKSB7XG4gICAgICAgIGtuZXggPSB7XG4gICAgICAgICAgLi4ua25leCxcbiAgICAgICAgICAuLi5rbmV4U25ha2VDYXNlTWFwcGVycyhzbmFrZUNhc2VPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXggPSBLbmV4KGtuZXgpXG4gICAgICBpZiAobG9nLnNxbCkge1xuICAgICAgICB0aGlzLnNldHVwS25leExvZ2dpbmcoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldHVwS25leExvZ2dpbmcoKSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lcyA9IHt9XG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuY2hpbGQoeyBuYW1lOiAnc3FsJyB9KVxuICAgIGZ1bmN0aW9uIGVuZChxdWVyeSwgeyByZXNwb25zZSwgZXJyb3IgfSkge1xuICAgICAgY29uc3QgaWQgPSBxdWVyeS5fX2tuZXhRdWVyeVVpZFxuICAgICAgY29uc3QgZGlmZiA9IHByb2Nlc3MuaHJ0aW1lKHN0YXJ0VGltZXNbaWRdKVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBkaWZmWzBdICogMWUzICsgZGlmZlsxXSAvIDFlNlxuICAgICAgZGVsZXRlIHN0YXJ0VGltZXNbaWRdXG4gICAgICBjb25zdCB7IHNxbCwgYmluZGluZ3MgfSA9IHF1ZXJ5XG4gICAgICByZXNwb25zZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UpLmZpbHRlcihcbiAgICAgICAgICAoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIGxvZ2dlci5pbmZvKHsgZHVyYXRpb24sIGJpbmRpbmdzLCByZXNwb25zZSwgZXJyb3IgfSwgc3FsKVxuICAgIH1cblxuICAgIHRoaXMua25leFxuICAgICAgLm9uKCdxdWVyeScsIHF1ZXJ5ID0+IHtcbiAgICAgICAgc3RhcnRUaW1lc1txdWVyeS5fX2tuZXhRdWVyeVVpZF0gPSBwcm9jZXNzLmhydGltZSgpXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1yZXNwb25zZScsIChyZXNwb25zZSwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlIH0pXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1lcnJvcicsIChlcnJvciwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IGVycm9yIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbm9ybWFsaXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIHRoaXMua25leC5jbGllbnQud3JhcElkZW50aWZpZXIoaWRlbnRpZmllcikucmVwbGFjZSgvWydgXCJdL2csICcnKVxuICB9XG5cbiAgZGVub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLmtuZXguY2xpZW50LnBvc3RQcm9jZXNzUmVzcG9uc2UoeyBbaWRlbnRpZmllcl06IDEgfSlcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXVxuICB9XG5cbiAgbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFwcC5ub3JtYWxpemVQYXRocyA/IGh5cGhlbmF0ZShwYXRoKSA6IHBhdGhcbiAgfVxuXG4gIGZvcm1hdEVycm9yKGVycikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIudG9KU09OXG4gICAgICA/IGZvcm1hdEpzb24oZXJyLnRvSlNPTigpKVxuICAgICAgOiBlcnIubWVzc2FnZSB8fCBlcnJcbiAgICBjb25zdCBzdHIgPSBgJHtlcnIubmFtZX06ICR7bWVzc2FnZX1gXG4gICAgcmV0dXJuIGVyci5zdGFjayAmJiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zdGFjayAhPT0gZmFsc2VcbiAgICAgID8gYCR7c3RyfVxcbiR7ZXJyLnN0YWNrLnNwbGl0KC9cXG58XFxyXFxufFxcci8pLnNsaWNlKDEpLmpvaW4ob3MuRU9MKX1gXG4gICAgICA6IHN0clxuICB9XG5cbiAgbG9nRXJyb3IoZXJyLCBjdHgpIHtcbiAgICBpZiAoIWVyci5leHBvc2UgJiYgIXRoaXMuc2lsZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5mb3JtYXRFcnJvcihlcnIpXG4gICAgICAgIGNvbnN0IGxldmVsID1cbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yICYmIGVyci5zdGF0dXMgPCA1MDAgPyAnaW5mbycgOiAnZXJyb3InXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGN0eD8ubG9nZ2VyIHx8IHRoaXMubG9nZ2VyXG4gICAgICAgIGxvZ2dlcltsZXZlbF0odGV4dClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGxvZyBlcnJvcicsIGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0YXJ0JylcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdGFydCgpKVxuICAgIGNvbnN0IHtcbiAgICAgIHNlcnZlcjogeyBob3N0LCBwb3J0IH0sXG4gICAgICBlbnZcbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMubGlzdGVuKHBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBwb3J0IH0gPSBzZXJ2ZXIuYWRkcmVzcygpXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJHtlbnZ9IHNlcnZlciBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gXG4gICAgICAgIClcbiAgICAgICAgcmVzb2x2ZShzZXJ2ZXIpXG4gICAgICB9KVxuICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHN0YXJ0IHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0YXJ0JylcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RvcCcpXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB7IHNlcnZlciB9ID0gdGhpc1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBIYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNsb3NlIHRoZSBzZXJ2ZXIsXG4gICAgICAgIC8vICBldmVuIGlmIHNvY2tldHMgYXJlIHN0aWxsIG9wZW4uXG4gICAgICAgIC8vICBUYWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjgzMDA3Mi5cbiAgICAgICAgLy8gIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBhIGxpYnJhcnksIGV4OiBodHRwczovL2dpdGh1Yi5jb20vZ29kYWRkeS90ZXJtaW51c1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gc2VydmVyLmVtaXQoJ2Nsb3NlJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0b3AoKSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0b3AnKVxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE9yRXhpdCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKGVycilcbiAgICAgIHByb2Nlc3MuZXhpdCgtMSlcbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBhc3luYyBjcmVhdGVBc3NldHMoc3RvcmFnZSwgZmlsZXMsIGNvdW50ID0gMCwgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGNvbnN0IGFzc2V0cyA9IGZpbGVzLm1hcChmaWxlID0+ICh7XG4gICAgICAgIGtleTogZmlsZS5rZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UubmFtZSxcbiAgICAgICAgY291bnRcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIEFzc2V0TW9kZWxcbiAgICAgICAgLnF1ZXJ5KHRyeClcbiAgICAgICAgLmluc2VydChhc3NldHMpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgIHN0b3JhZ2UsXG4gICAgYWRkZWRGaWxlcyxcbiAgICByZW1vdmVkRmlsZXMsXG4gICAgdHJ4ID0gbnVsbFxuICApIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3NldHM6IHtcbiAgICAgICAgY2xlYW51cFRpbWVUaHJlc2hvbGQgPSAwXG4gICAgICB9ID0ge31cbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICAvLyBPbmx5IHJlbW92ZSB1bnVzZWQgYXNzZXRzIHRoYXQgaGF2ZW4ndCBzZWVuIGNoYW5nZXMgZm9yIGdpdmVuIHRpbWVmcmFtZS5cbiAgICBjb25zdCB0aW1lVGhyZXNob2xkID0gaXNTdHJpbmcoY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA/IHBhcnNlRHVyYXRpb24oY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA6IGNsZWFudXBUaW1lVGhyZXNob2xkXG5cbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBpbXBvcnRlZEZpbGVzLnB1c2goXG4gICAgICAgIC4uLmF3YWl0IHRoaXMuYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBhZGRlZEZpbGVzLCB0cngpXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZUNvdW50ID0gKGZpbGVzLCBpbmNyZW1lbnQpID0+IChcbiAgICAgICAgICBmaWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgQXNzZXRNb2RlbC5xdWVyeSh0cngpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5JywgZmlsZXMubWFwKGZpbGUgPT4gZmlsZS5rZXkpKVxuICAgICAgICAgICAgLmluY3JlbWVudCgnY291bnQnLCBpbmNyZW1lbnQpXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGNoYW5nZUNvdW50KGFkZGVkRmlsZXMsIDEpLFxuICAgICAgICAgIGNoYW5nZUNvdW50KHJlbW92ZWRGaWxlcywgLTEpXG4gICAgICAgIF0pXG4gICAgICAgIGlmICh0aW1lVGhyZXNob2xkID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAvLyBEb24ndCBwYXNzIGB0cnhgIGhlcmUsIGFzIHdlIHdhbnQgdGhpcyBkZWxheWVkIGV4ZWN1dGlvbiB0b1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0cyBvd24gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCksXG4gICAgICAgICAgICB0aW1lVGhyZXNob2xkXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGV4ZWN1dGUgcmVsZWFzZVVudXNlZEFzc2V0cygpIGltbWVkaWF0ZWx5IGluIHRoZSBzYW1lXG4gICAgICAvLyB0cmFuc2FjdGlvbiwgdG8gcG90ZW50aWFsbHkgY2xlYW4gdXAgb3RoZXIgcGVuZGluZyBhc3NldHMuXG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCwgdHJ4KVxuICAgICAgcmV0dXJuIGltcG9ydGVkRmlsZXNcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgLy8gRmluZCBtaXNzaW5nIGFzc2V0cyAoY29waWVkIGZyb20gYW5vdGhlciBzeXN0ZW0pLCBhbmQgYWRkIHRoZW0uXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmRhdGEgfHwgZmlsZS51cmwpIHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YSB9ID0gZmlsZVxuICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgICAgICBgJHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbGsucmVkKCdJTkZPOicpXG4gICAgICAgICAgICAgICAgICB9IEFzc2V0ICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtmaWxlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgZmV0Y2hpbmcgZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7ZmlsZS51cmx9J2ApXG4gICAgICAgICAgICAgICAgICB9IGFuZCBhZGRpbmcgdG8gc3RvcmFnZSAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgJyR7c3RvcmFnZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfS4uLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkRmlsZSA9IGF3YWl0IHN0b3JhZ2UuYWRkRmlsZShmaWxlLCBkYXRhKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBbaW1wb3J0ZWRGaWxlXSwgMCwgdHJ4KVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgICBpbXBvcnRlZEZpbGVzLnB1c2goaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBpbXBvcnQgYXNzZXQgZnJvbSBmb3JlaWduIHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBc3NldCBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGJ1dCB3YXMgYWxyZWFkeSBpbXBvcnRlZCBhbmQgY2FuXG4gICAgICAgICAgICAvLyBiZSByZXVzZWQuIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyBtZXJnZS5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgYXNzZXQuZmlsZSlcbiAgICAgICAgICAgIC8vIE5PVEU6IE5vIG5lZWQgdG8gYWRkIGBmaWxlYCB0byBgaW1wb3J0ZWRGaWxlc2AsIHNpbmNlIGl0J3NcbiAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBpbXBvcnRlZCB0byB0aGUgc3RvcmFnZSBiZWZvcmUuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kaWZpZWRBc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgICAgaWYgKGFzc2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGZpbGUuZGF0YSlcbiAgICAgICAgICAgICAgLy8gTWVyZ2UgYmFjayB0aGUgY2hhbmdlZCBmaWxlIHByb3BlcnRpZXMgaW50byB0aGUgYWN0dWFsIGZpbGVzXG4gICAgICAgICAgICAgIC8vIG9iamVjdCwgc28gdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBzdGF0aWMgbW9kZWwgaG9vayBjYW4gYmUgdXNlZFxuICAgICAgICAgICAgICAvLyBkaXJlY3RseSBmb3IgdGhlIGFjdHVhbCBydW5uaW5nIHF1ZXJ5LlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGZpbGUsIGNoYW5nZWRGaWxlKVxuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHVwZGF0ZSBtb2RpZmllZCBhc3NldCBmcm9tIG1lbW9yeSBzb3VyY2U6ICcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5uYW1lXG4gICAgICAgICAgICAgICAgfScgKCcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5rZXlcbiAgICAgICAgICAgICAgICB9JylgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllZEZpbGVzXG4gIH1cblxuICBhc3luYyByZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgcmV0dXJuIEFzc2V0TW9kZWwudHJhbnNhY3Rpb24odHJ4LCBhc3luYyB0cnggPT4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHRpbWUgdGhyZXNob2xkIGluIEpTIGluc3RlYWQgb2YgU1FMLCBhcyB0aGVyZSBpcyBub1xuICAgICAgICAvLyBlYXN5IGNyb3NzLVNRTCB3YXkgdG8gZG8gYG5vdygpIC0gaW50ZXJ2YWwgWCBob3Vyc2A6XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSB0aW1lVGhyZXNob2xkKVxuICAgICAgICBjb25zdCBvcnBoYW5lZEFzc2V0cyA9IGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgIC53aGVyZSgnY291bnQnLCAwKVxuICAgICAgICAgIC5hbmRXaGVyZSgndXBkYXRlZEF0JywgJzw9JywgZGF0ZSlcbiAgICAgICAgICAvLyBQcm90ZWN0IGZyZXNobHkgY3JlYXRlZCBhc3NldHMgZnJvbSBiZWluZyBkZWxldGVkIGFnYWluIHJpZ2h0IGF3YXksXG4gICAgICAgICAgLy8gLmUuZy4gd2hlbiBgY29uZmlnLmFzc2V0cy5jbGVhbnVwVGltZVRocmVzaG9sZCA9IDBgXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPicsIHJlZignY3JlYXRlZEF0JykpXG4gICAgICAgIGlmIChvcnBoYW5lZEFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgb3JwaGFuZWRLZXlzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBvcnBoYW5lZEFzc2V0cy5tYXAoYXN5bmMgYXNzZXQgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmFnZShhc3NldC5zdG9yYWdlKS5yZW1vdmVGaWxlKGFzc2V0LmZpbGUpXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICAgICAgICAgICAgICAgIGFzc2V0LmVycm9yID0gZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXNzZXQua2V5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBBc3NldE1vZGVsXG4gICAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5Jywgb3JwaGFuZWRLZXlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcnBoYW5lZEFzc2V0c1xuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3ZlcnJpZGUgS29hJ3MgZXZlbnRzIHdpdGggb3VyIG93biBFdmVudEVtaXR0ZXIgdGhhdCBhZGRzIHN1cHBvcnQgZm9yXG4vLyBhc3luY2hyb25vdXMgZXZlbnRzLlxuRXZlbnRFbWl0dGVyLm1peGluKEFwcGxpY2F0aW9uLnByb3RvdHlwZSlcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBpc09iamVjdChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fVxufVxuIl19
|
|
955
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsImNoYWxrIiwieWVsbG93IiwiYm9sZCIsInV0aWwiLCJpbnNwZWN0IiwiY29sb3JzIiwiZGVwdGgiLCJtYXhBcnJheUxlbmd0aCIsIkVycm9yIiwic29ydEJ5UmVsYXRpb25zIiwibGlzdCIsImNvbGxlY3RlZCIsImV4Y2x1ZGVkIiwicmVsYXRpb24iLCJnZXRSZWxhdGlvbnMiLCJCZWxvbmdzVG9PbmVSZWxhdGlvbiIsInJlbGF0ZWRNb2RlbENsYXNzIiwiam9pblRhYmxlTW9kZWxDbGFzcyIsInJlbGF0ZWQiLCJyZXZlcnNlIiwicmVkdWNlIiwiZ2V0TW9kZWwiLCJlbmRzV2l0aCIsImZpbmRNb2RlbCIsImNhbGxiYWNrIiwiZmluZCIsInNlcnZpY2UiLCJlbnRyaWVzIiwiYWRkU2VydmljZSIsIlNlcnZpY2UiLCJ1bmRlZmluZWQiLCJnZXRTZXJ2aWNlIiwiZmluZFNlcnZpY2UiLCJmb3JFYWNoU2VydmljZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJuYW1lc3BhY2UiLCJrZXkiLCJhZGRDb250cm9sbGVyIiwic2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSIsIkNvbnRyb2xsZXIiLCJ1cmwiLCJjb21wb3NlIiwiZ2V0Q29udHJvbGxlciIsImZpbmRDb250cm9sbGVyIiwiZ2V0QWRtaW5Db250cm9sbGVyIiwiQWRtaW5Db250cm9sbGVyIiwiZ2V0QWRtaW5WdWVDb25maWciLCJnZXRWdWVDb25maWciLCJnZXRBc3NldENvbmZpZyIsIm5vcm1hbGl6ZURiTmFtZXMiLCJhc3NldENvbmZpZyIsIm1vZGVsTmFtZSIsImFzc2V0cyIsImRlZmluaXRpb24iLCJub3JtYWxpemVkTW9kZWxOYW1lIiwibm9ybWFsaXplSWRlbnRpZmllciIsImNvbnZlcnRlZEFzc2V0cyIsImFzc2V0RGF0YVBhdGgiLCJwcm9wZXJ0eSIsIm5lc3RlZERhdGFQYXRoIiwiaW5kZXgiLCJnZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoIiwibm9ybWFsaXplZE5hbWUiLCJkYXRhUGF0aCIsImFzc2V0Q29uZmlncyIsImFkZFN0b3JhZ2UiLCJzdG9yYWdlIiwic3RvcmFnZUNsYXNzIiwiU3RvcmFnZSIsImdldCIsInR5cGUiLCJnZXRTdG9yYWdlIiwiY29tcGlsZVZhbGlkYXRvciIsImpzb25TY2hlbWEiLCJvcHRpb25zIiwiY29tcGlsZSIsImNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yIiwicGFyYW1ldGVycyIsImRhdGFOYW1lIiwicHJvcGVydGllcyIsImFkZFBhcmFtZXRlciIsInB1c2giLCJtZW1iZXIiLCJhc09iamVjdCIsInZhbGlkYXRlIiwiY29lcmNlVHlwZXMiLCJjdHgiLCJjYWxsIiwiY3JlYXRlVmFsaWRhdGlvbkVycm9yIiwibWVzc2FnZSIsImVycm9ycyIsImpzb24iLCJWYWxpZGF0aW9uRXJyb3IiLCJwYXJzZUVycm9ycyIsImNyZWF0ZURhdGFiYXNlRXJyb3IiLCJlcnJvciIsInNxbCIsIm1hdGNoIiwiRGF0YWJhc2VFcnJvciIsImxvZ2dlciIsInJlc3BvbnNlVGltZSIsImdldE9wdGlvbnMiLCJyZXF1ZXN0cyIsImhlbG1ldCIsImNvcnMiLCJjb21wcmVzcyIsImJyIiwicGFyYW1zIiwiemxpYiIsImNvbnN0YW50cyIsIkJST1RMSV9QQVJBTV9RVUFMSVRZIiwiZXRhZyIsImJvZHlQYXJzZXIiLCJzZXNzaW9uIiwiQ29udGV4dFN0b3JlIiwicGFzc3BvcnQiLCJlcnIiLCJyZXEiLCJyZXMiLCJwaW5vIiwic3RkU2VyaWFsaXplcnMiLCJ1c2VyIiwiaWQiLCJzZXJpYWxpemVycyIsImxldmVsIiwicHJldHR5UHJpbnQiLCJpZ25vcmUiLCJ0cmFuc2xhdGVUaW1lIiwicmVkYWN0IiwiYmFzZSIsImNoaWxkIiwiY2xpZW50Iiwic25ha2VDYXNlT3B0aW9ucyIsInNldHVwS25leExvZ2dpbmciLCJzdGFydFRpbWVzIiwiZW5kIiwicXVlcnkiLCJyZXNwb25zZSIsIl9fa25leFF1ZXJ5VWlkIiwiZGlmZiIsImhydGltZSIsImR1cmF0aW9uIiwiYmluZGluZ3MiLCJmcm9tRW50cmllcyIsInN0YXJ0c1dpdGgiLCJvbiIsImlkZW50aWZpZXIiLCJ3cmFwSWRlbnRpZmllciIsInJlcGxhY2UiLCJkZW5vcm1hbGl6ZUlkZW50aWZpZXIiLCJvYmoiLCJwb3N0UHJvY2Vzc1Jlc3BvbnNlIiwibm9ybWFsaXplUGF0aCIsIm5vcm1hbGl6ZVBhdGhzIiwiZm9ybWF0RXJyb3IiLCJ0b0pTT04iLCJzdHIiLCJzdGFjayIsInNwbGl0Iiwic2xpY2UiLCJqb2luIiwib3MiLCJFT0wiLCJsb2dFcnJvciIsImV4cG9zZSIsInRleHQiLCJSZXNwb25zZUVycm9yIiwic3RhdHVzIiwiZSIsInN0YXJ0IiwiZW1pdCIsInNlcnZlciIsImhvc3QiLCJwb3J0IiwicmVzb2x2ZSIsInJlamVjdCIsImxpc3RlbiIsImFkZHJlc3MiLCJzdG9wIiwiY2xvc2UiLCJzZXRJbW1lZGlhdGUiLCJvZmYiLCJzdGFydE9yRXhpdCIsImV4aXQiLCJjcmVhdGVBc3NldHMiLCJmaWxlcyIsImNvdW50IiwidHJ4IiwiQXNzZXRNb2RlbCIsImZpbGUiLCJpbnNlcnQiLCJoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzIiwiYWRkZWRGaWxlcyIsInJlbW92ZWRGaWxlcyIsImNsZWFudXBUaW1lVGhyZXNob2xkIiwidGltZVRocmVzaG9sZCIsImltcG9ydGVkRmlsZXMiLCJhZGRGb3JlaWduQXNzZXRzIiwiY2hhbmdlQ291bnQiLCJpbmNyZW1lbnQiLCJ3aGVyZUluIiwic2V0VGltZW91dCIsInJlbGVhc2VVbnVzZWRBc3NldHMiLCJhc3NldCIsImZpbmRPbmUiLCJyZWQiLCJncmVlbiIsImF4aW9zIiwicmVxdWVzdCIsIm1ldGhvZCIsInJlc3BvbnNlVHlwZSIsImltcG9ydGVkRmlsZSIsImFkZEZpbGUiLCJhc3NpZ24iLCJBc3NldEVycm9yIiwiaGFuZGxlTW9kaWZpZWRBc3NldHMiLCJtb2RpZmllZEZpbGVzIiwiY2hhbmdlZEZpbGUiLCJ0cmFuc2FjdGlvbiIsImRhdGUiLCJEYXRlIiwic2V0TWlsbGlzZWNvbmRzIiwiZ2V0TWlsbGlzZWNvbmRzIiwib3JwaGFuZWRBc3NldHMiLCJ3aGVyZSIsImFuZFdoZXJlIiwib3JwaGFuZWRLZXlzIiwicmVtb3ZlRmlsZSIsImRlbGV0ZSIsIkV2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QUFOLEdBQWNBLEtBQWQ7QUFDRDs7QUFDRCxtQkFBTzRHLEtBQUssQ0FBQ3ZLLEdBQWI7QUFDRCxXQVJELENBRHlCLENBQTNCO0FBV0EsZ0JBQU13SixVQUFVLENBQ2JwRCxLQURHLENBQ0dtRCxHQURILEVBRUh5QyxNQUZHLEdBR0g1QixPQUhHLENBR0ssS0FITCxFQUdZMEIsWUFIWixDQUFOO0FBSUQ7O0FBQ0QsZUFBT0gsY0FBUDtBQUNELE9BOUJNLENBQVA7QUErQkQ7QUFDRjs7QUF6NEJrQzs7OztBQTg0QnJDTSxrQkFBYUMsS0FBYixDQUFtQjdTLFdBQVcsQ0FBQzhTLFNBQS9COztBQUVBLFNBQVNsSSxVQUFULENBQW9CM0IsT0FBcEIsRUFBNkI7QUFDM0IsU0FBTyxzQkFBU0EsT0FBVCxJQUFvQkEsT0FBcEIsR0FBOEIsRUFBckM7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBLb2EgZnJvbSAna29hJ1xuaW1wb3J0IEtuZXggZnJvbSAna25leCdcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgemxpYiBmcm9tICd6bGliJ1xuaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBvcyBmcm9tICdvcydcbmltcG9ydCBwYXJzZUR1cmF0aW9uIGZyb20gJ3BhcnNlLWR1cmF0aW9uJ1xuaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAna29hLWJvZHlwYXJzZXInXG5pbXBvcnQgY29ycyBmcm9tICdAa29hL2NvcnMnXG5pbXBvcnQgY29tcG9zZSBmcm9tICdrb2EtY29tcG9zZSdcbmltcG9ydCBjb21wcmVzcyBmcm9tICdrb2EtY29tcHJlc3MnXG5pbXBvcnQgY29uZGl0aW9uYWwgZnJvbSAna29hLWNvbmRpdGlvbmFsLWdldCdcbmltcG9ydCBwYXNzcG9ydCBmcm9tICdrb2EtcGFzc3BvcnQnXG5pbXBvcnQgc2Vzc2lvbiBmcm9tICdrb2Etc2Vzc2lvbidcbmltcG9ydCBldGFnIGZyb20gJ2tvYS1ldGFnJ1xuaW1wb3J0IGhlbG1ldCBmcm9tICdrb2EtaGVsbWV0J1xuaW1wb3J0IHJlc3BvbnNlVGltZSBmcm9tICdrb2EtcmVzcG9uc2UtdGltZSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGRpdG9qcy9yb3V0ZXInXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAL2xpYidcbmltcG9ydCB7IENvbnRyb2xsZXIsIEFkbWluQ29udHJvbGxlciB9IGZyb20gJ0AvY29udHJvbGxlcnMnXG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnQC9zZXJ2aWNlcydcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAL3N0b3JhZ2UnXG5pbXBvcnQgeyBjb252ZXJ0U2NoZW1hIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBmb3JtYXRKc29uIH0gZnJvbSAnQC91dGlscydcbmltcG9ydCB7XG4gIFJlc3BvbnNlRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbiAgQXNzZXRFcnJvclxufSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93LmJvbGQoYFxcbiR7bW9kZWxDbGFzcy5uYW1lfTpcXG5gKSxcbiAgICAgICAgICAgIHV0aWwuaW5zcGVjdChkYXRhLCB7XG4gICAgICAgICAgICAgIGNvbG9yczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVwdGg6IG51bGwsXG4gICAgICAgICAgICAgIG1heEFycmF5TGVuZ3RoOiBudWxsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZE1vZGVsKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoTW9kZWwuaXNQcm90b3R5cGVPZihtb2RlbENsYXNzKSkge1xuICAgICAgbW9kZWxDbGFzcy5hcHAgPSB0aGlzXG4gICAgICB0aGlzLm1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW9kZWwgY2xhc3M6ICR7bW9kZWxDbGFzc31gKVxuICAgIH1cbiAgfVxuXG4gIHNvcnRNb2RlbHMobW9kZWxzKSB7XG4gICAgY29uc3Qgc29ydEJ5UmVsYXRpb25zID0gKGxpc3QsIGNvbGxlY3RlZCA9IHt9LCBleGNsdWRlZCA9IHt9KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgaWYgKCFjb2xsZWN0ZWRbbmFtZV0gJiYgIWV4Y2x1ZGVkW25hbWVdKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zKCkpKSB7XG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbiBpbnN0YW5jZW9mIEJlbG9uZ3NUb09uZVJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IHJlbGF0ZWRNb2RlbENsYXNzLCBqb2luVGFibGVNb2RlbENsYXNzIH0gPSByZWxhdGlvblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWQgb2YgW2pvaW5UYWJsZU1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbENsYXNzXSkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgc2VsZi1yZWZlcmVuY2VzIGFuZCBnZW5lcmF0ZWQgam9pbiBtb2RlbHM6XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWQgJiYgcmVsYXRlZCAhPT0gbW9kZWxDbGFzcyAmJiBtb2RlbHNbcmVsYXRlZC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgc29ydEJ5UmVsYXRpb25zKFtyZWxhdGVkXSwgY29sbGVjdGVkLCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgbW9kZWxDbGFzcyB0byBwcmV2ZW50IGVuZGxlc3MgcmVjdXJzaW9uczpcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdOiBtb2RlbENsYXNzLFxuICAgICAgICAgICAgICAgICAgICAuLi5leGNsdWRlZFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdGVkW25hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb2xsZWN0ZWQpXG4gICAgfVxuICAgIC8vIFJldHVybiBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc29ydGVkIG1vZGVscyBhcyBpdHMga2V5L3ZhbHVlIHBhaXJzLlxuICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gcmV2ZXJzZSBmb3IgdGhlIGFib3ZlIGFsZ29yaXRobSB0byBzb3J0IHByb3Blcmx5LFxuICAgIC8vIGFuZCB0aGVuIHJldmVyc2UgdGhlIHJlc3VsdCBiYWNrLlxuICAgIHJldHVybiBzb3J0QnlSZWxhdGlvbnMoT2JqZWN0LnZhbHVlcyhtb2RlbHMpLnJldmVyc2UoKSkucmV2ZXJzZSgpLnJlZHVjZShcbiAgICAgIChtb2RlbHMsIG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIHJldHVybiBtb2RlbHNcbiAgICAgIH0sXG4gICAgICBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgKVxuICB9XG5cbiAgZ2V0TW9kZWwobmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGVsc1tuYW1lXSB8fFxuICAgICAgIW5hbWUuZW5kc1dpdGgoJ01vZGVsJykgJiYgdGhpcy5tb2RlbHNbYCR7bmFtZX1Nb2RlbGBdIHx8XG4gICAgICBudWxsXG4gICAgKVxuICB9XG5cbiAgZmluZE1vZGVsKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBhZGRTZXJ2aWNlcyhzZXJ2aWNlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHNlcnZpY2VdIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgICAgLy8gSGFuZGxlIEVTNiBtb2R1bGUgd2VpcmRuZXNzIHRoYXQgY2FuIGhhcHBlbiwgYXBwYXJlbnRseTpcbiAgICAgIGlmIChuYW1lID09PSAnZGVmYXVsdCcgJiYgaXNQbGFpbk9iamVjdChzZXJ2aWNlKSkge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpIHtcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoU2VydmljZS5pc1Byb3RvdHlwZU9mKHNlcnZpY2UpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc2VydmljZSA9IG5ldyBzZXJ2aWNlKHRoaXMsIG5hbWUpXG4gICAgfVxuICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2U6ICR7c2VydmljZX1gKVxuICAgIH1cbiAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIGBzZXJ2aWNlLm5hbWVgIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgICAvLyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGUuZy4gd2l0aCBhbiBhZnRlci1jb25zdHJ1Y3RvciBjbGFzcyBwcm9wZXJ0eS5cbiAgICAoeyBuYW1lIH0gPSBzZXJ2aWNlKVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZpY2VzW25hbWVdXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gbWlzc2luZyBmb3Igc2VydmljZSAnJHtuYW1lfSdgKVxuICAgIH1cbiAgICAvLyBBcyBhIGNvbnZlbnRpb24sIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgc2VydmljZSBjYW4gYmUgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyBpbiBvcmRlciB0byBlbnRpcmVseSBkZWFjdGl2YXRlIHRoZSBzZXJ2aWNlLlxuICAgIGlmIChjb25maWcgIT09IGZhbHNlKSB7XG4gICAgICBzZXJ2aWNlLnNldHVwKGNvbmZpZylcbiAgICAgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBzZXJ2aWNlXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgc2VydmljZSBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgICAvLyBvdmVycmlkZGVuIGJ5IHNlcnZpY2VzLlxuICAgICAgc2VydmljZS5pbml0aWFsaXplKClcbiAgICB9XG4gIH1cblxuICBnZXRTZXJ2aWNlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBmaW5kU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBmb3JFYWNoU2VydmljZShjYWxsYmFjaykge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKHRoaXMuc2VydmljZXMpLm1hcChjYWxsYmFjaykpXG4gIH1cblxuICBhZGRDb250cm9sbGVycyhjb250cm9sbGVycywgbmFtZXNwYWNlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udHJvbGxlcnMpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVycyh2YWx1ZSwgbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfS8ke2tleX1gIDoga2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sbGVyKHZhbHVlLCBuYW1lc3BhY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyLCBuYW1lc3BhY2UpIHtcbiAgICAvLyBDb250cm9sbGVycyByZXF1aXJlIGFkZGl0aW9uYWwgbWlkZGxld2FyZSB0byBiZSBpbnN0YWxsZWQgb25jZS5cbiAgICB0aGlzLnNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKVxuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChDb250cm9sbGVyLmlzUHJvdG90eXBlT2YoY29udHJvbGxlcikpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBjb250cm9sbGVyID0gbmV3IGNvbnRyb2xsZXIodGhpcywgbmFtZXNwYWNlKVxuICAgIH1cbiAgICBpZiAoIShjb250cm9sbGVyIGluc3RhbmNlb2YgQ29udHJvbGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9YClcbiAgICB9XG4gICAgLy8gSW5oZXJpdGFuY2Ugb2YgYWN0aW9uIG1ldGhvZHMgY2Fubm90IGhhcHBlbiBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmLFxuICAgIC8vIHNvIGNhbGwgc2VwYXJhdGUgYHNldHVwKClgIG1ldGhvZCBhZnRlciBpbiBvcmRlciB0byB0YWtlIGNhcmUgb2YgaXQuXG4gICAgY29udHJvbGxlci5zZXR1cCgpXG4gICAgdGhpcy5jb250cm9sbGVyc1tjb250cm9sbGVyLnVybF0gPSBjb250cm9sbGVyXG4gICAgLy8gTm93IHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgIC8vIG92ZXJyaWRkZW4gYnkgY29udHJvbGxlcnMuXG4gICAgY29udHJvbGxlci5pbml0aWFsaXplKClcbiAgICAvLyBFYWNoIGNvbnRyb2xsZXIgY2FuIGFsc28gcHJvdmlkZSBmdXJ0aGVyIG1pZGRsZXdhcmUsIGUuZy5cbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYDpcbiAgICBjb25zdCBtaWRkbGV3YXJlID0gY29udHJvbGxlci5jb21wb3NlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gIH1cblxuICBnZXRDb250cm9sbGVyKHVybCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzW3VybF0gfHwgbnVsbFxuICB9XG5cbiAgZmluZENvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbnRyb2xsZXJzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZ2V0QWRtaW5Db250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmRDb250cm9sbGVyKFxuICAgICAgY29udHJvbGxlciA9PiBjb250cm9sbGVyIGluc3RhbmNlb2YgQWRtaW5Db250cm9sbGVyXG4gICAgKVxuICB9XG5cbiAgZ2V0QWRtaW5WdWVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWRtaW5Db250cm9sbGVyKCk/LmdldFZ1ZUNvbmZpZygpIHx8IG51bGxcbiAgfVxuXG4gIGdldEFzc2V0Q29uZmlnKHtcbiAgICBtb2RlbHMgPSBPYmplY3Qua2V5cyh0aGlzLm1vZGVscyksXG4gICAgbm9ybWFsaXplRGJOYW1lcyA9IHRoaXMuY29uZmlnLmtuZXgubm9ybWFsaXplRGJOYW1lc1xuICB9ID0ge30pIHtcbiAgICBjb25zdCBhc3NldENvbmZpZyA9IHt9XG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgb2YgbW9kZWxzKSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5tb2RlbHNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgeyBhc3NldHMgfSA9IG1vZGVsQ2xhc3MuZGVmaW5pdGlvblxuICAgICAgaWYgKGFzc2V0cykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTW9kZWxOYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG1vZGVsTmFtZSlcbiAgICAgICAgICA6IG1vZGVsTmFtZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRBc3NldHMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFthc3NldERhdGFQYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGFzc2V0cykpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfSA9IG1vZGVsQ2xhc3MuZ2V0UHJvcGVydHlPclJlbGF0aW9uQXREYXRhUGF0aChhc3NldERhdGFQYXRoKVxuICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVJZGVudGlmaWVyKG5hbWUpXG4gICAgICAgICAgICAgIDogbmFtZVxuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBub3JtYWxpemVEYXRhUGF0aChbXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAuLi5wYXJzZURhdGFQYXRoKG5lc3RlZERhdGFQYXRoKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0Q29uZmlncyA9IGNvbnZlcnRlZEFzc2V0c1tub3JtYWxpemVkTmFtZV0gfHw9IHt9XG4gICAgICAgICAgICBhc3NldENvbmZpZ3NbZGF0YVBhdGhdID0gY29uZmlnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVzdGVkIGdyYXBoIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXRDb25maWdbbm9ybWFsaXplZE1vZGVsTmFtZV0gPSBjb252ZXJ0ZWRBc3NldHNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0Q29uZmlnXG4gIH1cblxuICBhZGRTdG9yYWdlcyhzdG9yYWdlcykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmFnZXMpKSB7XG4gICAgICB0aGlzLmFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN0b3JhZ2UoY29uZmlnLCBuYW1lKSB7XG4gICAgbGV0IHN0b3JhZ2UgPSBudWxsXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3RvcmFnZUNsYXNzID0gU3RvcmFnZS5nZXQoY29uZmlnLnR5cGUpXG4gICAgICBpZiAoIXN0b3JhZ2VDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN0b3JhZ2U6ICR7Y29uZmlnfWApXG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgc3RvcmFnZSA9IG5ldyBzdG9yYWdlQ2xhc3ModGhpcywgY29uZmlnKVxuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RvcmFnZSkge1xuICAgICAgc3RvcmFnZSA9IGNvbmZpZ1xuICAgIH1cbiAgICBpZiAoc3RvcmFnZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc3RvcmFnZS5uYW1lID0gbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlc1tzdG9yYWdlLm5hbWVdID0gc3RvcmFnZVxuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZVxuICB9XG5cbiAgZ2V0U3RvcmFnZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgY29tcGlsZVZhbGlkYXRvcihqc29uU2NoZW1hLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGpzb25TY2hlbWFcbiAgICAgID8gdGhpcy52YWxpZGF0b3IuY29tcGlsZShqc29uU2NoZW1hLCBvcHRpb25zKVxuICAgICAgOiBudWxsXG4gIH1cblxuICBjb21waWxlUGFyYW1ldGVyc1ZhbGlkYXRvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBsaXN0ID0gW11cbiAgICBjb25zdCB7IGRhdGFOYW1lID0gJ2RhdGEnIH0gPSBvcHRpb25zXG5cbiAgICBsZXQgcHJvcGVydGllcyA9IG51bGxcbiAgICBjb25zdCBhZGRQYXJhbWV0ZXIgPSAobmFtZSwgc2NoZW1hKSA9PiB7XG4gICAgICBsaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lID8/IG51bGwsXG4gICAgICAgIC4uLnNjaGVtYVxuICAgICAgfSlcbiAgICAgIGlmICghc2NoZW1hLm1lbWJlcikge1xuICAgICAgICBwcm9wZXJ0aWVzIHx8PSB7fVxuICAgICAgICBwcm9wZXJ0aWVzW25hbWUgfHwgZGF0YU5hbWVdID0gc2NoZW1hXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydCB0d28gZm9ybWF0cyBvZiBwYXJhbWV0ZXJzIGRlZmluaXRpb25zOlxuICAgIC8vIC0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZWlyIGBuYW1lYCBrZXkuXG4gICAgLy8gLSBBbiBvYmplY3Qgb2YgcGFyYW1ldGVyIHNjaGVtYXMsIG5hbWVkIGJ5IHRoZSBrZXkgdW5kZXIgd2hpY2ggZWFjaFxuICAgIC8vICAgc2NoZW1hIGlzIHN0b3JlZCBpbiB0aGUgcm9vdCBvYmplY3QuXG4gICAgLy8gSWYgYW4gYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBjb250cm9sbGVyIGFjdGlvbnMgcmVjZWl2ZXMgdGhlXG4gICAgLy8gcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBhcmd1bWVudHMuIElmIGFuIG9iamVjdCBpcyBwYXNzZWQsIHRoZW4gdGhlXG4gICAgLy8gYWN0aW9ucyByZWNlaXZlcyBvbmUgcGFyYW1ldGVyIG9iamVjdCB3aGVyZSB1bmRlciB0aGUgc2FtZSBrZXlzIHRoZVxuICAgIC8vIHNwZWNpZmllZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBzdG9yZWQuXG4gICAgbGV0IGFzT2JqZWN0ID0gZmFsc2VcbiAgICBpZiAoaXNBcnJheShwYXJhbWV0ZXJzKSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIC4uLnNjaGVtYSB9IG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBhcmFtZXRlcnMpKSB7XG4gICAgICBhc09iamVjdCA9IHRydWVcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpIHtcbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXJzIGRlZmluaXRpb246ICR7cGFyYW1ldGVyc31gKVxuICAgIH1cbiAgICAvLyBOT1RFOiBJZiBwcm9wZXJ0aWVzIGlzIG51bGwsIHNjaGVtYSBhbmQgdmFsaWRhdGUgd2lsbCBiZWNvbWUgbnVsbCB0b28uXG4gICAgLy8gTk9URTogSWYgaXQgaXMgbm90IG51bGwsIGl0IHdpbGwgZ2V0IGV4cGFuZGVkIHRvIGFuIG9iamVjdCBzY2hlbWEuXG4gICAgY29uc3Qgc2NoZW1hID0gY29udmVydFNjaGVtYShwcm9wZXJ0aWVzLCBvcHRpb25zKVxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5jb21waWxlVmFsaWRhdG9yKHNjaGVtYSwge1xuICAgICAgLy8gRm9yIHBhcmFtZXRlcnMsIGFsd2F5cyBjb2VyY2UgdHlwZXMsIGluY2x1ZGluZyBhcnJheXMuXG4gICAgICBjb2VyY2VUeXBlczogJ2FycmF5JyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgIGFwcDogdGhpcyxcbiAgICAgIHZhbGlkYXRvcjogdGhpcy52YWxpZGF0b3IsXG4gICAgICBvcHRpb25zXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsaXN0LFxuICAgICAgc2NoZW1hLFxuICAgICAgYXNPYmplY3QsXG4gICAgICBkYXRhTmFtZSxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxuICAgICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBjdHggYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgICAgPyBkYXRhID0+IHZhbGlkYXRlLmNhbGwoY3R4LCBkYXRhKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH1cblxuICBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMsIG9wdGlvbnMsIGpzb24gfSkge1xuICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgIHR5cGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZXJyb3JzOiB0aGlzLnZhbGlkYXRvci5wYXJzZUVycm9ycyhlcnJvcnMsIG9wdGlvbnMpLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHRoZSBKU09OIGRhdGEgaW4gdGhlIGVycm9yIGlmIGBsb2cuZXJyb3JzLmpzb25gaXMgc2V0LlxuICAgICAganNvbjogdGhpcy5jb25maWcubG9nLmVycm9ycz8uanNvbiA/IGpzb24gOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgY3JlYXRlRGF0YWJhc2VFcnJvcihlcnJvcikge1xuICAgIC8vIFJlbW92ZSBrbmV4IFNRTCBxdWVyeSBhbmQgbW92ZSB0byBzZXBhcmF0ZSBgc3FsYCBwcm9wZXJ0eS5cbiAgICAvLyBUT0RPOiBGaXggdGhpcyBwcm9wZXJseSBpbiBLbmV4IC8gT2JqZWN0aW9uIGluc3RlYWQsIHNlZTpcbiAgICAvLyBodHRwczovL2dpdHRlci5pbS9WaW5jaXQvb2JqZWN0aW9uLmpzP2F0PTVhNjg3MjhmNWE5ZWJlNGY3NWNhNDBiMFxuICAgIGNvbnN0IFssIHNxbCwgbWVzc2FnZV0gPSBlcnJvci5tZXNzYWdlLm1hdGNoKC9eKFtcXHNcXFNdKikgLSAoW1xcc1xcU10qPykkLykgfHxcbiAgICAgIFtudWxsLCBudWxsLCBlcnJvci5tZXNzYWdlXVxuICAgIHJldHVybiBuZXcgRGF0YWJhc2VFcnJvcihlcnJvciwge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSB0aGUgU1FMIHF1ZXJ5IGluIHRoZSBlcnJvciBpZiBgbG9nLmVycm9ycy5zcWxgaXMgc2V0LlxuICAgICAgc3FsOiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zcWwgPyBzcWwgOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgc2V0dXBHbG9iYWxNaWRkbGV3YXJlKCkge1xuICAgIGNvbnN0IHsgYXBwLCBsb2cgfSA9IHRoaXMuY29uZmlnXG5cbiAgICB0aGlzLnVzZShhdHRhY2hMb2dnZXIodGhpcy5sb2dnZXIpKVxuXG4gICAgaWYgKGFwcC5yZXNwb25zZVRpbWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShyZXNwb25zZVRpbWUoZ2V0T3B0aW9ucyhhcHAucmVzcG9uc2VUaW1lKSkpXG4gICAgfVxuICAgIGlmIChsb2cucmVxdWVzdHMpIHtcbiAgICAgIHRoaXMudXNlKGxvZ1JlcXVlc3RzKCkpXG4gICAgfVxuICAgIC8vIE5lZWRzIHRvIGJlIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgbG9nZ2VyIHRvIGxvZyB0aGUgY29ycmVjdFxuICAgIC8vIHJlc3BvbnNlIHN0YXR1cy5cbiAgICB0aGlzLnVzZShoYW5kbGVFcnJvcigpKVxuICAgIGlmIChhcHAuaGVsbWV0ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoaGVsbWV0KGdldE9wdGlvbnMoYXBwLmhlbG1ldCkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmNvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb3JzKGdldE9wdGlvbnMoYXBwLmNvcnMpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb21wcmVzcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvbXByZXNzKG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgLy8gVXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGZvciBCcm90bGkgY29tcHJlc3Npb24uXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rb2Fqcy9jb21wcmVzcy9pc3N1ZXMvMTI2XG4gICAgICAgICAgYnI6IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBbemxpYi5jb25zdGFudHMuQlJPVExJX1BBUkFNX1FVQUxJVFldOiA0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRPcHRpb25zKGFwcC5jb21wcmVzcylcbiAgICAgICkpKVxuICAgIH1cbiAgICBpZiAoYXBwLmV0YWcgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb25kaXRpb25hbCgpKVxuICAgICAgdGhpcy51c2UoZXRhZygpKVxuICAgIH1cbiAgfVxuXG4gIHNldHVwQ29udHJvbGxlck1pZGRsZXdhcmUoKSB7XG4gICAgLy8gTk9URTogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgYXV0b21hdGljIGBzZXR1cEdsb2JhbE1pZGRsZXdhcmUoKWAgc28gdGhhdFxuICAgIC8vIGFwcHMgY2FuIHNldCB1cCB0aGUgc3RhdGljIHNlcnZpbmcgb2YgYXNzZXRzIGJlZm9yZSBpbnN0YWxsaW5nIHRoZVxuICAgIC8vIHNlc3Npb24gYW5kIHBhc3Nwb3J0IG1pZGRsZXdhcmUuIEl0IGlzIGNhbGxlZCBmcm9tIGBhZGRDb250cm9sbGVyKClgLlxuICAgIC8vIFVzZSBhIGZsYWcgdG8gb25seSBpbnN0YWxsIHRoZSBtaWRkbGV3YXJlIG9uY2U6XG4gICAgaWYgKCF0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlKSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gdGhpcy5jb25maWdcbiAgICAgIC8vIFNlcXVlbmNlIGlzIGltcG9ydGFudDpcbiAgICAgIC8vIDEuIGJvZHkgcGFyc2VyXG4gICAgICB0aGlzLnVzZShib2R5UGFyc2VyKGdldE9wdGlvbnMoYXBwLmJvZHlQYXJzZXIpKSlcbiAgICAgIC8vIDIuIGZpbmQgcm91dGUgZnJvbSByb3V0ZXMgaW5zdGFsbGVkIGJ5IGNvbnRyb2xsZXJzLlxuICAgICAgdGhpcy51c2UoZmluZFJvdXRlKHRoaXMucm91dGVyKSlcbiAgICAgIC8vIDMuIHJlc3BlY3QgdHJhbnNhY3RlZCBzZXR0aW5ncywgY3JlYXRlIGFuZCBoYW5kbGUgdHJhbnNhY3Rpb25zLlxuICAgICAgdGhpcy51c2UoY3JlYXRlVHJhbnNhY3Rpb24oKSlcbiAgICAgIC8vIDQuIHNlc3Npb25cbiAgICAgIGlmIChhcHAuc2Vzc2lvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0gPSBnZXRPcHRpb25zKGFwcC5zZXNzaW9uKVxuICAgICAgICBpZiAobW9kZWxDbGFzcykge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIENvbnRleHRTdG9yZSB0aGF0IHJlc29sdmVkIHRoZSBzcGVjaWZpZWQgbW9kZWwgY2xhc3MsXG4gICAgICAgICAgLy8gdXNlcyBpdCB0byBwZXJzaXN0IGFuZCByZXRyaWV2ZSB0aGUgc2Vzc2lvbiwgYW5kIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAvLyBiaW5kcyBhbGwgZGIgb3BlcmF0aW9ucyB0byBgY3R4LnRyYW5zYWN0aW9uYCwgaWYgaXQgaXMgc2V0LlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICAgICAgb3B0aW9ucy5Db250ZXh0U3RvcmUgPSBTZXNzaW9uU3RvcmUobW9kZWxDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZShzZXNzaW9uKG9wdGlvbnMsIHRoaXMpKVxuICAgICAgfVxuICAgICAgLy8gNS4gcGFzc3BvcnRcbiAgICAgIGlmIChhcHAucGFzc3BvcnQpIHtcbiAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuaW5pdGlhbGl6ZSgpKVxuICAgICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgICB0aGlzLnVzZShwYXNzcG9ydC5zZXNzaW9uKCkpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2UoaGFuZGxlVXNlcigpKVxuICAgICAgfVxuXG4gICAgICAvLyA2LiBmaW5hbGx5IGhhbmRsZSB0aGUgZm91bmQgcm91dGUsIG9yIHNldCBzdGF0dXMgLyBhbGxvdyBhY2NvcmRpbmdseS5cbiAgICAgIHRoaXMudXNlKGhhbmRsZVJvdXRlKCkpXG4gICAgICB0aGlzLmhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHNldHVwTG9nZ2VyKCkge1xuICAgIGNvbnN0IHsgZXJyLCByZXEsIHJlcyB9ID0gcGluby5zdGRTZXJpYWxpemVyc1xuICAgIC8vIE9ubHkgaW5jbHVkZSBgaWRgIGZyb20gdGhlIHVzZXIsIHRvIG5vdCBpbmFkdmVydGVudGx5IGxvZyBQSUkuXG4gICAgY29uc3QgdXNlciA9IHVzZXIgPT4gKHsgaWQ6IHVzZXIuaWQgfSlcbiAgICBjb25zdCBzZXJpYWxpemVycyA9IHsgZXJyLCByZXEsIHJlcywgdXNlciB9XG5cbiAgICBjb25zdCBsb2dnZXIgPSBwaW5vKG1lcmdlKFxuICAgICAge1xuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBzZXJpYWxpemVycyxcbiAgICAgICAgcHJldHR5UHJpbnQ6IHtcbiAgICAgICAgICAvLyBMaXN0IG9mIGtleXMgdG8gaWdub3JlIGluIHByZXR0eSBtb2RlLlxuICAgICAgICAgIGlnbm9yZTogJ3JlcSxyZXMsZHVyYXRpb25Ncyx1c2VyLHJlcXVlc3RJZCcsXG4gICAgICAgICAgLy8gU1lTIHRvIHVzZSBzeXN0ZW0gdGltZSBhbmQgbm90IFVUQy5cbiAgICAgICAgICB0cmFuc2xhdGVUaW1lOiAnU1lTOkhIOk1NOnNzLmwnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlZGFjdCBjb21tb24gc2Vuc2l0aXZlIGhlYWRlcnMuXG4gICAgICAgIHJlZGFjdDogW1xuICAgICAgICAgICcqLmhlYWRlcnNbXCJjb29raWVcIl0nLFxuICAgICAgICAgICcqLmhlYWRlcnNbXCJzZXQtY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXSdcbiAgICAgICAgXSxcbiAgICAgICAgYmFzZTogbnVsbCAvLyBubyBwaWQsaG9zdG5hbWUsbmFtZVxuICAgICAgfSxcbiAgICAgIGdldE9wdGlvbnModGhpcy5jb25maWcubG9nZ2VyKVxuICAgICkpXG5cbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlci5jaGlsZCh7IG5hbWU6ICdhcHAnIH0pXG4gIH1cblxuICBzZXR1cEtuZXgoKSB7XG4gICAgbGV0IHsga25leCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmIChrbmV4Py5jbGllbnQpIHtcbiAgICAgIGNvbnN0IHNuYWtlQ2FzZU9wdGlvbnMgPSBrbmV4Lm5vcm1hbGl6ZURiTmFtZXMgPT09IHRydWVcbiAgICAgICAgPyB7fVxuICAgICAgICA6IGtuZXgubm9ybWFsaXplRGJOYW1lc1xuICAgICAgaWYgKHNuYWtlQ2FzZU9wdGlvbnMpIHtcbiAgICAgICAga25leCA9IHtcbiAgICAgICAgICAuLi5rbmV4LFxuICAgICAgICAgIC4uLmtuZXhTbmFrZUNhc2VNYXBwZXJzKHNuYWtlQ2FzZU9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leCA9IEtuZXgoa25leClcbiAgICAgIGlmIChsb2cuc3FsKSB7XG4gICAgICAgIHRoaXMuc2V0dXBLbmV4TG9nZ2luZygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0dXBLbmV4TG9nZ2luZygpIHtcbiAgICBjb25zdCBzdGFydFRpbWVzID0ge31cbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5jaGlsZCh7IG5hbWU6ICdzcWwnIH0pXG4gICAgZnVuY3Rpb24gZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlLCBlcnJvciB9KSB7XG4gICAgICBjb25zdCBpZCA9IHF1ZXJ5Ll9fa25leFF1ZXJ5VWlkXG4gICAgICBjb25zdCBkaWZmID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnRUaW1lc1tpZF0pXG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGRpZmZbMF0gKiAxZTMgKyBkaWZmWzFdIC8gMWU2XG4gICAgICBkZWxldGUgc3RhcnRUaW1lc1tpZF1cbiAgICAgIGNvbnN0IHsgc3FsLCBiaW5kaW5ncyB9ID0gcXVlcnlcbiAgICAgIHJlc3BvbnNlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZSkuZmlsdGVyKFxuICAgICAgICAgIChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdfJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgbG9nZ2VyLmluZm8oeyBkdXJhdGlvbiwgYmluZGluZ3MsIHJlc3BvbnNlLCBlcnJvciB9LCBzcWwpXG4gICAgfVxuXG4gICAgdGhpcy5rbmV4XG4gICAgICAub24oJ3F1ZXJ5JywgcXVlcnkgPT4ge1xuICAgICAgICBzdGFydFRpbWVzW3F1ZXJ5Ll9fa25leFF1ZXJ5VWlkXSA9IHByb2Nlc3MuaHJ0aW1lKClcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LXJlc3BvbnNlJywgKHJlc3BvbnNlLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgcmVzcG9uc2UgfSlcbiAgICAgIH0pXG4gICAgICAub24oJ3F1ZXJ5LWVycm9yJywgKGVycm9yLCBxdWVyeSkgPT4ge1xuICAgICAgICBlbmQocXVlcnksIHsgZXJyb3IgfSlcbiAgICAgIH0pXG4gIH1cblxuICBub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LmNsaWVudC53cmFwSWRlbnRpZmllcihpZGVudGlmaWVyKS5yZXBsYWNlKC9bJ2BcIl0vZywgJycpXG4gIH1cblxuICBkZW5vcm1hbGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMua25leC5jbGllbnQucG9zdFByb2Nlc3NSZXNwb25zZSh7IFtpZGVudGlmaWVyXTogMSB9KVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopWzBdXG4gIH1cblxuICBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBwLm5vcm1hbGl6ZVBhdGhzID8gaHlwaGVuYXRlKHBhdGgpIDogcGF0aFxuICB9XG5cbiAgZm9ybWF0RXJyb3IoZXJyKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVyci50b0pTT05cbiAgICAgID8gZm9ybWF0SnNvbihlcnIudG9KU09OKCkpXG4gICAgICA6IGVyci5tZXNzYWdlIHx8IGVyclxuICAgIGNvbnN0IHN0ciA9IGAke2Vyci5uYW1lfTogJHttZXNzYWdlfWBcbiAgICByZXR1cm4gZXJyLnN0YWNrICYmIHRoaXMuY29uZmlnLmxvZy5lcnJvcnM/LnN0YWNrICE9PSBmYWxzZVxuICAgICAgPyBgJHtzdHJ9XFxuJHtlcnIuc3RhY2suc3BsaXQoL1xcbnxcXHJcXG58XFxyLykuc2xpY2UoMSkuam9pbihvcy5FT0wpfWBcbiAgICAgIDogc3RyXG4gIH1cblxuICBsb2dFcnJvcihlcnIsIGN0eCkge1xuICAgIGlmICghZXJyLmV4cG9zZSAmJiAhdGhpcy5zaWxlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmZvcm1hdEVycm9yKGVycilcbiAgICAgICAgY29uc3QgbGV2ZWwgPVxuICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFJlc3BvbnNlRXJyb3IgJiYgZXJyLnN0YXR1cyA8IDUwMCA/ICdpbmZvJyA6ICdlcnJvcidcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY3R4Py5sb2dnZXIgfHwgdGhpcy5sb2dnZXJcbiAgICAgICAgbG9nZ2VyW2xldmVsXSh0ZXh0KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgbG9nIGVycm9yJywgZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5jb25maWcubG9nLmVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMub24oJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RhcnQnKVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0YXJ0KCkpXG4gICAgY29uc3Qge1xuICAgICAgc2VydmVyOiB7IGhvc3QsIHBvcnQgfSxcbiAgICAgIGVudlxuICAgIH0gPSB0aGlzLmNvbmZpZ1xuICAgIHRoaXMuc2VydmVyID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5saXN0ZW4ocG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHBvcnQgfSA9IHNlcnZlci5hZGRyZXNzKClcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGAke2Vudn0gc2VydmVyIHN0YXJ0ZWQgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fWBcbiAgICAgICAgKVxuICAgICAgICByZXNvbHZlKHNlcnZlcilcbiAgICAgIH0pXG4gICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBVbmFibGUgdG8gc3RhcnQgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYWZ0ZXI6c3RhcnQnKVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2JlZm9yZTpzdG9wJylcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHsgc2VydmVyIH0gPSB0aGlzXG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHNlcnZlci5jbG9zZShlcnIgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC8vIEhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2xvc2UgdGhlIHNlcnZlcixcbiAgICAgICAgLy8gIGV2ZW4gaWYgc29ja2V0cyBhcmUgc3RpbGwgb3Blbi5cbiAgICAgICAgLy8gIFRha2VuIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM2ODMwMDcyLlxuICAgICAgICAvLyAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgYmUgdG8gdXNlIGEgbGlicmFyeSwgZXg6IGh0dHBzOi8vZ2l0aHViLmNvbS9nb2RhZGR5L3Rlcm1pbnVzXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiBzZXJ2ZXIuZW1pdCgnY2xvc2UnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1NlcnZlciBpcyBub3QgcnVubmluZycpKVxuICAgICAgfVxuICAgIH0pXG4gICAgYXdhaXQgdGhpcy5mb3JFYWNoU2VydmljZShzZXJ2aWNlID0+IHNlcnZpY2Uuc3RvcCgpKVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYWZ0ZXI6c3RvcCcpXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9mZignZXJyb3InLCB0aGlzLmxvZ0Vycm9yKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0T3JFeGl0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0KClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoZXJyKVxuICAgICAgcHJvY2Vzcy5leGl0KC0xKVxuICAgIH1cbiAgfVxuXG4gIC8vIEFzc2V0cyBoYW5kbGluZ1xuXG4gIGFzeW5jIGNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBmaWxlcywgY291bnQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgY29uc3QgYXNzZXRzID0gZmlsZXMubWFwKGZpbGUgPT4gKHtcbiAgICAgICAga2V5OiBmaWxlLmtleSxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgc3RvcmFnZTogc3RvcmFnZS5uYW1lLFxuICAgICAgICBjb3VudFxuICAgICAgfSkpXG4gICAgICByZXR1cm4gQXNzZXRNb2RlbFxuICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAuaW5zZXJ0KGFzc2V0cylcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUFkZGRlZEFuZFJlbW92ZWRBc3NldHMoXG4gICAgc3RvcmFnZSxcbiAgICBhZGRlZEZpbGVzLFxuICAgIHJlbW92ZWRGaWxlcyxcbiAgICB0cnggPSBudWxsXG4gICkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFzc2V0czoge1xuICAgICAgICBjbGVhbnVwVGltZVRocmVzaG9sZCA9IDBcbiAgICAgIH0gPSB7fVxuICAgIH0gPSB0aGlzLmNvbmZpZ1xuICAgIC8vIE9ubHkgcmVtb3ZlIHVudXNlZCBhc3NldHMgdGhhdCBoYXZlbid0IHNlZW4gY2hhbmdlcyBmb3IgZ2l2ZW4gdGltZWZyYW1lLlxuICAgIGNvbnN0IHRpbWVUaHJlc2hvbGQgPSBpc1N0cmluZyhjbGVhbnVwVGltZVRocmVzaG9sZClcbiAgICAgID8gcGFyc2VEdXJhdGlvbihjbGVhbnVwVGltZVRocmVzaG9sZClcbiAgICAgIDogY2xlYW51cFRpbWVUaHJlc2hvbGRcblxuICAgIGNvbnN0IGltcG9ydGVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGltcG9ydGVkRmlsZXMucHVzaChcbiAgICAgICAgLi4uYXdhaXQgdGhpcy5hZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGFkZGVkRmlsZXMsIHRyeClcbiAgICAgIClcbiAgICAgIGlmIChcbiAgICAgICAgYWRkZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgIHJlbW92ZWRGaWxlcy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY2hhbmdlQ291bnQgPSAoZmlsZXMsIGluY3JlbWVudCkgPT4gKFxuICAgICAgICAgIGZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBBc3NldE1vZGVsLnF1ZXJ5KHRyeClcbiAgICAgICAgICAgIC53aGVyZUluKCdrZXknLCBmaWxlcy5tYXAoZmlsZSA9PiBmaWxlLmtleSkpXG4gICAgICAgICAgICAuaW5jcmVtZW50KCdjb3VudCcsIGluY3JlbWVudClcbiAgICAgICAgKVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgY2hhbmdlQ291bnQoYWRkZWRGaWxlcywgMSksXG4gICAgICAgICAgY2hhbmdlQ291bnQocmVtb3ZlZEZpbGVzLCAtMSlcbiAgICAgICAgXSlcbiAgICAgICAgaWYgKHRpbWVUaHJlc2hvbGQgPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgIC8vIERvbid0IHBhc3MgYHRyeGAgaGVyZSwgYXMgd2Ugd2FudCB0aGlzIGRlbGF5ZWQgZXhlY3V0aW9uIHRvXG4gICAgICAgICAgICAvLyBjcmVhdGUgaXRzIG93biB0cmFuc2FjdGlvbi5cbiAgICAgICAgICAgICgpID0+IHRoaXMucmVsZWFzZVVudXNlZEFzc2V0cyh0aW1lVGhyZXNob2xkKSxcbiAgICAgICAgICAgIHRpbWVUaHJlc2hvbGRcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFsc28gZXhlY3V0ZSByZWxlYXNlVW51c2VkQXNzZXRzKCkgaW1tZWRpYXRlbHkgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHRyYW5zYWN0aW9uLCB0byBwb3RlbnRpYWxseSBjbGVhbiB1cCBvdGhlciBwZW5kaW5nIGFzc2V0cy5cbiAgICAgIGF3YWl0IHRoaXMucmVsZWFzZVVudXNlZEFzc2V0cyh0aW1lVGhyZXNob2xkLCB0cngpXG4gICAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZEZvcmVpZ25Bc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICAvLyBGaW5kIG1pc3NpbmcgYXNzZXRzIChjb3BpZWQgZnJvbSBhbm90aGVyIHN5c3RlbSksIGFuZCBhZGQgdGhlbS5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBBc3NldE1vZGVsLnF1ZXJ5KHRyeCkuZmluZE9uZSgna2V5JywgZmlsZS5rZXkpXG4gICAgICAgICAgaWYgKCFhc3NldCkge1xuICAgICAgICAgICAgaWYgKGZpbGUuZGF0YSB8fCBmaWxlLnVybCkge1xuICAgICAgICAgICAgICBsZXQgeyBkYXRhIH0gPSBmaWxlXG4gICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgICAgIGAke1xuICAgICAgICAgICAgICAgICAgICBjaGFsay5yZWQoJ0lORk86JylcbiAgICAgICAgICAgICAgICAgIH0gQXNzZXQgJHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oYCcke2ZpbGUubmFtZX0nYClcbiAgICAgICAgICAgICAgICAgIH0gaXMgZnJvbSBhIGZvcmVpZ24gc291cmNlLCBmZXRjaGluZyBmcm9tICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtmaWxlLnVybH0nYClcbiAgICAgICAgICAgICAgICAgIH0gYW5kIGFkZGluZyB0byBzdG9yYWdlICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGAnJHtzdG9yYWdlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9Li4uYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgICAgICAgICAgIHVybDogZmlsZS51cmwsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgaW1wb3J0ZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGRhdGEpXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQXNzZXRzKHN0b3JhZ2UsIFtpbXBvcnRlZEZpbGVdLCAwLCB0cngpXG4gICAgICAgICAgICAgIC8vIE1lcmdlIGJhY2sgdGhlIGNoYW5nZWQgZmlsZSBwcm9wZXJ0aWVzIGludG8gdGhlIGFjdHVhbCBmaWxlc1xuICAgICAgICAgICAgICAvLyBvYmplY3QsIHNvIHRoYXQgdGhlIGRhdGEgZnJvbSB0aGUgc3RhdGljIG1vZGVsIGhvb2sgY2FuIGJlIHVzZWRcbiAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgZm9yIHRoZSBhY3R1YWwgcnVubmluZyBxdWVyeS5cbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICAgIGltcG9ydGVkRmlsZXMucHVzaChpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGltcG9ydCBhc3NldCBmcm9tIGZvcmVpZ24gc291cmNlOiAnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUubmFtZVxuICAgICAgICAgICAgICAgIH0nICgnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUua2V5XG4gICAgICAgICAgICAgICAgfScpYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFzc2V0IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgYnV0IHdhcyBhbHJlYWR5IGltcG9ydGVkIGFuZCBjYW5cbiAgICAgICAgICAgIC8vIGJlIHJldXNlZC4gU2VlIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIG1lcmdlLlxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBhc3NldC5maWxlKVxuICAgICAgICAgICAgLy8gTk9URTogTm8gbmVlZCB0byBhZGQgYGZpbGVgIHRvIGBpbXBvcnRlZEZpbGVzYCwgc2luY2UgaXQnc1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBiZWVuIGltcG9ydGVkIHRvIHRoZSBzdG9yYWdlIGJlZm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRlZEZpbGVzXG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RpZmllZEFzc2V0cyhzdG9yYWdlLCBmaWxlcywgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IG1vZGlmaWVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgICAgaWYgKGZpbGUuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBBc3NldE1vZGVsLnF1ZXJ5KHRyeCkuZmluZE9uZSgna2V5JywgZmlsZS5rZXkpXG4gICAgICAgICAgICBpZiAoYXNzZXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpbGUgPSBhd2FpdCBzdG9yYWdlLmFkZEZpbGUoZmlsZSwgZmlsZS5kYXRhKVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICAgIG1vZGlmaWVkRmlsZXMucHVzaChjaGFuZ2VkRmlsZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gdXBkYXRlIG1vZGlmaWVkIGFzc2V0IGZyb20gbWVtb3J5IHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIG1vZGlmaWVkRmlsZXNcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCA9IDAsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICByZXR1cm4gQXNzZXRNb2RlbC50cmFuc2FjdGlvbih0cngsIGFzeW5jIHRyeCA9PiB7XG4gICAgICAgIC8vIERldGVybWluZSB0aGUgdGltZSB0aHJlc2hvbGQgaW4gSlMgaW5zdGVhZCBvZiBTUUwsIGFzIHRoZXJlIGlzIG5vXG4gICAgICAgIC8vIGVhc3kgY3Jvc3MtU1FMIHdheSB0byBkbyBgbm93KCkgLSBpbnRlcnZhbCBYIGhvdXJzYDpcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIHRpbWVUaHJlc2hvbGQpXG4gICAgICAgIGNvbnN0IG9ycGhhbmVkQXNzZXRzID0gYXdhaXQgQXNzZXRNb2RlbFxuICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgLndoZXJlKCdjb3VudCcsIDApXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPD0nLCBkYXRlKVxuICAgICAgICAgIC8vIFByb3RlY3QgZnJlc2hseSBjcmVhdGVkIGFzc2V0cyBmcm9tIGJlaW5nIGRlbGV0ZWQgYWdhaW4gcmlnaHQgYXdheSxcbiAgICAgICAgICAvLyAuZS5nLiB3aGVuIGBjb25maWcuYXNzZXRzLmNsZWFudXBUaW1lVGhyZXNob2xkID0gMGBcbiAgICAgICAgICAuYW5kV2hlcmUoJ3VwZGF0ZWRBdCcsICc+JywgcmVmKCdjcmVhdGVkQXQnKSlcbiAgICAgICAgaWYgKG9ycGhhbmVkQXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBvcnBoYW5lZEtleXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIG9ycGhhbmVkQXNzZXRzLm1hcChhc3luYyBhc3NldCA9PiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRTdG9yYWdlKGFzc2V0LnN0b3JhZ2UpLnJlbW92ZUZpbGUoYXNzZXQuZmlsZSlcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgICAgICAgYXNzZXQuZXJyb3IgPSBlcnJvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhc3NldC5rZXlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICAgIGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgIC53aGVyZUluKCdrZXknLCBvcnBoYW5lZEtleXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ycGhhbmVkQXNzZXRzXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vLyBPdmVycmlkZSBLb2EncyBldmVudHMgd2l0aCBvdXIgb3duIEV2ZW50RW1pdHRlciB0aGF0IGFkZHMgc3VwcG9ydCBmb3Jcbi8vIGFzeW5jaHJvbm91cyBldmVudHMuXG5FdmVudEVtaXR0ZXIubWl4aW4oQXBwbGljYXRpb24ucHJvdG90eXBlKVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHt9XG59XG4iXX0=
|
package/lib/app/SessionStore.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.default = void 0;
|
|
5
5
|
|
|
6
|
+
require("core-js/modules/es.error.cause.js");
|
|
7
|
+
|
|
6
8
|
var _default = modelName => class SessionStore {
|
|
7
9
|
constructor(ctx) {
|
|
8
10
|
this.ctx = ctx;
|
|
@@ -35,4 +37,4 @@ var _default = modelName => class SessionStore {
|
|
|
35
37
|
};
|
|
36
38
|
|
|
37
39
|
exports.default = _default;
|
|
38
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvU2Vzc2lvblN0b3JlLmpzIl0sIm5hbWVzIjpbIm1vZGVsTmFtZSIsIlNlc3Npb25TdG9yZSIsImNvbnN0cnVjdG9yIiwiY3R4IiwibW9kZWxDbGFzcyIsImFwcCIsIm1vZGVscyIsIkVycm9yIiwicXVlcnkiLCJ0cmFuc2FjdGlvbiIsImdldCIsImlkIiwic2Vzc2lvbiIsImZpbmRCeUlkIiwidmFsdWUiLCJzZXQiLCJ1cHNlcnQiLCJnZXRSZWZlcmVuY2UiLCJkZXN0cm95Iiwia2V5IiwiZGVsZXRlQnlJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztlQUFlQSxTQUFTLElBQUksTUFBTUMsWUFBTixDQUFtQjtBQUM3Q0MsRUFBQUEsV0FBVyxDQUFDQyxHQUFELEVBQU07QUFDZixTQUFLQSxHQUFMLEdBQVdBLEdBQVg7QUFDQSxTQUFLQyxVQUFMLEdBQWtCRCxHQUFHLENBQUNFLEdBQUosQ0FBUUMsTUFBUixDQUFlTixTQUFmLENBQWxCOztBQUNBLFFBQUksQ0FBQyxLQUFLSSxVQUFWLEVBQXNCO0FBQ3BCLFlBQU0sSUFBSUcsS0FBSixDQUFXLGdDQUErQlAsU0FBVSxHQUFwRCxDQUFOO0FBQ0Q7QUFDRjs7QUFFRFEsRUFBQUEsS0FBSyxHQUFHO0FBQ04sV0FBTyxLQUFLSixVQUFMLENBQWdCSSxLQUFoQixDQUFzQixLQUFLTCxHQUFMLENBQVNNLFdBQS9CLENBQVA7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNDLEVBQUQsRUFBSztBQUNaLFVBQU1DLE9BQU8sR0FBRyxNQUFNLEtBQUtKLEtBQUwsR0FBYUssUUFBYixDQUFzQkYsRUFBdEIsQ0FBdEI7QUFDQSxXQUFPLENBQUFDLE9BQU8sUUFBUCxZQUFBQSxPQUFPLENBQUVFLEtBQVQsS0FBa0IsRUFBekI7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNKLEVBQUQsRUFBS0csS0FBTCxFQUFZO0FBQ25CLFVBQU0sS0FBS04sS0FBTCxHQUNISyxRQURHLENBQ01GLEVBRE4sRUFFSEssTUFGRyxDQUVJLEVBQ04sR0FBRyxLQUFLWixVQUFMLENBQWdCYSxZQUFoQixDQUE2Qk4sRUFBN0IsQ0FERztBQUVORyxNQUFBQTtBQUZNLEtBRkosQ0FBTjtBQU1EOztBQUVZLFFBQVBJLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNO0FBQ2pCLFdBQU8sS0FBS1gsS0FBTCxHQUFhWSxVQUFiLENBQXdCRCxHQUF4QixDQUFQO0FBQ0Q7O0FBN0I0QyxDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgbW9kZWxOYW1lID0+IGNsYXNzIFNlc3Npb25TdG9yZSB7XG4gIGNvbnN0cnVjdG9yKGN0eCkge1xuICAgIHRoaXMuY3R4ID0gY3R4XG4gICAgdGhpcy5tb2RlbENsYXNzID0gY3R4LmFwcC5tb2RlbHNbbW9kZWxOYW1lXVxuICAgIGlmICghdGhpcy5tb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIG1vZGVsIGNsYXNzOiAnJHttb2RlbE5hbWV9J2ApXG4gICAgfVxuICB9XG5cbiAgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxDbGFzcy5xdWVyeSh0aGlzLmN0eC50cmFuc2FjdGlvbilcbiAgfVxuXG4gIGFzeW5jIGdldChpZCkge1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpXG4gICAgcmV0dXJuIHNlc3Npb24/LnZhbHVlIHx8IHt9XG4gIH1cblxuICBhc3luYyBzZXQoaWQsIHZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeSgpXG4gICAgICAuZmluZEJ5SWQoaWQpXG4gICAgICAudXBzZXJ0KHtcbiAgICAgICAgLi4udGhpcy5tb2RlbENsYXNzLmdldFJlZmVyZW5jZShpZCksXG4gICAgICAgIHZhbHVlXG4gICAgICB9KVxuICB9XG5cbiAgYXN5bmMgZGVzdHJveShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLmRlbGV0ZUJ5SWQoa2V5KVxuICB9XG59XG4iXX0=
|