appium 2.0.0-beta.18 → 2.0.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/build/lib/appium-config.schema.json +0 -0
  2. package/build/lib/appium.js +84 -69
  3. package/build/lib/cli/argparse-actions.js +1 -1
  4. package/build/lib/cli/args.js +87 -223
  5. package/build/lib/cli/extension-command.js +2 -2
  6. package/build/lib/cli/extension.js +14 -6
  7. package/build/lib/cli/parser.js +142 -106
  8. package/build/lib/cli/utils.js +1 -1
  9. package/build/lib/config-file.js +141 -0
  10. package/build/lib/config.js +42 -64
  11. package/build/lib/driver-config.js +41 -20
  12. package/build/lib/drivers.js +1 -1
  13. package/build/lib/ext-config-io.js +165 -0
  14. package/build/lib/extension-config.js +110 -60
  15. package/build/lib/grid-register.js +19 -21
  16. package/build/lib/logsink.js +1 -1
  17. package/build/lib/main.js +135 -72
  18. package/build/lib/plugin-config.js +17 -8
  19. package/build/lib/schema/appium-config-schema.js +252 -0
  20. package/build/lib/schema/arg-spec.js +120 -0
  21. package/build/lib/schema/cli-args.js +173 -0
  22. package/build/lib/schema/cli-transformers.js +76 -0
  23. package/build/lib/schema/index.js +36 -0
  24. package/build/lib/schema/keywords.js +62 -0
  25. package/build/lib/schema/schema.js +357 -0
  26. package/build/lib/utils.js +26 -35
  27. package/lib/appium-config.schema.json +277 -0
  28. package/lib/appium.js +99 -75
  29. package/lib/cli/args.js +138 -335
  30. package/lib/cli/extension-command.js +7 -6
  31. package/lib/cli/extension.js +12 -4
  32. package/lib/cli/parser.js +248 -96
  33. package/lib/config-file.js +227 -0
  34. package/lib/config.js +71 -61
  35. package/lib/driver-config.js +66 -11
  36. package/lib/ext-config-io.js +287 -0
  37. package/lib/extension-config.js +209 -66
  38. package/lib/grid-register.js +24 -21
  39. package/lib/main.js +139 -68
  40. package/lib/plugin-config.js +32 -2
  41. package/lib/schema/appium-config-schema.js +286 -0
  42. package/lib/schema/arg-spec.js +218 -0
  43. package/lib/schema/cli-args.js +273 -0
  44. package/lib/schema/cli-transformers.js +123 -0
  45. package/lib/schema/index.js +2 -0
  46. package/lib/schema/keywords.js +119 -0
  47. package/lib/schema/schema.js +577 -0
  48. package/lib/utils.js +29 -52
  49. package/package.json +17 -11
  50. package/types/appium-config.d.ts +197 -0
  51. package/types/types.d.ts +201 -0
  52. package/LICENSE +0 -201
  53. package/build/lib/cli/parser-helpers.js +0 -106
  54. package/lib/cli/parser-helpers.js +0 -106
@@ -5,157 +5,193 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.default = exports.SERVER_SUBCOMMAND = exports.ArgParser = void 0;
8
9
  exports.getParser = getParser;
9
- exports.getDefaultServerArgs = getDefaultServerArgs;
10
- exports.default = void 0;
11
10
 
12
11
  require("source-map-support/register");
13
12
 
14
- var _path = _interopRequireDefault(require("path"));
15
-
16
- var _lodash = _interopRequireDefault(require("lodash"));
13
+ var _support = require("@appium/support");
17
14
 
18
15
  var _argparse = require("argparse");
19
16
 
20
- var _args = require("./args");
17
+ var _bluebird = _interopRequireDefault(require("bluebird"));
18
+
19
+ var _lodash = _interopRequireDefault(require("lodash"));
20
+
21
+ var _path = _interopRequireDefault(require("path"));
21
22
 
22
23
  var _extensionConfig = require("../extension-config");
23
24
 
25
+ var _schema = require("../schema");
26
+
24
27
  var _utils = require("../utils");
25
28
 
26
- var _support = require("@appium/support");
29
+ var _args = require("./args");
27
30
 
28
- function makeDebugParser(parser) {
29
- parser.exit = (status, message = undefined) => {
30
- throw new Error(message);
31
- };
32
- }
31
+ const SERVER_SUBCOMMAND = 'server';
32
+ exports.SERVER_SUBCOMMAND = SERVER_SUBCOMMAND;
33
+ const NON_SERVER_ARGS = Object.freeze(new Set([_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE, SERVER_SUBCOMMAND, '-h', '--help', '-v', '--version']));
33
34
 
34
- function getParser(debug = false) {
35
- const parser = new _argparse.ArgumentParser({
36
- add_help: true,
37
- description: 'A webdriver-compatible server for use with native and hybrid iOS and Android applications.',
38
- prog: process.argv[1] ? _path.default.basename(process.argv[1]) : 'appium'
39
- });
35
+ const version = _support.fs.readPackageJsonFrom(_utils.rootDir).version;
40
36
 
41
- if (debug) {
42
- makeDebugParser(parser);
43
- }
37
+ class ArgParser {
38
+ constructor(debug = false) {
39
+ const prog = process.argv[1] ? _path.default.basename(process.argv[1]) : 'appium';
40
+ const parser = new _argparse.ArgumentParser({
41
+ add_help: true,
42
+ description: 'A webdriver-compatible server that facilitates automation of web, mobile, and other types of apps across various platforms.',
43
+ prog
44
+ });
44
45
 
45
- parser.add_argument('-v', '--version', {
46
- action: 'version',
47
- version: _support.fs.readPackageJsonFrom(_utils.rootDir).version
48
- });
49
- const subParsers = parser.add_subparsers({
50
- dest: 'subcommand'
51
- });
52
- const serverArgs = addServerToParser(_args.sharedArgs, subParsers, debug);
53
- parser.rawArgs = serverArgs;
54
- addExtensionsToParser(_args.sharedArgs, subParsers, debug);
55
- parser._parse_args = parser.parse_args.bind(parser);
56
-
57
- parser.parse_args = function (args, namespace) {
58
- if (_lodash.default.isUndefined(args)) {
59
- args = [...process.argv.slice(2)];
60
- }
46
+ ArgParser._patchExit(parser);
61
47
 
62
- if (!_lodash.default.includes([_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE, 'server', '-h', '--help', '-v', '--version'], args[0])) {
63
- args.splice(0, 0, 'server');
64
- }
48
+ this.prog = prog;
49
+ this.debug = debug;
50
+ this.parser = parser;
51
+ parser.add_argument('-v', '--version', {
52
+ action: 'version',
53
+ version
54
+ });
55
+ const subParsers = parser.add_subparsers({
56
+ dest: 'subcommand'
57
+ });
65
58
 
66
- return this._parse_args(args, namespace);
67
- }.bind(parser);
59
+ const serverArgs = ArgParser._addServerToParser(subParsers);
68
60
 
69
- return parser;
70
- }
61
+ this.rawArgs = serverArgs;
71
62
 
72
- function addServerToParser(sharedArgs, subParsers, debug = false) {
73
- const serverParser = subParsers.add_parser('server', {
74
- add_help: true,
75
- help: 'Run an Appium server'
76
- });
63
+ ArgParser._addExtensionCommandsToParser(subParsers);
77
64
 
78
- if (debug) {
79
- makeDebugParser(serverParser);
65
+ this.parse_args = this.parseArgs;
80
66
  }
81
67
 
82
- for (const [flagsOrNames, opts] of [...sharedArgs, ..._args.serverArgs]) {
83
- serverParser.add_argument(...flagsOrNames, { ...opts
84
- });
68
+ parseArgs(args = process.argv.slice(2)) {
69
+ if (!NON_SERVER_ARGS.has(args[0])) {
70
+ args.unshift(SERVER_SUBCOMMAND);
71
+ }
72
+
73
+ try {
74
+ const parsed = this.parser.parse_args(args);
75
+ return ArgParser._transformParsedArgs(parsed);
76
+ } catch (err) {
77
+ if (this.debug) {
78
+ throw err;
79
+ }
80
+
81
+ {
82
+ console.error();
83
+ console.error(err.message);
84
+ process.exit(1);
85
+ }
86
+ }
85
87
  }
86
88
 
87
- return _args.serverArgs;
88
- }
89
+ static _transformParsedArgs(args) {
90
+ return _lodash.default.reduce(args, (unpacked, value, key) => {
91
+ if ((0, _schema.hasArgSpec)(key)) {
92
+ const {
93
+ dest
94
+ } = (0, _schema.getArgSpec)(key);
89
95
 
90
- function getDefaultServerArgs() {
91
- let defaults = {};
96
+ _lodash.default.set(unpacked, dest, value);
97
+ } else {
98
+ unpacked[key] = value;
99
+ }
92
100
 
93
- for (let [, arg] of _args.serverArgs) {
94
- defaults[arg.dest] = arg.default;
101
+ return unpacked;
102
+ }, {});
95
103
  }
96
104
 
97
- return defaults;
98
- }
105
+ static _patchExit(parser) {
106
+ parser.exit = (code, msg) => {
107
+ throw new Error(msg);
108
+ };
109
+ }
99
110
 
100
- function addExtensionsToParser(sharedArgs, subParsers, debug = false) {
101
- for (const type of [_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE]) {
102
- const extParser = subParsers.add_parser(type, {
111
+ static _addServerToParser(subParser) {
112
+ const serverParser = subParser.add_parser('server', {
103
113
  add_help: true,
104
- help: `Access the ${type} management CLI commands`
114
+ help: 'Run an Appium server'
105
115
  });
106
116
 
107
- if (debug) {
108
- makeDebugParser(extParser);
117
+ ArgParser._patchExit(serverParser);
118
+
119
+ const serverArgs = (0, _args.getServerArgs)();
120
+
121
+ for (const [flagsOrNames, opts] of serverArgs) {
122
+ serverParser.add_argument(...flagsOrNames, { ...opts
123
+ });
109
124
  }
110
125
 
111
- const extSubParsers = extParser.add_subparsers({
112
- dest: `${type}Command`
113
- });
114
- const parserSpecs = [{
115
- command: 'list',
116
- args: _args.extensionArgs[type].list,
117
- help: `List available and installed ${type}s`
118
- }, {
119
- command: 'install',
120
- args: _args.extensionArgs[type].install,
121
- help: `Install a ${type}`
122
- }, {
123
- command: 'uninstall',
124
- args: _args.extensionArgs[type].uninstall,
125
- help: `Uninstall a ${type}`
126
- }, {
127
- command: 'update',
128
- args: _args.extensionArgs[type].update,
129
- help: `Update installed ${type}s to the latest version`
130
- }, {
131
- command: 'run',
132
- args: _args.extensionArgs[type].run,
133
- help: `Run a script (defined inside the ${type}'s package.json under the ` + `“scripts” field inside the “appium” field) from an installed ${type}`
134
- }];
135
-
136
- for (const {
137
- command,
138
- args,
139
- help
140
- } of parserSpecs) {
141
- const parser = extSubParsers.add_parser(command, {
142
- help
126
+ return serverArgs;
127
+ }
128
+
129
+ static _addExtensionCommandsToParser(subParsers) {
130
+ for (const type of [_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE]) {
131
+ const extParser = subParsers.add_parser(type, {
132
+ add_help: true,
133
+ help: `Access the ${type} management CLI commands`
143
134
  });
144
135
 
145
- if (debug) {
146
- makeDebugParser(parser);
147
- }
136
+ ArgParser._patchExit(extParser);
148
137
 
149
- for (const [flagsOrNames, opts] of [...sharedArgs, ...args]) {
150
- parser.add_argument(...flagsOrNames, { ...opts
138
+ const extSubParsers = extParser.add_subparsers({
139
+ dest: `${type}Command`
140
+ });
141
+ const extensionArgs = (0, _args.getExtensionArgs)();
142
+ const parserSpecs = [{
143
+ command: 'list',
144
+ args: extensionArgs[type].list,
145
+ help: `List available and installed ${type}s`
146
+ }, {
147
+ command: 'install',
148
+ args: extensionArgs[type].install,
149
+ help: `Install a ${type}`
150
+ }, {
151
+ command: 'uninstall',
152
+ args: extensionArgs[type].uninstall,
153
+ help: `Uninstall a ${type}`
154
+ }, {
155
+ command: 'update',
156
+ args: extensionArgs[type].update,
157
+ help: `Update installed ${type}s to the latest version`
158
+ }, {
159
+ command: 'run',
160
+ args: extensionArgs[type].run,
161
+ help: `Run a script (defined inside the ${type}'s package.json under the ` + `“scripts” field inside the “appium” field) from an installed ${type}`
162
+ }];
163
+
164
+ for (const {
165
+ command,
166
+ args,
167
+ help
168
+ } of parserSpecs) {
169
+ const parser = extSubParsers.add_parser(command, {
170
+ help
151
171
  });
172
+
173
+ ArgParser._patchExit(parser);
174
+
175
+ for (const [flagsOrNames, opts] of args) {
176
+ parser.add_argument(...flagsOrNames, { ...opts
177
+ });
178
+ }
152
179
  }
153
180
  }
154
181
  }
182
+
183
+ }
184
+
185
+ exports.ArgParser = ArgParser;
186
+
187
+ async function getParser(debug = false) {
188
+ await _bluebird.default.all([_args.driverConfig.read(), _args.pluginConfig.read()]);
189
+ (0, _schema.finalizeSchema)();
190
+ return new ArgParser(debug);
155
191
  }
156
192
 
157
193
  var _default = getParser;
158
194
  exports.default = _default;require('source-map-support').install();
159
195
 
160
196
 
161
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvcGFyc2VyLmpzIl0sIm5hbWVzIjpbIm1ha2VEZWJ1Z1BhcnNlciIsInBhcnNlciIsImV4aXQiLCJzdGF0dXMiLCJtZXNzYWdlIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJnZXRQYXJzZXIiLCJkZWJ1ZyIsIkFyZ3VtZW50UGFyc2VyIiwiYWRkX2hlbHAiLCJkZXNjcmlwdGlvbiIsInByb2ciLCJwcm9jZXNzIiwiYXJndiIsInBhdGgiLCJiYXNlbmFtZSIsImFkZF9hcmd1bWVudCIsImFjdGlvbiIsInZlcnNpb24iLCJmcyIsInJlYWRQYWNrYWdlSnNvbkZyb20iLCJyb290RGlyIiwic3ViUGFyc2VycyIsImFkZF9zdWJwYXJzZXJzIiwiZGVzdCIsInNlcnZlckFyZ3MiLCJhZGRTZXJ2ZXJUb1BhcnNlciIsInNoYXJlZEFyZ3MiLCJyYXdBcmdzIiwiYWRkRXh0ZW5zaW9uc1RvUGFyc2VyIiwiX3BhcnNlX2FyZ3MiLCJwYXJzZV9hcmdzIiwiYmluZCIsImFyZ3MiLCJuYW1lc3BhY2UiLCJfIiwiaXNVbmRlZmluZWQiLCJzbGljZSIsImluY2x1ZGVzIiwiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsInNwbGljZSIsInNlcnZlclBhcnNlciIsImFkZF9wYXJzZXIiLCJoZWxwIiwiZmxhZ3NPck5hbWVzIiwib3B0cyIsImdldERlZmF1bHRTZXJ2ZXJBcmdzIiwiZGVmYXVsdHMiLCJhcmciLCJkZWZhdWx0IiwidHlwZSIsImV4dFBhcnNlciIsImV4dFN1YlBhcnNlcnMiLCJwYXJzZXJTcGVjcyIsImNvbW1hbmQiLCJleHRlbnNpb25BcmdzIiwibGlzdCIsImluc3RhbGwiLCJ1bmluc3RhbGwiLCJ1cGRhdGUiLCJydW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxTQUFTQSxlQUFULENBQTBCQyxNQUExQixFQUFrQztBQUNoQ0EsRUFBQUEsTUFBTSxDQUFDQyxJ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LElBQW1DLENBQUMsR0FBR25CLFVBQUosRUFBZ0IsR0FBR00sSUFBbkIsQ0FBbkMsRUFBNkQ7QUFFM0RqQyxRQUFBQSxNQUFNLENBQUNnQixZQUFQLENBQW9CLEdBQUc2QixZQUF2QixFQUFxQyxFQUFDLEdBQUdDO0FBQUosU0FBckM7QUFDRDtBQUNGO0FBQ0Y7QUFDRjs7ZUFFY3hDLFMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBBcmd1bWVudFBhcnNlciB9IGZyb20gJ2FyZ3BhcnNlJztcbmltcG9ydCB7IHNoYXJlZEFyZ3MsIHNlcnZlckFyZ3MsIGV4dGVuc2lvbkFyZ3MgfSBmcm9tICcuL2FyZ3MnO1xuaW1wb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyByb290RGlyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgZnMgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmZ1bmN0aW9uIG1ha2VEZWJ1Z1BhcnNlciAocGFyc2VyKSB7XG4gIHBhcnNlci5leGl0ID0gKHN0YXR1cywgbWVzc2FnZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VyIChkZWJ1ZyA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcih7XG4gICAgYWRkX2hlbHA6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdBIHdlYmRyaXZlci1jb21wYXRpYmxlIHNlcnZlciBmb3IgdXNlIHdpdGggbmF0aXZlIGFuZCBoeWJyaWQgaU9TIGFuZCBBbmRyb2lkIGFwcGxpY2F0aW9ucy4nLFxuICAgIHByb2c6IHByb2Nlc3MuYXJndlsxXSA/IHBhdGguYmFzZW5hbWUocHJvY2Vzcy5hcmd2WzFdKSA6ICdhcHBpdW0nLFxuICB9KTtcbiAgaWYgKGRlYnVnKSB7XG4gICAgbWFrZURlYnVnUGFyc2VyKHBhcnNlcik7XG4gIH1cbiAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJzaW9uJywge1xuICAgIGFjdGlvbjogJ3ZlcnNpb24nLFxuICAgIHZlcnNpb246IGZzLnJlYWRQYWNrYWdlSnNvbkZyb20ocm9vdERpcikudmVyc2lvblxuICB9KTtcbiAgY29uc3Qgc3ViUGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2Vycyh7ZGVzdDogJ3N1YmNvbW1hbmQnfSk7XG5cbiAgLy8gYWRkIHRoZSAnc2VydmVyJyBzdWJjb21tYW5kLCBhbmQgc3RvcmUgdGhlIHJhdyBhcmd1bWVudHMgb24gdGhlIHBhcnNlclxuICAvLyBvYmplY3QgYXMgYSB3YXkgZm9yIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlIHRvIHdvcmsgd2l0aCB0aGUgYXJndW1lbnRzXG4gIC8vIGNvbmNlcHR1YWxseSByYXRoZXIgdGhhbiBqdXN0IHRocm91Z2ggYXJncGFyc2VcbiAgY29uc3Qgc2VydmVyQXJncyA9IGFkZFNlcnZlclRvUGFyc2VyKHNoYXJlZEFyZ3MsIHN1YlBhcnNlcnMsIGRlYnVnKTtcbiAgcGFyc2VyLnJhd0FyZ3MgPSBzZXJ2ZXJBcmdzO1xuXG4gIC8vIGFkZCB0aGUgJ2RyaXZlcicgYW5kICdwbHVnaW4nIHN1YmNvbW1hbmRzXG4gIGFkZEV4dGVuc2lvbnNUb1BhcnNlcihzaGFyZWRBcmdzLCBzdWJQYXJzZXJzLCBkZWJ1Zyk7XG5cbiAgLy8gbW9kaWZ5IHRoZSBwYXJzZV9hcmdzIGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgJ3NlcnZlcicgc3ViY29tbWFuZCBpZiB0aGVcbiAgLy8gdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIGEgc3ViY29tbWFuZCBvciB0aGUgZ2xvYmFsIGhlbHAgY29tbWFuZFxuICBwYXJzZXIuX3BhcnNlX2FyZ3MgPSBwYXJzZXIucGFyc2VfYXJncy5iaW5kKHBhcnNlcik7XG4gIHBhcnNlci5wYXJzZV9hcmdzID0gZnVuY3Rpb24gKGFyZ3MsIG5hbWVzcGFjZSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKGFyZ3MpKSB7XG4gICAgICBhcmdzID0gWy4uLnByb2Nlc3MuYXJndi5zbGljZSgyKV07XG4gICAgfVxuICAgIGlmICghXy5pbmNsdWRlcyhbRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFLCAnc2VydmVyJywgJy1oJywgJy0taGVscCcsICctdicsICctLXZlcnNpb24nXSwgYXJnc1swXSkpIHtcbiAgICAgIGFyZ3Muc3BsaWNlKDAsIDAsICdzZXJ2ZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhcnNlX2FyZ3MoYXJncywgbmFtZXNwYWNlKTtcbiAgfS5iaW5kKHBhcnNlcik7XG4gIHJldHVybiBwYXJzZXI7XG59XG5cbmZ1bmN0aW9uIGFkZFNlcnZlclRvUGFyc2VyIChzaGFyZWRBcmdzLCBzdWJQYXJzZXJzLCBkZWJ1ZyA9IGZhbHNlKSB7XG4gIGNvbnN0IHNlcnZlclBhcnNlciA9IHN1YlBhcnNlcnMuYWRkX3BhcnNlcignc2VydmVyJywge1xuICAgIGFkZF9oZWxwOiB0cnVlLFxuICAgIGhlbHA6ICdSdW4gYW4gQXBwaXVtIHNlcnZlcicsXG4gIH0pO1xuXG4gIGlmIChkZWJ1Zykge1xuICAgIG1ha2VEZWJ1Z1BhcnNlcihzZXJ2ZXJQYXJzZXIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbZmxhZ3NPck5hbWVzLCBvcHRzXSBvZiBbLi4uc2hhcmVkQXJncywgLi4uc2VydmVyQXJnc10pIHtcbiAgICAvLyBhZGRfYXJndW1lbnQgbXV0YXRlcyBhcmd1bWVudHMgc28gbWFrZSBjb3BpZXNcbiAgICBzZXJ2ZXJQYXJzZXIuYWRkX2FyZ3VtZW50KC4uLmZsYWdzT3JOYW1lcywgey4uLm9wdHN9KTtcbiAgfVxuXG4gIHJldHVybiBzZXJ2ZXJBcmdzO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0U2VydmVyQXJncyAoKSB7XG4gIGxldCBkZWZhdWx0cyA9IHt9O1xuICBmb3IgKGxldCBbLCBhcmddIG9mIHNlcnZlckFyZ3MpIHtcbiAgICBkZWZhdWx0c1thcmcuZGVzdF0gPSBhcmcuZGVmYXVsdDtcbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG5cbmZ1bmN0aW9uIGFkZEV4dGVuc2lvbnNUb1BhcnNlciAoc2hhcmVkQXJncywgc3ViUGFyc2VycywgZGVidWcgPSBmYWxzZSkge1xuICBmb3IgKGNvbnN0IHR5cGUgb2YgW0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRV0pIHtcbiAgICBjb25zdCBleHRQYXJzZXIgPSBzdWJQYXJzZXJzLmFkZF9wYXJzZXIodHlwZSwge1xuICAgICAgYWRkX2hlbHA6IHRydWUsXG4gICAgICBoZWxwOiBgQWNjZXNzIHRoZSAke3R5cGV9IG1hbmFnZW1lbnQgQ0xJIGNvbW1hbmRzYCxcbiAgICB9KTtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIG1ha2VEZWJ1Z1BhcnNlcihleHRQYXJzZXIpO1xuICAgIH1cbiAgICBjb25zdCBleHRTdWJQYXJzZXJzID0gZXh0UGFyc2VyLmFkZF9zdWJwYXJzZXJzKHtcbiAgICAgIGRlc3Q6IGAke3R5cGV9Q29tbWFuZGAsXG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VyU3BlY3MgPSBbXG4gICAgICB7Y29tbWFuZDogJ2xpc3QnLCBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLmxpc3QsXG4gICAgICAgaGVscDogYExpc3QgYXZhaWxhYmxlIGFuZCBpbnN0YWxsZWQgJHt0eXBlfXNgfSxcbiAgICAgIHtjb21tYW5kOiAnaW5zdGFsbCcsIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0uaW5zdGFsbCxcbiAgICAgICBoZWxwOiBgSW5zdGFsbCBhICR7dHlwZX1gfSxcbiAgICAgIHtjb21tYW5kOiAndW5pbnN0YWxsJywgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS51bmluc3RhbGwsXG4gICAgICAgaGVscDogYFVuaW5zdGFsbCBhICR7dHlwZX1gfSxcbiAgICAgIHtjb21tYW5kOiAndXBkYXRlJywgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS51cGRhdGUsXG4gICAgICAgaGVscDogYFVwZGF0ZSBpbnN0YWxsZWQgJHt0eXBlfXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uYH0sXG4gICAgICB7Y29tbWFuZDogJ3J1bicsIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0ucnVuLFxuICAgICAgIGhlbHA6IGBSdW4gYSBzY3JpcHQgKGRlZmluZWQgaW5zaWRlIHRoZSAke3R5cGV9J3MgcGFja2FnZS5qc29uIHVuZGVyIHRoZSBgICtcbiAgICAgICAgICAgICBg4oCcc2NyaXB0c+KAnSBmaWVsZCBpbnNpZGUgdGhlIOKAnGFwcGl1beKAnSBmaWVsZCkgZnJvbSBhbiBpbnN0YWxsZWQgJHt0eXBlfWB9XG4gICAgXTtcblxuICAgIGZvciAoY29uc3Qge2NvbW1hbmQsIGFyZ3MsIGhlbHB9IG9mIHBhcnNlclNwZWNzKSB7XG4gICAgICBjb25zdCBwYXJzZXIgPSBleHRTdWJQYXJzZXJzLmFkZF9wYXJzZXIoY29tbWFuZCwge2hlbHB9KTtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBtYWtlRGVidWdQYXJzZXIocGFyc2VyKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2ZsYWdzT3JOYW1lcywgb3B0c10gb2YgWy4uLnNoYXJlZEFyZ3MsIC4uLmFyZ3NdKSB7XG4gICAgICAgIC8vIGFkZF9hcmd1bWVudCBtdXRhdGVzIHBhcmFtcyBzbyBtYWtlIHN1cmUgdG8gc2VuZCBpbiBjb3BpZXMgaW5zdGVhZFxuICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KC4uLmZsYWdzT3JOYW1lcywgey4uLm9wdHN9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0UGFyc2VyO1xuZXhwb3J0IHsgZ2V0UGFyc2VyLCBnZXREZWZhdWx0U2VydmVyQXJncyB9O1xuIl0sImZpbGUiOiJsaWIvY2xpL3BhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
197
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvcGFyc2VyLmpzIl0sIm5hbWVzIjpbIlNFUlZFUl9TVUJDT01NQU5EIiwiTk9OX1NFUlZFUl9BUkdTIiwiT2JqZWN0IiwiZnJlZXplIiwiU2V0IiwiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsInZlcnNpb24iLCJmcyIsInJlYWRQYWNrYWdlSnNvbkZyb20iLCJyb290RGlyIiwiQXJnUGFyc2VyIiwiY29uc3RydWN0b3IiLCJkZWJ1ZyIsInByb2ciLCJwcm9jZXNzIiwiYXJndiIsInBhdGgiLCJiYXNlbmFtZSIsInBhcnNlciIsIkFyZ3VtZW50UGFyc2VyIiwiYWRkX2hlbHAiLCJkZXNjcmlwdGlvbiIsIl9wYXRjaEV4aXQiLCJhZGRfYXJndW1lbnQiLCJhY3Rpb24iLCJzdWJQYXJzZXJzIiwiYWRkX3N1YnBhcnNlcnMiLCJkZXN0Iiwic2VydmVyQXJncyIsIl9hZGRTZXJ2ZXJUb1BhcnNlciIsInJhd0FyZ3MiLCJfYWRkRXh0ZW5zaW9uQ29tbWFuZHNUb1BhcnNlciIsInBhcnNlX2FyZ3MiLCJwYXJzZUFyZ3MiLCJhcmdzIiwic2xpY2UiLCJoYXMiLCJ1bnNoaWZ0IiwicGFyc2VkIiwiX3RyYW5zZm9ybVBhcnNlZEFyZ3MiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJtZXNzYWdlIiwiZXhpdCIsIl8iLCJyZWR1Y2UiLCJ1bnBhY2tlZCIsInZhbHVlIiwia2V5Iiwic2V0IiwiY29kZSIsIm1zZyIsIkVycm9yIiwic3ViUGFyc2VyIiwic2VydmVyUGFyc2VyIiwiYWRkX3BhcnNlciIsImhlbHAiLCJmbGFnc09yTmFtZXMiLCJvcHRzIiwidHlwZSIsImV4dFBhcnNlciIsImV4dFN1YlBhcnNlcnMiLCJleHRlbnNpb25BcmdzIiwicGFyc2VyU3BlY3MiLCJjb21tYW5kIiwibGlzdCIsImluc3RhbGwiLCJ1bmluc3RhbGwiLCJ1cGRhdGUiLCJydW4iLCJnZXRQYXJzZXIiLCJCIiwiYWxsIiwiZHJpdmVyQ29uZmlnIiwicmVhZCIsInBsdWdp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RyxvQkFBbUJHLElBQUs7QUFIakMsT0FoQmtCLEVBcUJsQjtBQUNFSyxRQUFBQSxPQUFPLEVBQUUsS0FEWDtBQUVFL0IsUUFBQUEsSUFBSSxFQUFFNkIsYUFBYSxDQUFDSCxJQUFELENBQWIsQ0FBb0JVLEdBRjVCO0FBR0ViLFFBQUFBLElBQUksRUFDRCxvQ0FBbUNHLElBQUssNEJBQXpDLEdBQ0MsZ0VBQStEQSxJQUFLO0FBTHpFLE9BckJrQixDQUFwQjs7QUE4QkEsV0FBSyxNQUFNO0FBQUNLLFFBQUFBLE9BQUQ7QUFBVS9CLFFBQUFBLElBQVY7QUFBZ0J1QixRQUFBQTtBQUFoQixPQUFYLElBQW9DTyxXQUFwQyxFQUFpRDtBQUMvQyxjQUFNOUMsTUFBTSxHQUFHNEMsYUFBYSxDQUFDTixVQUFkLENBQXlCUyxPQUF6QixFQUFrQztBQUFDUixVQUFBQTtBQUFELFNBQWxDLENBQWY7O0FBRUEvQyxRQUFBQSxTQUFTLENBQUNZLFVBQVYsQ0FBcUJKLE1BQXJCOztBQUVBLGFBQUssTUFBTSxDQUFDd0MsWUFBRCxFQUFlQyxJQUFmLENBQVgsSUFBbUN6QixJQUFuQyxFQUF5QztBQUd2Q2hCLFVBQUFBLE1BQU0sQ0FBQ0ssWUFBUCxDQUFvQixHQUFHbUMsWUFBdkIsRUFBcUMsRUFBQyxHQUFHQztBQUFKLFdBQXJDO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7O0FBak5hOzs7O0FBNE5oQixlQUFlWSxTQUFmLENBQTBCM0QsS0FBSyxHQUFHLEtBQWxDLEVBQXlDO0FBQ3ZDLFFBQU00RCxrQkFBRUMsR0FBRixDQUFNLENBQUNDLG1CQUFhQyxJQUFiLEVBQUQsRUFBc0JDLG1CQUFhRCxJQUFiLEVBQXRCLENBQU4sQ0FBTjtBQUNBO0FBRUEsU0FBTyxJQUFJakUsU0FBSixDQUFjRSxLQUFkLENBQVA7QUFDRDs7ZUFFYzJELFMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHsgZnMgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgQXJndW1lbnRQYXJzZXIgfSBmcm9tICdhcmdwYXJzZSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUgfSBmcm9tICcuLi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCB7IGZpbmFsaXplU2NoZW1hLCBnZXRBcmdTcGVjLCBoYXNBcmdTcGVjIH0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7IHJvb3REaXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBkcml2ZXJDb25maWcsXG4gIGdldEV4dGVuc2lvbkFyZ3MsXG4gIGdldFNlcnZlckFyZ3MsXG4gIHBsdWdpbkNvbmZpZ1xufSBmcm9tICcuL2FyZ3MnO1xuXG5leHBvcnQgY29uc3QgU0VSVkVSX1NVQkNPTU1BTkQgPSAnc2VydmVyJztcblxuLyoqXG4gKiBJZiB0aGUgcGFyc2VkIGFyZ3MgZG8gbm90IGNvbnRhaW4gYW55IG9mIHRoZXNlIHZhbHVlcywgdGhlbiB3ZVxuICogd2lsbCBhdXRvbWF0aWFsbHkgaW5qZWN0IHRoZSBgc2VydmVyYCBzdWJjb21tYW5kLlxuICovXG5jb25zdCBOT05fU0VSVkVSX0FSR1MgPSBPYmplY3QuZnJlZXplKFxuICBuZXcgU2V0KFtcbiAgICBEUklWRVJfVFlQRSxcbiAgICBQTFVHSU5fVFlQRSxcbiAgICBTRVJWRVJfU1VCQ09NTUFORCxcbiAgICAnLWgnLFxuICAgICctLWhlbHAnLFxuICAgICctdicsXG4gICAgJy0tdmVyc2lvbidcbiAgXSlcbik7XG5cbmNvbnN0IHZlcnNpb24gPSBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKHJvb3REaXIpLnZlcnNpb247XG5cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCBgYXJncGFyc2VgXG4gKlxuICogLSBIYW5kbGVzIGluc3RhbnRpYXRpb24sIGNvbmZpZ3VyYXRpb24sIGFuZCBtb25rZXlwYXRjaGluZyBvZiBhblxuICogICAgYEFyZ3VtZW50UGFyc2VyYCBpbnN0YW5jZSBmb3IgQXBwaXVtIHNlcnZlciBhbmQgaXRzIGV4dGVuc2lvbnNcbiAqIC0gSGFuZGxlcyBlcnJvciBjb25kaXRpb25zLCBtZXNzYWdlcywgYW5kIGV4aXQgYmVoYXZpb3JcbiAqL1xuY2xhc3MgQXJnUGFyc2VyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlYnVnXSAtIElmIHRydWUsIHRocm93IGluc3RlYWQgb2YgZXhpdCBvbiBlcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChkZWJ1ZyA9IGZhbHNlKSB7XG4gICAgY29uc3QgcHJvZyA9IHByb2Nlc3MuYXJndlsxXSA/IHBhdGguYmFzZW5hbWUocHJvY2Vzcy5hcmd2WzFdKSA6ICdhcHBpdW0nO1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBBcmd1bWVudFBhcnNlcih7XG4gICAgICBhZGRfaGVscDogdHJ1ZSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnQSB3ZWJkcml2ZXItY29tcGF0aWJsZSBzZXJ2ZXIgdGhhdCBmYWNpbGl0YXRlcyBhdXRvbWF0aW9uIG9mIHdlYiwgbW9iaWxlLCBhbmQgb3RoZXIgdHlwZXMgb2YgYXBwcyBhY3Jvc3MgdmFyaW91cyBwbGF0Zm9ybXMuJyxcbiAgICAgIHByb2csXG4gICAgfSk7XG5cbiAgICBBcmdQYXJzZXIuX3BhdGNoRXhpdChwYXJzZXIpO1xuXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbSBuYW1lICh0eXBpY2FsbHkgYGFwcGl1bWApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnByb2cgPSBwcm9nO1xuXG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aHJvdyBhbiBlcnJvciBvbiBwYXJzZSBmYWlsdXJlIGluc3RlYWQgb2YgcHJpbnRpbmcgaGVscFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcblxuICAgIC8qKlxuICAgICAqIFdyYXBwZWQgYEFyZ3VtZW50UGFyc2VyYCBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtBcmd1bWVudFBhcnNlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcblxuICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy12JywgJy0tdmVyc2lvbicsIHtcbiAgICAgIGFjdGlvbjogJ3ZlcnNpb24nLFxuICAgICAgdmVyc2lvbixcbiAgICB9KTtcblxuICAgIGNvbnN0IHN1YlBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnMoe2Rlc3Q6ICdzdWJjb21tYW5kJ30pO1xuXG4gICAgLy8gYWRkIHRoZSAnc2VydmVyJyBzdWJjb21tYW5kLCBhbmQgc3RvcmUgdGhlIHJhdyBhcmd1bWVudHMgb24gdGhlIHBhcnNlclxuICAgIC8vIG9iamVjdCBhcyBhIHdheSBmb3Igb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUgdG8gd29yayB3aXRoIHRoZSBhcmd1bWVudHNcbiAgICAvLyBjb25jZXB0dWFsbHkgcmF0aGVyIHRoYW4ganVzdCB0aHJvdWdoIGFyZ3BhcnNlXG4gICAgY29uc3Qgc2VydmVyQXJncyA9IEFyZ1BhcnNlci5fYWRkU2VydmVyVG9QYXJzZXIoc3ViUGFyc2Vycyk7XG5cbiAgICB0aGlzLnJhd0FyZ3MgPSBzZXJ2ZXJBcmdzO1xuXG4gICAgLy8gYWRkIHRoZSAnZHJpdmVyJyBhbmQgJ3BsdWdpbicgc3ViY29tbWFuZHNcbiAgICBBcmdQYXJzZXIuX2FkZEV4dGVuc2lvbkNvbW1hbmRzVG9QYXJzZXIoc3ViUGFyc2Vycyk7XG5cbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAvIGRyb3AtaW4gd3JhcHBlclxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtBcmdQYXJzZXJbJ3BhcnNlQXJncyddfVxuICAgICAqL1xuICAgIHRoaXMucGFyc2VfYXJncyA9IHRoaXMucGFyc2VBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFyZ3VtZW50cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIElmIG5vIHN1YmNvbW1hbmQgaXMgcGFzc2VkIGluLCB0aGlzIG1ldGhvZCB3aWxsIGluamVjdCB0aGUgYHNlcnZlcmAgc3ViY29tbWFuZC5cbiAgICpcbiAgICogYEFyZ1BhcnNlci5wcm90b3R5cGUucGFyc2VfYXJnc2AgaXMgYW4gYWxpYXMgb2YgdGhpcyBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzXSAtIEFycmF5IG9mIGFyZ3VtZW50cywgb3N0ZW5zaWJseSBmcm9tIGBwcm9jZXNzLmFyZ3ZgLiBHYXRoZXJzIGFyZ3MgZnJvbSBgcHJvY2Vzcy5hcmd2YCBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJy4uLy4uL3R5cGVzL3R5cGVzJykuUGFyc2VkQXJnc30gLSBUaGUgcGFyc2VkIGFyZ3VtZW50c1xuICAgKi9cbiAgcGFyc2VBcmdzIChhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpKSB7XG4gICAgaWYgKCFOT05fU0VSVkVSX0FSR1MuaGFzKGFyZ3NbMF0pKSB7XG4gICAgICBhcmdzLnVuc2hpZnQoU0VSVkVSX1NVQkNPTU1BTkQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpO1xuICAgICAgcmV0dXJuIEFyZ1BhcnNlci5fdHJhbnNmb3JtUGFyc2VkQXJncyhwYXJzZWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy8gdGhpcyBpc24ndCB0ZXN0ZWQgdmlhIHVuaXQgdGVzdHMgKHdlIHVzZSBgZGVidWc6IHRydWVgKSBzbyBtYXkgZXNjYXBlIGNvdmVyYWdlLlxuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKCk7IC8vIG5lZWQgYW4gZXh0cmEgc3BhY2Ugc2luY2UgYXJncGFyc2UgcHJpbnRzIHVzYWdlLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBvYmplY3QgZnVsbCBvZiBhcmd1bWVudHMgYXMgcmV0dXJuZWQgYnkgYGFyZ3BhcnNlci5wYXJzZV9hcmdzYCxcbiAgICogZXhwYW5kIHRoZSBvbmVzIGZvciBleHRlbnNpb25zIGludG8gYSBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZSBhbmQgcmVuYW1lXG4gICAqIGtleXMgdG8gbWF0Y2ggdGhlIGludGVuZGVkIGRlc3RpbmF0aW9uLlxuICAgKlxuICAgKiBFLmcuLCBgeydkcml2ZXItZm9vLWJhcic6IGJhen1gIGJlY29tZXMgYHtkcml2ZXI6IHtmb286IHtiYXI6ICdiYXonfX19YFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIF90cmFuc2Zvcm1QYXJzZWRBcmdzIChhcmdzKSB7XG4gICAgcmV0dXJuIF8ucmVkdWNlKFxuICAgICAgYXJncyxcbiAgICAgICh1bnBhY2tlZCwgdmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoaGFzQXJnU3BlYyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qge2Rlc3R9ID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4uL3NjaGVtYS9hcmctc3BlYycpLkFyZ1NwZWN9ICovKGdldEFyZ1NwZWMoa2V5KSk7XG4gICAgICAgICAgXy5zZXQodW5wYWNrZWQsIGRlc3QsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGFueXRoaW5nIHRoYXQgX2lzbid0XyBhIHNlcnZlciBhcmdcbiAgICAgICAgICB1bnBhY2tlZFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVucGFja2VkO1xuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgYGV4aXQoKWAgbWV0aG9kIG9mIHRoZSBwYXJzZXIgdG8gdGhyb3cgYW4gZXJyb3IsIHNvIHdlIGNhbiBoYW5kbGUgaXQgbWFudWFsbHkuXG4gICAqIEBwYXJhbSB7QXJndW1lbnRQYXJzZXJ9IHBhcnNlclxuICAgKi9cbiAgc3RhdGljIF9wYXRjaEV4aXQgKHBhcnNlcikge1xuICAgIHBhcnNlci5leGl0ID0gKGNvZGUsIG1zZykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYXJncGFyc2UnKS5TdWJQYXJzZXJ9IHN1YlBhcnNlclxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL2FyZ3MnKS5Bcmd1bWVudERlZmluaXRpb25zfVxuICAgKi9cbiAgc3RhdGljIF9hZGRTZXJ2ZXJUb1BhcnNlciAoc3ViUGFyc2VyKSB7XG4gICAgY29uc3Qgc2VydmVyUGFyc2VyID0gc3ViUGFyc2VyLmFkZF9wYXJzZXIoJ3NlcnZlcicsIHtcbiAgICAgIGFkZF9oZWxwOiB0cnVlLFxuICAgICAgaGVscDogJ1J1biBhbiBBcHBpdW0gc2VydmVyJyxcbiAgICB9KTtcblxuICAgIEFyZ1BhcnNlci5fcGF0Y2hFeGl0KHNlcnZlclBhcnNlcik7XG5cbiAgICBjb25zdCBzZXJ2ZXJBcmdzID0gZ2V0U2VydmVyQXJncygpO1xuICAgIGZvciAoY29uc3QgW2ZsYWdzT3JOYW1lcywgb3B0c10gb2Ygc2VydmVyQXJncykge1xuICAgICAgLy8gVFMgZG9lc24ndCBsaWtlIHRoZSBzcHJlYWQgb3BlcmF0b3IgaGVyZS5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHNlcnZlclBhcnNlci5hZGRfYXJndW1lbnQoLi4uZmxhZ3NPck5hbWVzLCB7Li4ub3B0c30pO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXJBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZXh0ZW5zaW9uIHN1Yi1zdWItY29tbWFuZHMgdG8gYGRyaXZlcmAvYHBsdWdpbmAgc3ViY29tbWFuZHNcbiAgICogQHBhcmFtIHtpbXBvcnQoJ2FyZ3BhcnNlJykuU3ViUGFyc2VyfSBzdWJQYXJzZXJzXG4gICAqL1xuICBzdGF0aWMgX2FkZEV4dGVuc2lvbkNvbW1hbmRzVG9QYXJzZXIgKHN1YlBhcnNlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRV0pIHtcbiAgICAgIGNvbnN0IGV4dFBhcnNlciA9IHN1YlBhcnNlcnMuYWRkX3BhcnNlcih0eXBlLCB7XG4gICAgICAgIGFkZF9oZWxwOiB0cnVlLFxuICAgICAgICBoZWxwOiBgQWNjZXNzIHRoZSAke3R5cGV9IG1hbmFnZW1lbnQgQ0xJIGNvbW1hbmRzYCxcbiAgICAgIH0pO1xuXG4gICAgICBBcmdQYXJzZXIuX3BhdGNoRXhpdChleHRQYXJzZXIpO1xuXG4gICAgICBjb25zdCBleHRTdWJQYXJzZXJzID0gZXh0UGFyc2VyLmFkZF9zdWJwYXJzZXJzKHtcbiAgICAgICAgZGVzdDogYCR7dHlwZX1Db21tYW5kYCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXh0ZW5zaW9uQXJncyA9IGdldEV4dGVuc2lvbkFyZ3MoKTtcbiAgICAgIGNvbnN0IHBhcnNlclNwZWNzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ2xpc3QnLFxuICAgICAgICAgIGFyZ3M6IGV4dGVuc2lvbkFyZ3NbdHlwZV0ubGlzdCxcbiAgICAgICAgICBoZWxwOiBgTGlzdCBhdmFpbGFibGUgYW5kIGluc3RhbGxlZCAke3R5cGV9c2AsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiAnaW5zdGFsbCcsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS5pbnN0YWxsLFxuICAgICAgICAgIGhlbHA6IGBJbnN0YWxsIGEgJHt0eXBlfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiAndW5pbnN0YWxsJyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLnVuaW5zdGFsbCxcbiAgICAgICAgICBoZWxwOiBgVW5pbnN0YWxsIGEgJHt0eXBlfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb21tYW5kOiAndXBkYXRlJyxcbiAgICAgICAgICBhcmdzOiBleHRlbnNpb25BcmdzW3R5cGVdLnVwZGF0ZSxcbiAgICAgICAgICBoZWxwOiBgVXBkYXRlIGluc3RhbGxlZCAke3R5cGV9cyB0byB0aGUgbGF0ZXN0IHZlcnNpb25gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWFuZDogJ3J1bicsXG4gICAgICAgICAgYXJnczogZXh0ZW5zaW9uQXJnc1t0eXBlXS5ydW4sXG4gICAgICAgICAgaGVscDpcbiAgICAgICAgICAgIGBSdW4gYSBzY3JpcHQgKGRlZmluZWQgaW5zaWRlIHRoZSAke3R5cGV9J3MgcGFja2FnZS5qc29uIHVuZGVyIHRoZSBgICtcbiAgICAgICAgICAgIGDigJxzY3JpcHRz4oCdIGZpZWxkIGluc2lkZSB0aGUg4oCcYXBwaXVt4oCdIGZpZWxkKSBmcm9tIGFuIGluc3RhbGxlZCAke3R5cGV9YCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3Qge2NvbW1hbmQsIGFyZ3MsIGhlbHB9IG9mIHBhcnNlclNwZWNzKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IGV4dFN1YlBhcnNlcnMuYWRkX3BhcnNlcihjb21tYW5kLCB7aGVscH0pO1xuXG4gICAgICAgIEFyZ1BhcnNlci5fcGF0Y2hFeGl0KHBhcnNlcik7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZmxhZ3NPck5hbWVzLCBvcHRzXSBvZiBhcmdzKSB7XG4gICAgICAgICAgLy8gYWRkX2FyZ3VtZW50IG11dGF0ZXMgcGFyYW1zIHNvIG1ha2Ugc3VyZSB0byBzZW5kIGluIGNvcGllcyBpbnN0ZWFkXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoLi4uZmxhZ3NPck5hbWVzLCB7Li4ub3B0c30pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBBcmdQYXJzZXJ9IGluc3RhbmNlLiAgTmVjZXNzYXJpbHkgcmVhZHMgZXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb25cbiAqIGJlZm9yZWhhbmQsIGFuZCBmaW5hbGl6ZXMgdGhlIGNvbmZpZyBzY2hlbWEuXG4gKlxuICogQGNvbnN0cnVjdHMgQXJnUGFyc2VyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWJ1Z10gLSBJZiBgdHJ1ZWAsIHRocm93IGluc3RlYWQgb2YgZXhpdCB1cG9uIHBhcnNpbmcgZXJyb3JcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFyZ1BhcnNlcj59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhcnNlciAoZGVidWcgPSBmYWxzZSkge1xuICBhd2FpdCBCLmFsbChbZHJpdmVyQ29uZmlnLnJlYWQoKSwgcGx1Z2luQ29uZmlnLnJlYWQoKV0pO1xuICBmaW5hbGl6ZVNjaGVtYSgpO1xuXG4gIHJldHVybiBuZXcgQXJnUGFyc2VyKGRlYnVnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0UGFyc2VyO1xuZXhwb3J0IHsgZ2V0UGFyc2VyLCBBcmdQYXJzZXIgfTtcbiJdLCJmaWxlIjoibGliL2NsaS9wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -5,10 +5,10 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.RingBuffer = exports.JSON_SPACES = void 0;
8
9
  exports.errAndQuit = errAndQuit;
9
10
  exports.log = log;
10
11
  exports.spinWith = spinWith;
11
- exports.RingBuffer = exports.JSON_SPACES = void 0;
12
12
 
13
13
  require("source-map-support/register");
14
14
 
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.formatErrors = formatErrors;
9
+ exports.readConfigFile = readConfigFile;
10
+
11
+ require("source-map-support/register");
12
+
13
+ var _betterAjvErrors = _interopRequireDefault(require("@sidvind/better-ajv-errors"));
14
+
15
+ var _lilconfig = require("lilconfig");
16
+
17
+ var _lodash = _interopRequireDefault(require("lodash"));
18
+
19
+ var _yaml = _interopRequireDefault(require("yaml"));
20
+
21
+ var _schema = require("./schema/schema");
22
+
23
+ function yamlLoader(filepath, content) {
24
+ return _yaml.default.parse(content);
25
+ }
26
+
27
+ const rawConfig = new Map();
28
+
29
+ function jsonLoader(filepath, content) {
30
+ rawConfig.set(filepath, content);
31
+ return JSON.parse(content);
32
+ }
33
+
34
+ async function loadConfigFile(lc, filepath) {
35
+ try {
36
+ return await lc.load(filepath);
37
+ } catch (err) {
38
+ if (err.code === 'ENOENT') {
39
+ err.message = `Config file not found at user-provided path: ${filepath}`;
40
+ throw err;
41
+ } else if (err instanceof SyntaxError) {
42
+ err.message = `Config file at user-provided path ${filepath} is invalid:\n${err.message}`;
43
+ throw err;
44
+ }
45
+
46
+ throw err;
47
+ }
48
+ }
49
+
50
+ async function searchConfigFile(lc) {
51
+ return await lc.search();
52
+ }
53
+
54
+ function formatErrors(errors = [], config = {}, opts = {}) {
55
+ if (errors && !errors.length) {
56
+ throw new TypeError('Array of errors must be non-empty');
57
+ }
58
+
59
+ return (0, _betterAjvErrors.default)((0, _schema.getSchema)(opts.schemaId), config, errors, {
60
+ json: opts.json,
61
+ format: 'cli'
62
+ });
63
+ }
64
+
65
+ async function readConfigFile(filepath, opts = {}) {
66
+ const lc = (0, _lilconfig.lilconfig)('appium', {
67
+ loaders: {
68
+ '.yaml': yamlLoader,
69
+ '.yml': yamlLoader,
70
+ '.json': jsonLoader,
71
+ noExt: jsonLoader
72
+ },
73
+ packageProp: 'appiumConfig'
74
+ });
75
+ const result = filepath ? await loadConfigFile(lc, filepath) : await searchConfigFile(lc);
76
+
77
+ if (result && !result.isEmpty && result.filepath) {
78
+ const {
79
+ normalize = true,
80
+ pretty = true
81
+ } = opts;
82
+
83
+ try {
84
+ let configResult;
85
+ const errors = (0, _schema.validate)(result.config);
86
+
87
+ if (_lodash.default.isEmpty(errors)) {
88
+ configResult = { ...result,
89
+ errors
90
+ };
91
+ } else {
92
+ const reason = formatErrors(errors, result.config, {
93
+ json: rawConfig.get(result.filepath),
94
+ pretty
95
+ });
96
+ configResult = reason ? { ...result,
97
+ errors,
98
+ reason
99
+ } : { ...result,
100
+ errors
101
+ };
102
+ }
103
+
104
+ if (normalize) {
105
+ configResult.config = normalizeConfig(configResult.config);
106
+ }
107
+
108
+ return configResult;
109
+ } finally {
110
+ rawConfig.delete(result.filepath);
111
+ }
112
+ }
113
+
114
+ return result !== null && result !== void 0 ? result : {};
115
+ }
116
+
117
+ function normalizeConfig(config) {
118
+ const schema = (0, _schema.getSchema)();
119
+
120
+ const normalize = (config, section) => {
121
+ const obj = _lodash.default.isUndefined(section) ? config : _lodash.default.get(config, section, config);
122
+
123
+ const mappedObj = _lodash.default.mapKeys(obj, (__, prop) => {
124
+ var _schema$properties$pr, _schema$properties$pr2;
125
+
126
+ return (_schema$properties$pr = (_schema$properties$pr2 = schema.properties[prop]) === null || _schema$properties$pr2 === void 0 ? void 0 : _schema$properties$pr2.appiumCliDest) !== null && _schema$properties$pr !== void 0 ? _schema$properties$pr : _lodash.default.camelCase(prop);
127
+ });
128
+
129
+ return _lodash.default.mapValues(mappedObj, (value, property) => {
130
+ const nextSection = section ? `${section}.${property}` : property;
131
+ return isSchemaTypeObject(value) ? normalize(config, nextSection) : value;
132
+ });
133
+ };
134
+
135
+ const isSchemaTypeObject = schema => Boolean(schema.properties);
136
+
137
+ return normalize(config);
138
+ }require('source-map-support').install();
139
+
140
+
141
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb25maWctZmlsZS5qcyJdLCJuYW1lcyI6WyJ5YW1sTG9hZGVyIiwiZmlsZXBhdGgiLCJjb250ZW50IiwieWFtbCIsInBhcnNlIiwicmF3Q29uZmlnIiwiTWFwIiwianNvbkxvYWRlciIsInNldCIsIkpTT04iLCJsb2FkQ29uZmlnRmlsZSIsImxjIiwibG9hZCIsImVyciIsImNvZGUiLCJtZXNzYWdlIiwiU3ludGF4RXJyb3IiLCJzZWFyY2hDb25maWdGaWxlIiwic2VhcmNoIiwiZm9ybWF0RXJyb3JzIiwiZXJyb3JzIiwiY29uZmlnIiwib3B0cyIsImxlbmd0aCIsIlR5cGVFcnJvciIsInNjaGVtYUlkIiwianNvbiIsImZvcm1hdCIsInJlYWRDb25maWdGaWxlIiwibG9hZGVycyIsIm5vRXh0IiwicGFja2FnZVByb3AiLCJyZXN1bHQiLCJpc0VtcHR5Iiwibm9ybWFsaXplIiwicHJldHR5IiwiY29uZmlnUmVzdWx0IiwiXyIsInJlYXNvbiIsImdldCIsIm5vcm1hbGl6ZUNvbmZpZyIsImRlbGV0ZSIsInNjaGVtYSIsInNlY3Rpb24iLCJvYmoiLCJpc1VuZGVmaW5lZCIsIm1hcHBlZE9iaiIsIm1hcEtleXMiLCJfXyIsInByb3AiLCJwcm9wZXJ0aWVzIiwiYXBwaXVtQ2xpRGVzdCIsImNhbWVsQ2FzZSIsIm1hcFZhbHVlcyIsInZhbHVlIiwicHJvcGVydHkiLCJuZXh0U2VjdGlvbiIsImlzU2NoZW1hVHlwZU9iamVjdCIsIkJvb2xlYW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BLFNBQVNBLFVBQVQsQ0FBcUJDLFFBQXJCLEVBQStCQyxPQUEvQixFQUF3QztBQUN0QyxTQUFPQyxjQUFLQyxLQUFMLENBQVdGLE9BQVgsQ0FBUDtBQUNEOztBQVFELE1BQU1HLFNBQVMsR0FBRyxJQUFJQyxHQUFKLEVBQWxCOztBQU9BLFNBQVNDLFVBQVQsQ0FBcUJOLFFBQXJCLEVBQStCQyxPQUEvQixFQUF3QztBQUN0Q0csRUFBQUEsU0FBUyxDQUFDRyxHQUFWLENBQWNQLFFBQWQsRUFBd0JDLE9BQXhCO0FBQ0EsU0FBT08sSUFBSSxDQUFDTCxLQUFMLENBQVdGLE9BQVgsQ0FBUDtBQUNEOztBQVFELGVBQWVRLGNBQWYsQ0FBK0JDLEVBQS9CLEVBQW1DVixRQUFuQyxFQUE2QztBQUMzQyxNQUFJO0FBRUYsV0FBTyxNQUFNVSxFQUFFLENBQUNDLElBQUgsQ0FBUVgsUUFBUixDQUFiO0FBQ0QsR0FIRCxDQUdFLE9BQTZCWSxHQUE3QixFQUFrQztBQUNsQyxRQUF5Q0EsR0FBRCxDQUFNQyxJQUFOLEtBQWUsUUFBdkQsRUFBaUU7QUFDMUJELE1BQUFBLEdBQUQsQ0FBTUUsT0FBTixHQUFpQixnREFBK0NkLFFBQVMsRUFBekU7QUFDcEMsWUFBTVksR0FBTjtBQUNELEtBSEQsTUFHTyxJQUFJQSxHQUFHLFlBQVlHLFdBQW5CLEVBQWdDO0FBRXJDSCxNQUFBQSxHQUFHLENBQUNFLE9BQUosR0FBZSxxQ0FBb0NkLFFBQVMsaUJBQWdCWSxHQUFHLENBQUNFLE9BQVEsRUFBeEY7QUFDQSxZQUFNRixHQUFOO0FBQ0Q7O0FBQ0QsVUFBTUEsR0FBTjtBQUNEO0FBQ0Y7O0FBT0QsZUFBZUksZ0JBQWYsQ0FBaUNOLEVBQWpDLEVBQXFDO0FBQ25DLFNBQU8sTUFBTUEsRUFBRSxDQUFDTyxNQUFILEVBQWI7QUFDRDs7QUFpQk0sU0FBU0MsWUFBVCxDQUF1QkMsTUFBTSxHQUFHLEVBQWhDLEVBQW9DQyxNQUFNLEdBQUcsRUFBN0MsRUFBaURDLElBQUksR0FBRyxFQUF4RCxFQUE0RDtBQUNqRSxNQUFJRixNQUFNLElBQUksQ0FBQ0EsTUFBTSxDQUFDRyxNQUF0QixFQUE4QjtBQUM1QixVQUFNLElBQUlDLFNBQUosQ0FBYyxtQ0FBZCxDQUFOO0FBQ0Q7O0FBQ0QsU0FBTyw4QkFBZ0IsdUJBQVVGLElBQUksQ0FBQ0csUUFBZixDQUFoQixFQUEwQ0osTUFBMUMsRUFBa0RELE1BQWxELEVBQTBEO0FBQy9ETSxJQUFBQSxJQUFJLEVBQUVKLElBQUksQ0FBQ0ksSUFEb0Q7QUFFL0RDLElBQUFBLE1BQU0sRUFBRTtBQUZ1RCxHQUExRCxDQUFQO0FBSUQ7O0FBV00sZUFBZUMsY0FBZixDQUErQjNCLFFBQS9CLEVBQXlDcUIsSUFBSSxHQUFHLEVBQWhELEVBQW9EO0FBQ3pELFFBQU1YLEVBQUUsR0FBRywwQkFBVSxRQUFWLEVBQW9CO0FBQzdCa0IsSUFBQUEsT0FBTyxFQUFFO0FBQ1AsZUFBUzdCLFVBREY7QUFFUCxjQUFRQSxVQUZEO0FBR1AsZUFBU08sVUFIRjtBQUlQdUIsTUFBQUEsS0FBSyxFQUFFdkI7QUFKQSxLQURvQjtBQU83QndCLElBQUFBLFdBQVcsRUFBRTtBQVBnQixHQUFwQixDQUFYO0FBVUEsUUFBTUMsTUFBTSxHQUFHL0IsUUFBUSxHQUNuQixNQUFNUyxjQUFjLENBQUNDLEVBQUQsRUFBS1YsUUFBTCxDQURELEdBRW5CLE1BQU1nQixnQkFBZ0IsQ0FBQ04sRUFBRCxDQUYxQjs7QUFJQSxNQUFJcUIsTUFBTSxJQUFJLENBQUNBLE1BQU0sQ0FBQ0MsT0FBbEIsSUFBNkJELE1BQU0sQ0FBQy9CLFFBQXhDLEVBQWtEO0FBQ2hELFVBQU07QUFBQ2lDLE1BQUFBLFNBQVMsR0FBRyxJQUFiO0FBQW1CQyxNQUFBQSxNQUFNLEdBQUc7QUFBNUIsUUFBb0NiLElBQTFDOztBQUNBLFFBQUk7QUFFRixVQUFJYyxZQUFKO0FBQ0EsWUFBTWhCLE1BQU0sR0FBRyxzQkFBU1ksTUFBTSxDQUFDWCxNQUFoQixDQUFmOztBQUNBLFVBQUlnQixnQkFBRUosT0FBRixDQUFVYixNQUFWLENBQUosRUFBdUI7QUFDckJnQixRQUFBQSxZQUFZLEdBQUcsRUFBQyxHQUFHSixNQUFKO0FBQVlaLFVBQUFBO0FBQVosU0FBZjtBQUNELE9BRkQsTUFFTztBQUNMLGNBQU1rQixNQUFNLEdBQUduQixZQUFZLENBQUNDLE1BQUQsRUFBU1ksTUFBTSxDQUFDWCxNQUFoQixFQUF3QjtBQUNqREssVUFBQUEsSUFBSSxFQUFFckIsU0FBUyxDQUFDa0MsR0FBVixDQUFjUCxNQUFNLENBQUMvQixRQUFyQixDQUQyQztBQUVqRGtDLFVBQUFBO0FBRmlELFNBQXhCLENBQTNCO0FBSUFDLFFBQUFBLFlBQVksR0FBR0UsTUFBTSxHQUNqQixFQUFDLEdBQUdOLE1BQUo7QUFBWVosVUFBQUEsTUFBWjtBQUFvQmtCLFVBQUFBO0FBQXBCLFNBRGlCLEdBRWpCLEVBQUMsR0FBR04sTUFBSjtBQUFZWixVQUFBQTtBQUFaLFNBRko7QUFHRDs7QUFFRCxVQUFJYyxTQUFKLEVBQWU7QUFFYkUsUUFBQUEsWUFBWSxDQUFDZixNQUFiLEdBQXNCbUIsZUFBZSxDQUNOSixZQUFZLENBQUNmLE1BRFAsQ0FBckM7QUFHRDs7QUFFRCxhQUFPZSxZQUFQO0FBQ0QsS0F4QkQsU0F3QlU7QUFFUi9CLE1BQUFBLFNBQVMsQ0FBQ29DLE1BQVYsQ0FBaUJULE1BQU0sQ0FBQy9CLFFBQXhCO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPK0IsTUFBUCxhQUFPQSxNQUFQLGNBQU9BLE1BQVAsR0FBaUIsRUFBakI7QUFDRDs7QUFPRCxTQUFTUSxlQUFULENBQTBCbkIsTUFBMUIsRUFBa0M7QUFDaEMsUUFBTXFCLE1BQU0sR0FBRyx3QkFBZjs7QUFNQSxRQUFNUixTQUFTLEdBQUcsQ0FBQ2IsTUFBRCxFQUFTc0IsT0FBVCxLQUFxQjtBQUNyQyxVQUFNQyxHQUFHLEdBQUdQLGdCQUFFUSxXQUFGLENBQWNGLE9BQWQsSUFBeUJ0QixNQUF6QixHQUFrQ2dCLGdCQUFFRSxHQUFGLENBQU1sQixNQUFOLEVBQWNzQixPQUFkLEVBQXVCdEIsTUFBdkIsQ0FBOUM7O0FBRUEsVUFBTXlCLFNBQVMsR0FBR1QsZ0JBQUVVLE9BQUYsQ0FBVUgsR0FBVixFQUFlLENBQUNJLEVBQUQsRUFBS0MsSUFBTDtBQUFBOztBQUFBLGdFQUMvQlAsTUFBTSxDQUFDUSxVQUFQLENBQWtCRCxJQUFsQixDQUQrQiwyREFDL0IsdUJBQXlCRSxhQURNLHlFQUNXZCxnQkFBRWUsU0FBRixDQUFZSCxJQUFaLENBRFg7QUFBQSxLQUFmLENBQWxCOztBQUlBLFdBQU9aLGdCQUFFZ0IsU0FBRixDQUFZUCxTQUFaLEVBQXVCLENBQUNRLEtBQUQsRUFBUUMsUUFBUixLQUFxQjtBQUNqRCxZQUFNQyxXQUFXLEdBQUdiLE9BQU8sR0FBSSxHQUFFQSxPQUFRLElBQUdZLFFBQVMsRUFBMUIsR0FBOEJBLFFBQXpEO0FBQ0EsYUFBT0Usa0JBQWtCLENBQUNILEtBQUQsQ0FBbEIsR0FBNEJwQixTQUFTLENBQUNiLE1BQUQsRUFBU21DLFdBQVQsQ0FBckMsR0FBNkRGLEtBQXBFO0FBQ0QsS0FITSxDQUFQO0FBSUQsR0FYRDs7QUFpQkEsUUFBTUcsa0JBQWtCLEdBQUlmLE1BQUQsSUFBWWdCLE9BQU8sQ0FBQ2hCLE1BQU0sQ0FBQ1EsVUFBUixDQUE5Qzs7QUFFQSxTQUFPaEIsU0FBUyxDQUFDYixNQUFELENBQWhCO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGJldHRlckFqdkVycm9ycyBmcm9tICdAc2lkdmluZC9iZXR0ZXItYWp2LWVycm9ycyc7XG5pbXBvcnQgeyBsaWxjb25maWcgfSBmcm9tICdsaWxjb25maWcnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB5YW1sIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgZ2V0U2NoZW1hLCB2YWxpZGF0ZSB9IGZyb20gJy4vc2NoZW1hL3NjaGVtYSc7XG5cbi8qKlxuICogbGlsY29uZmlnIGxvYWRlciB0byBoYW5kbGUgYC55YW1sYCBmaWxlc1xuICogQHR5cGUge2ltcG9ydCgnbGlsY29uZmlnJykuTG9hZGVyU3luY31cbiAqL1xuZnVuY3Rpb24geWFtbExvYWRlciAoZmlsZXBhdGgsIGNvbnRlbnQpIHtcbiAgcmV0dXJuIHlhbWwucGFyc2UoY29udGVudCk7XG59XG5cbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgcmF3IGNvbmZpZyBmaWxlIChhIEpTT04gc3RyaW5nKSBhdCBhIGZpbGVwYXRoLlxuICogVGhpcyBpcyB1c2VkIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLlxuICogTm90ZSB0aGF0IGNvbmZpZyBmaWxlcyBuZWVkbid0IGJlIEpTT04sIGJ1dCBpdCBoZWxwcyBpZiB0aGV5IGFyZS5cbiAqIEB0eXBlIHtNYXA8c3RyaW5nLFJhd0pzb24+fVxuICovXG5jb25zdCByYXdDb25maWcgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gbG9hZGVyIHRoYXQgY2FjaGVzIHRoZSByYXcgY29uZmlnIGZpbGUgKGZvciB1c2Ugd2l0aCBgYmV0dGVyLWFqdi1lcnJvcnNgKS5cbiAqIElmIGl0IHdlcmVuJ3QgZm9yIHRoaXMgY2FjaGUsIHRoaXMgd291bGQgYmUgdW5uZWNlc3NhcnkuXG4gKiBAdHlwZSB7aW1wb3J0KCdsaWxjb25maWcnKS5Mb2FkZXJTeW5jfVxuICovXG5mdW5jdGlvbiBqc29uTG9hZGVyIChmaWxlcGF0aCwgY29udGVudCkge1xuICByYXdDb25maWcuc2V0KGZpbGVwYXRoLCBjb250ZW50KTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCk7XG59XG5cbi8qKlxuICogTG9hZHMgYSBjb25maWcgZmlsZSBmcm9tIGFuIGV4cGxpY2l0IHBhdGhcbiAqIEBwYXJhbSB7TGlsY29uZmlnQXN5bmNTZWFyY2hlcn0gbGMgLSBsaWxjb25maWcgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlcGF0aCAtIFBhdGggdG8gY29uZmlnIGZpbGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydCgnbGlsY29uZmlnJykuTGlsY29uZmlnUmVzdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZ0ZpbGUgKGxjLCBmaWxlcGF0aCkge1xuICB0cnkge1xuICAgIC8vIHJlbW92aW5nIFwiYXdhaXRcIiB3aWxsIGNhdXNlIGFueSByZWplY3Rpb24gdG8gX25vdF8gYmUgY2F1Z2h0IGluIHRoaXMgYmxvY2shXG4gICAgcmV0dXJuIGF3YWl0IGxjLmxvYWQoZmlsZXBhdGgpO1xuICB9IGNhdGNoICgvKiogQHR5cGUge3Vua25vd259ICovZXJyKSB7XG4gICAgaWYgKC8qKiBAdHlwZSB7Tm9kZUpTLkVycm5vRXhjZXB0aW9ufSAqLyhlcnIpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAvKiogQHR5cGUge05vZGVKUy5FcnJub0V4Y2VwdGlvbn0gKi8oZXJyKS5tZXNzYWdlID0gYENvbmZpZyBmaWxlIG5vdCBmb3VuZCBhdCB1c2VyLXByb3ZpZGVkIHBhdGg6ICR7ZmlsZXBhdGh9YDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAvLyBnZW5lcmFsbHkgaW52YWxpZCBKU09OXG4gICAgICBlcnIubWVzc2FnZSA9IGBDb25maWcgZmlsZSBhdCB1c2VyLXByb3ZpZGVkIHBhdGggJHtmaWxlcGF0aH0gaXMgaW52YWxpZDpcXG4ke2Vyci5tZXNzYWdlfWA7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIFNlYXJjaGVzIGZvciBhIGNvbmZpZyBmaWxlXG4gKiBAcGFyYW0ge0xpbGNvbmZpZ0FzeW5jU2VhcmNoZXJ9IGxjIC0gbGlsY29uZmlnIGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoJ2xpbGNvbmZpZycpLkxpbGNvbmZpZ1Jlc3VsdD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaENvbmZpZ0ZpbGUgKGxjKSB7XG4gIHJldHVybiBhd2FpdCBsYy5zZWFyY2goKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBhcnJheSBvZiBlcnJvcnMgYW5kIHRoZSByZXN1bHQgb2YgbG9hZGluZyBhIGNvbmZpZyBmaWxlLCBnZW5lcmF0ZSBhXG4gKiBoZWxwZnVsIHN0cmluZyBmb3IgdGhlIHVzZXIuXG4gKlxuICogLSBJZiBgb3B0c2AgY29udGFpbnMgYSBganNvbmAgcHJvcGVydHksIHRoaXMgc2hvdWxkIGJlIHRoZSBvcmlnaW5hbCBKU09OXG4gKiAgIF9zdHJpbmdfIG9mIHRoZSBjb25maWcgZmlsZS4gIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGlmIHRoZSBjb25maWcgZmlsZVxuICogICB3YXMgaW4gSlNPTiBmb3JtYXQuIElmIHByZXNlbnQsIGl0IHdpbGwgYXNzb2NpYXRlIGxpbmUgbnVtYmVycyB3aXRoIGVycm9ycy5cbiAqIC0gSWYgYGVycm9yc2AgaGFwcGVucyB0byBiZSBlbXB0eSwgdGhpcyB3aWxsIHRocm93LlxuICogQHBhcmFtIHtpbXBvcnQoJ2FqdicpLkVycm9yT2JqZWN0W119IGVycm9ycyAtIE5vbi1lbXB0eSBhcnJheSBvZiBlcnJvcnMuIFJlcXVpcmVkLlxuICogQHBhcmFtIHtSZWFkQ29uZmlnRmlsZVJlc3VsdFsnY29uZmlnJ118YW55fSBbY29uZmlnXSAtXG4gKiBDb25maWd1cmF0aW9uICYgbWV0YWRhdGFcbiAqIEBwYXJhbSB7Rm9ybWF0Q29uZmlnRXJyb3JzT3B0aW9uc30gW29wdHNdXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGBlcnJvcnNgIGlzIGVtcHR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXJyb3JzIChlcnJvcnMgPSBbXSwgY29uZmlnID0ge30sIG9wdHMgPSB7fSkge1xuICBpZiAoZXJyb3JzICYmICFlcnJvcnMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkgb2YgZXJyb3JzIG11c3QgYmUgbm9uLWVtcHR5Jyk7XG4gIH1cbiAgcmV0dXJuIGJldHRlckFqdkVycm9ycyhnZXRTY2hlbWEob3B0cy5zY2hlbWFJZCksIGNvbmZpZywgZXJyb3JzLCB7XG4gICAganNvbjogb3B0cy5qc29uLFxuICAgIGZvcm1hdDogJ2NsaScsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIG9wdGlvbmFsIHBhdGgsIHJlYWQgYSBjb25maWcgZmlsZS4gVmFsaWRhdGVzIHRoZSBjb25maWcgZmlsZS5cbiAqXG4gKiBDYWxsIHtAbGluayB2YWxpZGF0ZX0gaWYgeW91IGFscmVhZHkgaGF2ZSBhIGNvbmZpZyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZpbGVwYXRoXSAtIFBhdGggdG8gY29uZmlnIGZpbGUsIGlmIHdlIGhhdmUgb25lXG4gKiBAcGFyYW0ge1JlYWRDb25maWdGaWxlT3B0aW9uc30gW29wdHNdIC0gT3B0aW9uc1xuICogQHB1YmxpY1xuICogQHJldHVybnMge1Byb21pc2U8UmVhZENvbmZpZ0ZpbGVSZXN1bHQ+fSBDb250YWlucyBjb25maWcgYW5kIGZpbGVwYXRoLCBpZiBmb3VuZCwgYW5kIGFueSBlcnJvcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRDb25maWdGaWxlIChmaWxlcGF0aCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGxjID0gbGlsY29uZmlnKCdhcHBpdW0nLCB7XG4gICAgbG9hZGVyczoge1xuICAgICAgJy55YW1sJzogeWFtbExvYWRlcixcbiAgICAgICcueW1sJzogeWFtbExvYWRlcixcbiAgICAgICcuanNvbic6IGpzb25Mb2FkZXIsXG4gICAgICBub0V4dDoganNvbkxvYWRlcixcbiAgICB9LFxuICAgIHBhY2thZ2VQcm9wOiAnYXBwaXVtQ29uZmlnJ1xuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBmaWxlcGF0aFxuICAgID8gYXdhaXQgbG9hZENvbmZpZ0ZpbGUobGMsIGZpbGVwYXRoKVxuICAgIDogYXdhaXQgc2VhcmNoQ29uZmlnRmlsZShsYyk7XG5cbiAgaWYgKHJlc3VsdCAmJiAhcmVzdWx0LmlzRW1wdHkgJiYgcmVzdWx0LmZpbGVwYXRoKSB7XG4gICAgY29uc3Qge25vcm1hbGl6ZSA9IHRydWUsIHByZXR0eSA9IHRydWV9ID0gb3B0cztcbiAgICB0cnkge1xuICAgICAgLyoqIEB0eXBlIHtSZWFkQ29uZmlnRmlsZVJlc3VsdH0gKi9cbiAgICAgIGxldCBjb25maWdSZXN1bHQ7XG4gICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZShyZXN1bHQuY29uZmlnKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZXJyb3JzKSkge1xuICAgICAgICBjb25maWdSZXN1bHQgPSB7Li4ucmVzdWx0LCBlcnJvcnN9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZm9ybWF0RXJyb3JzKGVycm9ycywgcmVzdWx0LmNvbmZpZywge1xuICAgICAgICAgIGpzb246IHJhd0NvbmZpZy5nZXQocmVzdWx0LmZpbGVwYXRoKSxcbiAgICAgICAgICBwcmV0dHksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25maWdSZXN1bHQgPSByZWFzb25cbiAgICAgICAgICA/IHsuLi5yZXN1bHQsIGVycm9ycywgcmVhc29ufVxuICAgICAgICAgIDogey4uLnJlc3VsdCwgZXJyb3JzfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICAvLyBub3JtYWxpemUgKHRvIGNhbWVsIGNhc2UpIGFsbCB0b3AtbGV2ZWwgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGNvbmZpZyBmaWxlXG4gICAgICAgIGNvbmZpZ1Jlc3VsdC5jb25maWcgPSBub3JtYWxpemVDb25maWcoXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcHBpdW1Db25maWd9ICovIChjb25maWdSZXN1bHQuY29uZmlnKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbmZpZ1Jlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gY2xlYW4gdXAgdGhlIHJhdyBjb25maWcgZmlsZSBjYWNoZSwgd2hpY2ggaXMgb25seSBrZXB0IHRvIGJldHRlciByZXBvcnQgZXJyb3JzLlxuICAgICAgcmF3Q29uZmlnLmRlbGV0ZShyZXN1bHQuZmlsZXBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0ID8/IHt9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgc2NoZW1hIHByb3BlcnR5IG5hbWVzIHRvIGVpdGhlciBhKSB0aGUgdmFsdWUgb2YgdGhlIGBhcHBpdW1DbGlEZXN0YCBwcm9wZXJ0eSwgaWYgYW55OyBvciBiKSBjYW1lbC1jYXNlXG4gKiBAcGFyYW0ge0FwcGl1bUNvbmZpZ30gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtOb3JtYWxpemVkQXBwaXVtQ29uZmlnfSBOZXcgb2JqZWN0IHdpdGggY2FtZWwtY2FzZWQga2V5cyAob3IgYGRlc3RgIGtleXMpLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVDb25maWcgKGNvbmZpZykge1xuICBjb25zdCBzY2hlbWEgPSBnZXRTY2hlbWEoKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QXBwaXVtQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWN0aW9uXSAtIEtleXBhdGggKGxvZGFzaCBgXy5nZXQoKWAgc3R5bGUpIHRvIHNlY3Rpb24gb2YgY29uZmlnLiBJZiBvbWl0dGVkLCBhc3N1bWUgcm9vdCBBcHBpdW0gY29uZmlnIHNjaGVtYVxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIHNlY3Rpb24gb2YgY29uZmlnXG4gICAqL1xuICBjb25zdCBub3JtYWxpemUgPSAoY29uZmlnLCBzZWN0aW9uKSA9PiB7XG4gICAgY29uc3Qgb2JqID0gXy5pc1VuZGVmaW5lZChzZWN0aW9uKSA/IGNvbmZpZyA6IF8uZ2V0KGNvbmZpZywgc2VjdGlvbiwgY29uZmlnKTtcblxuICAgIGNvbnN0IG1hcHBlZE9iaiA9IF8ubWFwS2V5cyhvYmosIChfXywgcHJvcCkgPT5cbiAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BdPy5hcHBpdW1DbGlEZXN0ID8/IF8uY2FtZWxDYXNlKHByb3ApLFxuICAgICk7XG5cbiAgICByZXR1cm4gXy5tYXBWYWx1ZXMobWFwcGVkT2JqLCAodmFsdWUsIHByb3BlcnR5KSA9PiB7XG4gICAgICBjb25zdCBuZXh0U2VjdGlvbiA9IHNlY3Rpb24gPyBgJHtzZWN0aW9ufS4ke3Byb3BlcnR5fWAgOiBwcm9wZXJ0eTtcbiAgICAgIHJldHVybiBpc1NjaGVtYVR5cGVPYmplY3QodmFsdWUpID8gbm9ybWFsaXplKGNvbmZpZywgbmV4dFNlY3Rpb24pIDogdmFsdWU7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzY2hlbWEgcHJvcCByZWZlcmVuY2VzIGFuIG9iamVjdCwgb3IgaWYgaXQncyBhbiBvYmplY3QgaXRzZWxmXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8b2JqZWN0fSBzY2hlbWEgLSBSZWZlcmVuY2luZyBzY2hlbWEgb2JqZWN0XG4gICAqL1xuICBjb25zdCBpc1NjaGVtYVR5cGVPYmplY3QgPSAoc2NoZW1hKSA9PiBCb29sZWFuKHNjaGVtYS5wcm9wZXJ0aWVzKTtcblxuICByZXR1cm4gbm9ybWFsaXplKGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGNhbGxpbmcge0BsaW5rIHJlYWRDb25maWdGaWxlfS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlYWRDb25maWdGaWxlUmVzdWx0XG4gKiBAcHJvcGVydHkge2ltcG9ydCgnYWp2JykuRXJyb3JPYmplY3RbXX0gW2Vycm9yc10gLSBWYWxpZGF0aW9uIGVycm9yc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmaWxlcGF0aF0gLSBUaGUgcGF0aCB0byB0aGUgY29uZmlnIGZpbGUsIGlmIGZvdW5kXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpc0VtcHR5XSAtIElmIGB0cnVlYCwgdGhlIGNvbmZpZyBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHlcbiAqIEBwcm9wZXJ0eSB7QXBwaXVtQ29uZmlnfSBbY29uZmlnXSAtIFRoZSBwYXJzZWQgY29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd8YmV0dGVyQWp2RXJyb3JzLklPdXRwdXRFcnJvcltdfSBbcmVhc29uXSAtIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdWdnZXN0aW9ucy4gSWYgdGhlIGBwcmV0dHlgIG9wdGlvbiBpcyBgdHJ1ZWAsIHRoaXMgd2lsbCBiZSBhIG5pY2Ugc3RyaW5nIHRvIHByaW50LlxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlYWRDb25maWdGaWxlfS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlYWRDb25maWdGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJldHR5PXRydWVdIElmIGBmYWxzZWAsIGRvIG5vdCB1c2UgY29sb3IgYW5kIGZhbmN5IGZvcm1hdHRpbmcgaW4gdGhlIGByZWFzb25gIHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgUmVhZENvbmZpZ0ZpbGVSZXN1bHR9LiBUaGUgdmFsdWUgb2YgYHJlYXNvbmAgaXMgdGhlbiBzdWl0YWJsZSBmb3IgbWFjaGluZS1yZWFkaW5nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbm9ybWFsaXplPXRydWVdIElmIGBmYWxzZWAsIGRvIG5vdCBub3JtYWxpemUga2V5IG5hbWVzIHRvIGNhbWVsIGNhc2UuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGBBc3luY1NlYXJjaGVyYCB3aGljaCBpcyBpbmV4cGxpY2FibHkgX25vdF8gZXhwb3J0ZWQgYnkgdGhlIGBsaWxjb25maWdgIHR5cGUgZGVmaW5pdGlvbi5cbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPGltcG9ydCgnbGlsY29uZmlnJylbXCJsaWxjb25maWdcIl0+fSBMaWxjb25maWdBc3luY1NlYXJjaGVyXG4gKi9cblxuLyoqXG4gKiBUaGUgY29udGVudHMgb2YgYW4gQXBwaXVtIGNvbmZpZyBmaWxlLiBHZW5lcmF0ZWQgZnJvbSBzY2hlbWFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3R5cGVzL3R5cGVzJykuQXBwaXVtQ29uZmlnfSBBcHBpdW1Db25maWdcbiAqL1xuXG4vKipcbiAqIFRoZSBjb250ZW50cyBvZiBhbiBBcHBpdW0gY29uZmlnIGZpbGUgd2l0aCBjYW1lbGNhc2VkIHByb3BlcnR5IG5hbWVzIChhbmQgdXNpbmcgYGFwcGl1bUNsaURlc3RgIHZhbHVlIGlmIHByZXNlbnQpLiBHZW5lcmF0ZWQgZnJvbSB7QGxpbmsgQXBwaXVtQ29uZmlnfVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vdHlwZXMvdHlwZXMnKS5Ob3JtYWxpemVkQXBwaXVtQ29uZmlnfSBOb3JtYWxpemVkQXBwaXVtQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBUaGUgc3RyaW5nIHNob3VsZCBiZSBhIHJhdyBKU09OIHN0cmluZy5cbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFJhd0pzb25cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRFcnJvcnN9LlxuICogQHR5cGVkZWYge09iamVjdH0gRm9ybWF0Q29uZmlnRXJyb3JzT3B0aW9uc1xuICogQHByb3BlcnR5IHtpbXBvcnQoJy4vY29uZmlnLWZpbGUnKS5SYXdKc29ufSBbanNvbl0gLSBSYXcgSlNPTiBjb25maWcgKGFzIHN0cmluZylcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3ByZXR0eT10cnVlXSAtIFdoZXRoZXIgdG8gZm9ybWF0IGVycm9ycyBhcyBhIENMSS1mcmllbmRseSBzdHJpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSAgW3NjaGVtYUlkXSAtIFNwZWNpZmljIElEIG9mIGEgcHJvcDsgb3RoZXJ3aXNlIGVudGlyZSBzY2hlbWFcbiAqL1xuIl0sImZpbGUiOiJsaWIvY29uZmlnLWZpbGUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==