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
@@ -1,232 +1,75 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
- exports.USE_ALL_PLUGINS = exports.extensionArgs = exports.serverArgs = exports.sharedArgs = void 0;
8
+ Object.defineProperty(exports, "APPIUM_HOME", {
9
+ enumerable: true,
10
+ get: function () {
11
+ return _extensionConfig.APPIUM_HOME;
12
+ }
13
+ });
14
+ exports.getExtensionArgs = exports.driverConfig = exports.USE_ALL_PLUGINS = void 0;
15
+ exports.getServerArgs = getServerArgs;
16
+ exports.pluginConfig = void 0;
7
17
 
8
18
  require("source-map-support/register");
9
19
 
10
20
  var _baseDriver = require("@appium/base-driver");
11
21
 
12
- var _parserHelpers = require("./parser-helpers");
22
+ var _lodash = _interopRequireDefault(require("lodash"));
23
+
24
+ var _driverConfig = _interopRequireDefault(require("../driver-config"));
13
25
 
14
26
  var _extensionConfig = require("../extension-config");
15
27
 
16
- var _argparseActions = require("./argparse-actions");
28
+ var _pluginConfig = _interopRequireDefault(require("../plugin-config"));
29
+
30
+ var _cliArgs = require("../schema/cli-args");
17
31
 
18
32
  const DRIVER_EXAMPLE = 'xcuitest';
19
33
  const PLUGIN_EXAMPLE = 'find_by_image';
20
34
  const USE_ALL_PLUGINS = 'all';
21
35
  exports.USE_ALL_PLUGINS = USE_ALL_PLUGINS;
22
- const sharedArgs = [[['-ah', '--home', '--appium-home'], {
23
- required: false,
24
- default: process.env.APPIUM_HOME || _extensionConfig.DEFAULT_APPIUM_HOME,
25
- help: 'The path to the directory where Appium will keep installed drivers, plugins, and any other metadata necessary for its operation',
26
- dest: 'appiumHome'
27
- }], [['--log-filters'], {
28
- dest: 'logFilters',
29
- default: null,
30
- required: false,
31
- action: 'store_true',
32
- help: 'Set the full path to a JSON file containing one or more log filtering rules'
33
- }]];
34
- exports.sharedArgs = sharedArgs;
35
- const serverArgs = [[['--shell'], {
36
- required: false,
37
- default: null,
38
- help: 'Enter REPL mode',
39
- action: 'store_true',
40
- dest: 'shell'
41
- }], [['--drivers'], {
42
- required: false,
43
- default: [],
44
- help: `A comma-separated list of installed driver names that should be active for this ` + `server. All drivers will be active by default.`,
45
- type: _parserHelpers.parseDriverNames,
46
- dest: 'drivers'
47
- }], [['--plugins'], {
48
- required: false,
49
- default: [],
50
- help: `A comma-separated list of installed plugin names that should be active for this ` + `server. To activate all plugins, you can use the single string "${USE_ALL_PLUGINS}" ` + `as the value (e.g. --plugins=${USE_ALL_PLUGINS})`,
51
- type: _parserHelpers.parsePluginNames,
52
- dest: 'plugins'
53
- }], [['--allow-cors'], {
54
- required: false,
55
- default: false,
56
- action: 'store_true',
57
- help: 'Whether the Appium server should allow web browser connections from any host',
58
- dest: 'allowCors'
59
- }], [['-a', '--address'], {
60
- default: '0.0.0.0',
61
- required: false,
62
- help: 'IP Address to listen on',
63
- dest: 'address'
64
- }], [['-p', '--port'], {
65
- default: 4723,
66
- required: false,
67
- type: 'int',
68
- help: 'port to listen on',
69
- dest: 'port'
70
- }], [['-pa', '--base-path'], {
71
- required: false,
72
- default: _baseDriver.DEFAULT_BASE_PATH,
73
- dest: 'basePath',
74
- help: 'Base path to use as the prefix for all webdriver routes running ' + `on this server`
75
- }], [['-ka', '--keep-alive-timeout'], {
76
- required: false,
77
- default: null,
78
- dest: 'keepAliveTimeout',
79
- type: 'int',
80
- help: 'Number of seconds the Appium server should apply as both the keep-alive timeout ' + 'and the connection timeout for all requests. Defaults to 600 (10 minutes).'
81
- }], [['-ca', '--callback-address'], {
82
- required: false,
83
- dest: 'callbackAddress',
84
- default: null,
85
- help: 'callback IP Address (default: same as --address)'
86
- }], [['-cp', '--callback-port'], {
87
- required: false,
88
- dest: 'callbackPort',
89
- default: null,
90
- type: 'int',
91
- help: 'callback port (default: same as port)'
92
- }], [['--session-override'], {
93
- default: false,
94
- dest: 'sessionOverride',
95
- action: 'store_true',
96
- required: false,
97
- help: 'Enables session override (clobbering)'
98
- }], [['-g', '--log'], {
99
- default: null,
100
- dest: 'logFile',
101
- required: false,
102
- help: 'Also send log output to this file'
103
- }], [['--log-level'], {
104
- choices: ['info', 'info:debug', 'info:info', 'info:warn', 'info:error', 'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error', 'error', 'error:debug', 'error:info', 'error:warn', 'error:error', 'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error'],
105
- default: 'debug',
106
- dest: 'loglevel',
107
- required: false,
108
- help: 'log level; default (console[:file]): debug[:debug]'
109
- }], [['--log-timestamp'], {
110
- default: false,
111
- required: false,
112
- help: 'Show timestamps in console output',
113
- action: 'store_true',
114
- dest: 'logTimestamp'
115
- }], [['--local-timezone'], {
116
- default: false,
117
- required: false,
118
- help: 'Use local timezone for timestamps',
119
- action: 'store_true',
120
- dest: 'localTimezone'
121
- }], [['--log-no-colors'], {
122
- default: false,
123
- required: false,
124
- help: 'Do not use colors in console output',
125
- action: 'store_true',
126
- dest: 'logNoColors'
127
- }], [['-G', '--webhook'], {
128
- default: null,
129
- required: false,
130
- dest: 'webhook',
131
- help: 'Also send log output to this HTTP listener, for example localhost:9876'
132
- }], [['--nodeconfig'], {
133
- required: false,
134
- default: null,
135
- dest: 'nodeconfig',
136
- help: 'Configuration JSON file to register appium with selenium grid'
137
- }], [['--show-config'], {
138
- default: false,
139
- dest: 'showConfig',
140
- action: 'store_true',
141
- required: false,
142
- help: 'Show info about the appium server configuration and exit'
143
- }], [['--no-perms-check'], {
144
- default: false,
145
- dest: 'noPermsCheck',
146
- action: 'store_true',
147
- required: false,
148
- help: 'Bypass Appium\'s checks to ensure we can read/write necessary files'
149
- }], [['--strict-caps'], {
150
- default: false,
151
- dest: 'enforceStrictCaps',
152
- action: 'store_true',
153
- required: false,
154
- help: 'Cause sessions to fail if desired caps are sent in that Appium ' + 'does not recognize as valid for the selected device'
155
- }], [['--tmp'], {
156
- default: null,
157
- dest: 'tmpDir',
158
- required: false,
159
- help: 'Absolute path to directory Appium can use to manage temporary ' + 'files, like built-in iOS apps it needs to move around. On *nix/Mac ' + 'defaults to /tmp, on Windows defaults to C:\\Windows\\Temp'
160
- }], [['--trace-dir'], {
161
- default: null,
162
- dest: 'traceDir',
163
- required: false,
164
- help: 'Absolute path to directory Appium use to save ios instruments ' + 'traces, defaults to <tmp dir>/appium-instruments'
165
- }], [['--debug-log-spacing'], {
166
- dest: 'debugLogSpacing',
167
- default: false,
168
- action: 'store_true',
169
- required: false,
170
- help: 'Add exaggerated spacing in logs to help with visual inspection'
171
- }], [['--long-stacktrace'], {
172
- dest: 'longStacktrace',
173
- default: false,
174
- required: false,
175
- action: 'store_true',
176
- help: 'Add long stack traces to log entries. Recommended for debugging only.'
177
- }], [['-dc', _argparseActions.DEFAULT_CAPS_ARG], {
178
- dest: 'defaultCapabilities',
179
- default: {},
180
- type: _parserHelpers.parseJsonStringOrFile,
181
- required: false,
182
- help: 'Set the default desired capabilities, which will be set on each ' + 'session unless overridden by received capabilities. For example: ' + '[ \'{"app": "myapp.app", "deviceName": "iPhone Simulator"}\' ' + '| /path/to/caps.json ]'
183
- }], [['--relaxed-security'], {
184
- default: false,
185
- dest: 'relaxedSecurityEnabled',
186
- action: 'store_true',
187
- required: false,
188
- help: 'Disable additional security checks, so it is possible to use some advanced features, provided ' + 'by drivers supporting this option. Only enable it if all the ' + 'clients are in the trusted network and it\'s not the case if a client could potentially ' + 'break out of the session sandbox. Specific features can be overridden by ' + 'using the --deny-insecure flag'
189
- }], [['--allow-insecure'], {
190
- dest: 'allowInsecure',
191
- default: [],
192
- type: _parserHelpers.parseSecurityFeatures,
193
- required: false,
194
- help: 'Set which insecure features are allowed to run in this server\'s sessions. ' + 'Features are defined on a driver level; see documentation for more details. ' + 'This should be either a comma-separated list of feature names, or a path to ' + 'a file where each feature name is on a line. Note that features defined via ' + '--deny-insecure will be disabled, even if also listed here.'
195
- }], [['--deny-insecure'], {
196
- dest: 'denyInsecure',
197
- default: [],
198
- type: _parserHelpers.parseSecurityFeatures,
199
- required: false,
200
- help: 'Set which insecure features are not allowed to run in this server\'s sessions. ' + 'Features are defined on a driver level; see documentation for more details. ' + 'This should be either a comma-separated list of feature names, or a path to ' + 'a file where each feature name is on a line. Features listed here will not be ' + 'enabled even if also listed in --allow-insecure, and even if --relaxed-security ' + 'is turned on. For example: execute_driver_script,adb_shell'
201
- }], [['--driver-args'], {
202
- dest: 'driverArgs',
203
- default: {},
204
- type: _parserHelpers.parseJsonStringOrFile,
205
- required: false,
206
- help: 'Set the default desired client arguments for a driver, ' + 'For example: ' + '[ \'{"xcuitest": {"foo1": "bar1", "foo2": "bar2"}}\' ' + '| /path/to/driverArgs.json ]'
207
- }], [['--plugin-args'], {
208
- dest: 'pluginArgs',
209
- default: {},
210
- type: _parserHelpers.parseJsonStringOrFile,
211
- required: false,
212
- help: 'Set the default desired client arguments for a plugin, ' + 'For example: ' + '[ \'{"images": {"foo1": "bar1", "foo2": "bar2"}}\' ' + '| /path/to/pluginArgs.json ]'
213
- }]];
214
- exports.serverArgs = serverArgs;
215
- const globalExtensionArgs = [[['--json'], {
36
+ const EXTENSION_TYPES = new Set([_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE]);
37
+
38
+ const driverConfig = _driverConfig.default.getInstance(_extensionConfig.APPIUM_HOME);
39
+
40
+ exports.driverConfig = driverConfig;
41
+
42
+ const pluginConfig = _pluginConfig.default.getInstance(_extensionConfig.APPIUM_HOME);
43
+
44
+ exports.pluginConfig = pluginConfig;
45
+ const globalExtensionArgs = new Map([[['--json'], {
216
46
  required: false,
217
47
  default: false,
218
48
  action: 'store_true',
219
49
  help: 'Use JSON for output format',
220
50
  dest: 'json'
221
- }]];
222
- const extensionArgs = {
223
- [_extensionConfig.DRIVER_TYPE]: {},
224
- [_extensionConfig.PLUGIN_TYPE]: {}
225
- };
226
- exports.extensionArgs = extensionArgs;
51
+ }]]);
52
+
53
+ const getExtensionArgs = _lodash.default.once(function getExtensionArgs() {
54
+ const extensionArgs = {};
55
+
56
+ for (const type of EXTENSION_TYPES) {
57
+ extensionArgs[type] = {
58
+ list: makeListArgs(type),
59
+ install: makeInstallArgs(type),
60
+ uninstall: makeUninstallArgs(type),
61
+ update: makeUpdateArgs(type),
62
+ run: makeRunArgs(type)
63
+ };
64
+ }
65
+
66
+ return extensionArgs;
67
+ });
68
+
69
+ exports.getExtensionArgs = getExtensionArgs;
227
70
 
228
71
  function makeListArgs(type) {
229
- return [...globalExtensionArgs, [['--installed'], {
72
+ return new Map([...globalExtensionArgs, [['--installed'], {
230
73
  required: false,
231
74
  default: false,
232
75
  action: 'store_true',
@@ -238,18 +81,18 @@ function makeListArgs(type) {
238
81
  action: 'store_true',
239
82
  help: 'Show information about newer versions',
240
83
  dest: 'showUpdates'
241
- }]];
84
+ }]]);
242
85
  }
243
86
 
244
87
  function makeInstallArgs(type) {
245
- return [...globalExtensionArgs, [[type], {
88
+ return new Map([...globalExtensionArgs, [[type], {
246
89
  type: 'str',
247
90
  help: `Name of the ${type} to install, for example: ` + type === _extensionConfig.DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE
248
91
  }], [['--source'], {
249
92
  required: false,
250
93
  default: null,
251
- type: _parserHelpers.parseInstallTypes,
252
- help: `Where to look for the ${type} if it is not one of Appium's verified ` + `${type}s. Possible values: ${JSON.stringify(_extensionConfig.INSTALL_TYPES)}`,
94
+ choices: _extensionConfig.INSTALL_TYPES,
95
+ help: `Where to look for the ${type} if it is not one of Appium's verified ` + `${type}s. Possible values: ${_extensionConfig.INSTALL_TYPES.join(', ')}`,
253
96
  dest: 'installType'
254
97
  }], [['--package'], {
255
98
  required: false,
@@ -257,18 +100,18 @@ function makeInstallArgs(type) {
257
100
  type: 'str',
258
101
  help: `If installing from Git or GitHub, the package name, as defined in the plugin's ` + `package.json file in the "name" field, cannot be determined automatically, and ` + `should be reported here, otherwise the install will probably fail.`,
259
102
  dest: 'packageName'
260
- }]];
103
+ }]]);
261
104
  }
262
105
 
263
106
  function makeUninstallArgs(type) {
264
- return [...globalExtensionArgs, [[type], {
107
+ return new Map([...globalExtensionArgs, [[type], {
265
108
  type: 'str',
266
109
  help: 'Name of the driver to uninstall, for example: ' + type === _extensionConfig.DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE
267
- }]];
110
+ }]]);
268
111
  }
269
112
 
270
113
  function makeUpdateArgs(type) {
271
- return [...globalExtensionArgs, [[type], {
114
+ return new Map([...globalExtensionArgs, [[type], {
272
115
  type: 'str',
273
116
  help: `Name of the ${type} to update, or the word "installed" to update all installed ` + `${type}s. To see available updates, run "appium ${type} list --installed --updates". ` + 'For example: ' + type === _extensionConfig.DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE
274
117
  }], [['--unsafe'], {
@@ -276,27 +119,48 @@ function makeUpdateArgs(type) {
276
119
  default: false,
277
120
  action: 'store_true',
278
121
  help: `Include updates that might have a new major revision, and potentially include ` + `breaking changes`
279
- }]];
122
+ }]]);
280
123
  }
281
124
 
282
125
  function makeRunArgs(type) {
283
- return [...globalExtensionArgs, [[type], {
126
+ return new Map([...globalExtensionArgs, [[type], {
284
127
  type: 'str',
285
128
  help: `Name of the ${type} to run a script from, for example: ` + type === _extensionConfig.DRIVER_TYPE ? DRIVER_EXAMPLE : PLUGIN_EXAMPLE
286
129
  }], [['scriptName'], {
287
130
  default: null,
288
131
  type: 'str',
289
132
  help: `Name of the script to run from the ${type}. The script name must be cached ` + `inside the "scripts" field under "appium" inside the ${type}'s "package.json" file`
290
- }]];
133
+ }]]);
134
+ }
135
+
136
+ function getServerArgs() {
137
+ return new Map([...(0, _cliArgs.toParserArgs)({
138
+ overrides: {
139
+ basePath: {
140
+ default: _baseDriver.DEFAULT_BASE_PATH
141
+ }
142
+ }
143
+ }), ...serverArgsDisallowedInConfig]);
291
144
  }
292
145
 
293
- for (const type of [_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE]) {
294
- extensionArgs[type].list = makeListArgs(type);
295
- extensionArgs[type].install = makeInstallArgs(type);
296
- extensionArgs[type].uninstall = makeUninstallArgs(type);
297
- extensionArgs[type].update = makeUpdateArgs(type);
298
- extensionArgs[type].run = makeRunArgs(type);
299
- }require('source-map-support').install();
146
+ const serverArgsDisallowedInConfig = new Map([[['--shell'], {
147
+ required: false,
148
+ default: null,
149
+ help: 'Enter REPL mode',
150
+ action: 'store_true',
151
+ dest: 'shell'
152
+ }], [['--show-config'], {
153
+ default: false,
154
+ dest: 'showConfig',
155
+ action: 'store_true',
156
+ required: false,
157
+ help: 'Show info about the appium server configuration and exit'
158
+ }], [['--config'], {
159
+ dest: 'configFile',
160
+ type: 'string',
161
+ required: false,
162
+ help: 'Explicit path to Appium configuration file'
163
+ }]]);require('source-map-support').install();
300
164
 
301
165
 
302
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvYXJncy5qcyJdLCJuYW1lcyI6WyJEUklWRVJfRVhBTVBMRSIsIlBMVUdJTl9FWEFNUExFIiwiVVNFX0FMTF9QTFVHSU5TIiwic2hhcmVkQXJncyIsInJlcXVpcmVkIiwiZGVmYXVsdCIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fSE9NRSIsIkRFRkFVTFRfQVBQSVVNX0hPTUUiLCJoZWxwIiwiZGVzdCIsImFjdGlvbiIsInNlcnZlckFyZ3MiLCJ0eXBlIiwicGFyc2VEcml2ZXJOYW1lcyIsInBhcnNlUGx1Z2luTmFtZXMiLCJERUZBVUxUX0JBU0VfUEFUSCIsImNob2ljZXMiLCJERUZBVUxUX0NBUFNfQVJHIiwicGFyc2VKc29uU3RyaW5nT3JGaWxlIiwicGFyc2VTZWN1cml0eUZlYXR1cmVzIiwiZ2xvYmFsRXh0ZW5zaW9uQXJncyIsImV4dGVuc2lvbkFyZ3MiLCJEUklWRVJfVFlQRSIsIlBMVUdJTl9UWVBFIiwibWFrZUxpc3RBcmdzIiwibWFrZUluc3RhbGxBcmdzIiwicGFyc2VJbnN0YWxsVHlwZXMiLCJKU09OIiwic3RyaW5naWZ5IiwiSU5TVEFMTF9UWVBFUyIsIm1ha2VVbmluc3RhbGxBcmdzIiwibWFrZVVwZGF0ZUFyZ3MiLCJtYWtlUnVuQXJncyIsImxpc3QiLCJpbnN0YWxsIiwidW5pbnN0YWxsIiwidXBkYXRlIiwicnVuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFJQTs7QUFJQTs7QUFJQSxNQUFNQSxjQUFjLEdBQUcsVUFBdkI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsZUFBdkI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsS0FBeEI7O0FBR0EsTUFBTUMsVUFBVSxHQUFHLENBQ2pCLENBQUMsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixlQUFsQixDQUFELEVBQXFDO0FBQ25DQyxFQUFBQSxRQUFRLEVBQUUsS0FEeUI7QUFFbkNDLEVBQUFBLE9BQU8sRUFBRUMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFdBQVos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akIsQ0FQSyxDQUFQO0FBY0Q7O0FBRUQsS0FBSyxNQUFNQSxJQUFYLElBQW1CLENBQUNVLDRCQUFELEVBQWNDLDRCQUFkLENBQW5CLEVBQStDO0FBQzdDRixFQUFBQSxhQUFhLENBQUNULElBQUQsQ0FBYixDQUFvQnFCLElBQXBCLEdBQTJCVCxZQUFZLENBQUNaLElBQUQsQ0FBdkM7QUFDQVMsRUFBQUEsYUFBYSxDQUFDVCxJQUFELENBQWIsQ0FBb0JzQixPQUFwQixHQUE4QlQsZUFBZSxDQUFDYixJQUFELENBQTdDO0FBQ0FTLEVBQUFBLGFBQWEsQ0FBQ1QsSUFBRCxDQUFiLENBQW9CdUIsU0FBcEIsR0FBZ0NMLGlCQUFpQixDQUFDbEIsSUFBRCxDQUFqRDtBQUNBUyxFQUFBQSxhQUFhLENBQUNULElBQUQsQ0FBYixDQUFvQndCLE1BQXBCLEdBQTZCTCxjQUFjLENBQUNuQixJQUFELENBQTNDO0FBQ0FTLEVBQUFBLGFBQWEsQ0FBQ1QsSUFBRCxDQUFiLENBQW9CeUIsR0FBcEIsR0FBMEJMLFdBQVcsQ0FBQ3BCLElBQUQsQ0FBckM7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERFRkFVTFRfQkFTRV9QQVRIIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQge1xuICBwYXJzZVNlY3VyaXR5RmVhdHVyZXMsIHBhcnNlSnNvblN0cmluZ09yRmlsZSxcbiAgcGFyc2VQbHVnaW5OYW1lcywgcGFyc2VJbnN0YWxsVHlwZXMsIHBhcnNlRHJpdmVyTmFtZXNcbn0gZnJvbSAnLi9wYXJzZXItaGVscGVycyc7XG5pbXBvcnQge1xuICBJTlNUQUxMX1RZUEVTLCBERUZBVUxUX0FQUElVTV9IT01FLFxuICBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEVcbn0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0NBUFNfQVJHXG59IGZyb20gJy4vYXJncGFyc2UtYWN0aW9ucyc7XG5cbmNvbnN0IERSSVZFUl9FWEFNUExFID0gJ3hjdWl0ZXN0JztcbmNvbnN0IFBMVUdJTl9FWEFNUExFID0gJ2ZpbmRfYnlfaW1hZ2UnO1xuY29uc3QgVVNFX0FMTF9QTFVHSU5TID0gJ2FsbCc7XG5cbi8vIHNoYXJlZEFyZ3Mgd2lsbCBiZSBhZGRlZCB0byBldmVyeSBzdWJjb21tYW5kXG5jb25zdCBzaGFyZWRBcmdzID0gW1xuICBbWyctYWgnLCAnLS1ob21lJywgJy0tYXBwaXVtLWhvbWUnXSwge1xuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBwcm9jZXNzLmVudi5BUFBJVU1fSE9NRSB8fCBERUZBVUxUX0FQUElVTV9IT01FLFxuICAgIGhlbHA6ICdUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIEFwcGl1bSB3aWxsIGtlZXAgaW5zdGFsbGVkIGRyaXZlcnMsIHBsdWdpbnMsIGFuZCBhbnkgb3RoZXIgbWV0YWRhdGEgbmVjZXNzYXJ5IGZvciBpdHMgb3BlcmF0aW9uJyxcbiAgICBkZXN0OiAnYXBwaXVtSG9tZScsXG4gIH1dLFxuXG4gIFtbJy0tbG9nLWZpbHRlcnMnXSwge1xuICAgIGRlc3Q6ICdsb2dGaWx0ZXJzJyxcbiAgICBkZWZhdWx0OiBudWxsLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBhY3Rpb246ICdzdG9yZV90cnVlJyxcbiAgICBoZWxwOiAnU2V0IHRoZSBmdWxsIHBhdGggdG8gYSBKU09OIGZpbGUgY29udGFpbmluZyBvbmUgb3IgbW9yZSBsb2cgZmlsdGVyaW5nIHJ1bGVzJyxcbiAgfV0sXG5dO1xuXG5jb25zdCBzZXJ2ZXJBcmdzID0gW1xuICBbWyctLXNoZWxsJ10sIHtcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgZGVmYXVsdDogbnVsbCxcbiAgICBoZWxwOiAnRW50ZXIgUkVQTCBtb2RlJyxcbiAgICBhY3Rpb246ICdzdG9yZV90cnVlJyxcbiAgICBkZXN0OiAnc2hlbGwnLFxuICB9XSxcblxuICBbWyctLWRyaXZlcnMnXSwge1xuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBbXSxcbiAgICBoZWxwOiBgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBpbnN0YWxsZWQgZHJpdmVyIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGFjdGl2ZSBmb3IgdGhpcyBgICtcbiAgICAgICAgICBgc2VydmVyLiBBbGwgZHJpdmVycyB3aWxsIGJlIGFjdGl2ZSBieSBkZWZhdWx0LmAsXG4gICAgdHlwZTogcGFyc2VEcml2ZXJOYW1lcyxcbiAgICBkZXN0OiAnZHJpdmVycycsXG4gIH1dLFxuXG4gIFtbJy0tcGx1Z2lucyddLCB7XG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRlZmF1bHQ6IFtdLFxuICAgIGhlbHA6IGBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGluc3RhbGxlZCBwbHVnaW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgYWN0aXZlIGZvciB0aGlzIGAgK1xuICAgICAgICAgIGBzZXJ2ZXIuIFRvIGFjdGl2YXRlIGFsbCBwbHVnaW5zLCB5b3UgY2FuIHVzZSB0aGUgc2luZ2xlIHN0cmluZyBcIiR7VVNFX0FMTF9QTFVHSU5TfVwiIGAgK1xuICAgICAgICAgIGBhcyB0aGUgdmFsdWUgKGUuZy4gLS1wbHVnaW5zPSR7VVNFX0FMTF9QTFVHSU5TfSlgLFxuICAgIHR5cGU6IHBhcnNlUGx1Z2luTmFtZXMsXG4gICAgZGVzdDogJ3BsdWdpbnMnLFxuICB9XSxcblxuICBbWyctLWFsbG93LWNvcnMnXSwge1xuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBhY3Rpb246ICdzdG9yZV90cnVlJyxcbiAgICBoZWxwOiAnV2hldGhlciB0aGUgQXBwaXVtIHNlcnZlciBzaG91bGQgYWxsb3cgd2ViIGJyb3dzZXIgY29ubmVjdGlvbnMgZnJvbSBhbnkgaG9zdCcsXG4gICAgZGVzdDogJ2FsbG93Q29ycycsXG4gIH1dLFxuXG5cbiAgW1snLWEnLCAnLS1hZGRyZXNzJ10sIHtcbiAgICBkZWZhdWx0OiAnMC4wLjAuMCcsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdJUCBBZGRyZXNzIHRvIGxpc3RlbiBvbicsXG4gICAgZGVzdDogJ2FkZHJlc3MnLFxuICB9XSxcblxuICBbWyctcCcsICctLXBvcnQnXSwge1xuICAgIGRlZmF1bHQ6IDQ3MjMsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIHR5cGU6ICdpbnQnLFxuICAgIGhlbHA6ICdwb3J0IHRvIGxpc3RlbiBvbicsXG4gICAgZGVzdDogJ3BvcnQnLFxuICB9XSxcblxuICBbWyctcGEnLCAnLS1iYXNlLXBhdGgnXSwge1xuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBERUZBVUxUX0JBU0VfUEFUSCxcbiAgICBkZXN0OiAnYmFzZVBhdGgnLFxuICAgIGhlbHA6ICdCYXNlIHBhdGggdG8gdXNlIGFzIHRoZSBwcmVmaXggZm9yIGFsbCB3ZWJkcml2ZXIgcm91dGVzIHJ1bm5pbmcgJyArXG4gICAgICAgICAgYG9uIHRoaXMgc2VydmVyYFxuICB9XSxcblxuICBbWycta2EnLCAnLS1rZWVwLWFsaXZlLXRpbWVvdXQnXSwge1xuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBudWxsLFxuICAgIGRlc3Q6ICdrZWVwQWxpdmVUaW1lb3V0JyxcbiAgICB0eXBlOiAnaW50JyxcbiAgICBoZWxwOiAnTnVtYmVyIG9mIHNlY29uZHMgdGhlIEFwcGl1bSBzZXJ2ZXIgc2hvdWxkIGFwcGx5IGFzIGJvdGggdGhlIGtlZXAtYWxpdmUgdGltZW91dCAnICtcbiAgICAgICAgICAnYW5kIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgZm9yIGFsbCByZXF1ZXN0cy4gRGVmYXVsdHMgdG8gNjAwICgxMCBtaW51dGVzKS4nXG4gIH1dLFxuXG4gIFtbJy1jYScsICctLWNhbGxiYWNrLWFkZHJlc3MnXSwge1xuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZXN0OiAnY2FsbGJhY2tBZGRyZXNzJyxcbiAgICBkZWZhdWx0OiBudWxsLFxuICAgIGhlbHA6ICdjYWxsYmFjayBJUCBBZGRyZXNzIChkZWZhdWx0OiBzYW1lIGFzIC0tYWRkcmVzcyknLFxuICB9XSxcblxuICBbWyctY3AnLCAnLS1jYWxsYmFjay1wb3J0J10sIHtcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgZGVzdDogJ2NhbGxiYWNrUG9ydCcsXG4gICAgZGVmYXVsdDogbnVsbCxcbiAgICB0eXBlOiAnaW50JyxcbiAgICBoZWxwOiAnY2FsbGJhY2sgcG9ydCAoZGVmYXVsdDogc2FtZSBhcyBwb3J0KScsXG4gIH1dLFxuXG4gIFtbJy0tc2Vzc2lvbi1vdmVycmlkZSddLCB7XG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgZGVzdDogJ3Nlc3Npb25PdmVycmlkZScsXG4gICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdFbmFibGVzIHNlc3Npb24gb3ZlcnJpZGUgKGNsb2JiZXJpbmcpJyxcbiAgfV0sXG5cbiAgW1snLWcnLCAnLS1sb2cnXSwge1xuICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgZGVzdDogJ2xvZ0ZpbGUnLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBoZWxwOiAnQWxzbyBzZW5kIGxvZyBvdXRwdXQgdG8gdGhpcyBmaWxlJyxcbiAgfV0sXG5cbiAgW1snLS1sb2ctbGV2ZWwnXSwge1xuICAgIGNob2ljZXM6IFtcbiAgICAgICdpbmZvJywgJ2luZm86ZGVidWcnLCAnaW5mbzppbmZvJywgJ2luZm86d2FybicsICdpbmZvOmVycm9yJyxcbiAgICAgICd3YXJuJywgJ3dhcm46ZGVidWcnLCAnd2FybjppbmZvJywgJ3dhcm46d2FybicsICd3YXJuOmVycm9yJyxcbiAgICAgICdlcnJvcicsICdlcnJvcjpkZWJ1ZycsICdlcnJvcjppbmZvJywgJ2Vycm9yOndhcm4nLCAnZXJyb3I6ZXJyb3InLFxuICAgICAgJ2RlYnVnJywgJ2RlYnVnOmRlYnVnJywgJ2RlYnVnOmluZm8nLCAnZGVidWc6d2FybicsICdkZWJ1ZzplcnJvcicsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnZGVidWcnLFxuICAgIGRlc3Q6ICdsb2dsZXZlbCcsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdsb2cgbGV2ZWw7IGRlZmF1bHQgKGNvbnNvbGVbOmZpbGVdKTogZGVidWdbOmRlYnVnXScsXG4gIH1dLFxuXG4gIFtbJy0tbG9nLXRpbWVzdGFtcCddLCB7XG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdTaG93IHRpbWVzdGFtcHMgaW4gY29uc29sZSBvdXRwdXQnLFxuICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgIGRlc3Q6ICdsb2dUaW1lc3RhbXAnLFxuICB9XSxcblxuICBbWyctLWxvY2FsLXRpbWV6b25lJ10sIHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgaGVscDogJ1VzZSBsb2NhbCB0aW1lem9uZSBmb3IgdGltZXN0YW1wcycsXG4gICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgZGVzdDogJ2xvY2FsVGltZXpvbmUnLFxuICB9XSxcblxuICBbWyctLWxvZy1uby1jb2xvcnMnXSwge1xuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBoZWxwOiAnRG8gbm90IHVzZSBjb2xvcnMgaW4gY29uc29sZSBvdXRwdXQnLFxuICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgIGRlc3Q6ICdsb2dOb0NvbG9ycycsXG4gIH1dLFxuXG4gIFtbJy1HJywgJy0td2ViaG9vayddLCB7XG4gICAgZGVmYXVsdDogbnVsbCxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgZGVzdDogJ3dlYmhvb2snLFxuICAgIGhlbHA6ICdBbHNvIHNlbmQgbG9nIG91dHB1dCB0byB0aGlzIEhUVFAgbGlzdGVuZXIsIGZvciBleGFtcGxlIGxvY2FsaG9zdDo5ODc2JyxcbiAgfV0sXG5cbiAgW1snLS1ub2RlY29uZmlnJ10sIHtcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgZGVmYXVsdDogbnVsbCxcbiAgICBkZXN0OiAnbm9kZWNvbmZpZycsXG4gICAgaGVscDogJ0NvbmZpZ3VyYXRpb24gSlNPTiBmaWxlIHRvIHJlZ2lzdGVyIGFwcGl1bSB3aXRoIHNlbGVuaXVtIGdyaWQnLFxuICB9XSxcblxuICBbWyctLXNob3ctY29uZmlnJ10sIHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXN0OiAnc2hvd0NvbmZpZycsXG4gICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdTaG93IGluZm8gYWJvdXQgdGhlIGFwcGl1bSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhbmQgZXhpdCcsXG4gIH1dLFxuXG4gIFtbJy0tbm8tcGVybXMtY2hlY2snXSwge1xuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc3Q6ICdub1Blcm1zQ2hlY2snLFxuICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBoZWxwOiAnQnlwYXNzIEFwcGl1bVxcJ3MgY2hlY2tzIHRvIGVuc3VyZSB3ZSBjYW4gcmVhZC93cml0ZSBuZWNlc3NhcnkgZmlsZXMnLFxuICB9XSxcblxuICBbWyctLXN0cmljdC1jYXBzJ10sIHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXN0OiAnZW5mb3JjZVN0cmljdENhcHMnLFxuICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBoZWxwOiAnQ2F1c2Ugc2Vzc2lvbnMgdG8gZmFpbCBpZiBkZXNpcmVkIGNhcHMgYXJlIHNlbnQgaW4gdGhhdCBBcHBpdW0gJyArXG4gICAgICAgICAgJ2RvZXMgbm90IHJlY29nbml6ZSBhcyB2YWxpZCBmb3IgdGhlIHNlbGVjdGVkIGRldmljZScsXG4gIH1dLFxuXG4gIFtbJy0tdG1wJ10sIHtcbiAgICBkZWZhdWx0OiBudWxsLFxuICAgIGRlc3Q6ICd0bXBEaXInLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBoZWxwOiAnQWJzb2x1dGUgcGF0aCB0byBkaXJlY3RvcnkgQXBwaXVtIGNhbiB1c2UgdG8gbWFuYWdlIHRlbXBvcmFyeSAnICtcbiAgICAgICAgICAnZmlsZXMsIGxpa2UgYnVpbHQtaW4gaU9TIGFwcHMgaXQgbmVlZHMgdG8gbW92ZSBhcm91bmQuIE9uICpuaXgvTWFjICcgK1xuICAgICAgICAgICdkZWZhdWx0cyB0byAvdG1wLCBvbiBXaW5kb3dzIGRlZmF1bHRzIHRvIEM6XFxcXFdpbmRvd3NcXFxcVGVtcCcsXG4gIH1dLFxuXG4gIFtbJy0tdHJhY2UtZGlyJ10sIHtcbiAgICBkZWZhdWx0OiBudWxsLFxuICAgIGRlc3Q6ICd0cmFjZURpcicsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdBYnNvbHV0ZSBwYXRoIHRvIGRpcmVjdG9yeSBBcHBpdW0gdXNlIHRvIHNhdmUgaW9zIGluc3RydW1lbnRzICcgK1xuICAgICAgICAgICd0cmFjZXMsIGRlZmF1bHRzIHRvIDx0bXAgZGlyPi9hcHBpdW0taW5zdHJ1bWVudHMnLFxuICB9XSxcblxuICBbWyctLWRlYnVnLWxvZy1zcGFjaW5nJ10sIHtcbiAgICBkZXN0OiAnZGVidWdMb2dTcGFjaW5nJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBhY3Rpb246ICdzdG9yZV90cnVlJyxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgaGVscDogJ0FkZCBleGFnZ2VyYXRlZCBzcGFjaW5nIGluIGxvZ3MgdG8gaGVscCB3aXRoIHZpc3VhbCBpbnNwZWN0aW9uJyxcbiAgfV0sXG5cblxuICBbWyctLWxvbmctc3RhY2t0cmFjZSddLCB7XG4gICAgZGVzdDogJ2xvbmdTdGFja3RyYWNlJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgaGVscDogJ0FkZCBsb25nIHN0YWNrIHRyYWNlcyB0byBsb2cgZW50cmllcy4gUmVjb21tZW5kZWQgZm9yIGRlYnVnZ2luZyBvbmx5LicsXG4gIH1dLFxuXG5cbiAgW1snLWRjJywgREVGQVVMVF9DQVBTX0FSR10sIHtcbiAgICBkZXN0OiAnZGVmYXVsdENhcGFiaWxpdGllcycsXG4gICAgZGVmYXVsdDoge30sXG4gICAgdHlwZTogcGFyc2VKc29uU3RyaW5nT3JGaWxlLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBoZWxwOiAnU2V0IHRoZSBkZWZhdWx0IGRlc2lyZWQgY2FwYWJpbGl0aWVzLCB3aGljaCB3aWxsIGJlIHNldCBvbiBlYWNoICcgK1xuICAgICAgICAgICdzZXNzaW9uIHVubGVzcyBvdmVycmlkZGVuIGJ5IHJlY2VpdmVkIGNhcGFiaWxpdGllcy4gRm9yIGV4YW1wbGU6ICcgK1xuICAgICAgICAgICdbIFxcJ3tcImFwcFwiOiBcIm15YXBwLmFwcFwiLCBcImRldmljZU5hbWVcIjogXCJpUGhvbmUgU2ltdWxhdG9yXCJ9XFwnICcgK1xuICAgICAgICAgICd8IC9wYXRoL3RvL2NhcHMuanNvbiBdJ1xuICB9XSxcblxuICBbWyctLXJlbGF4ZWQtc2VjdXJpdHknXSwge1xuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc3Q6ICdyZWxheGVkU2VjdXJpdHlFbmFibGVkJyxcbiAgICBhY3Rpb246ICdzdG9yZV90cnVlJyxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgaGVscDogJ0Rpc2FibGUgYWRkaXRpb25hbCBzZWN1cml0eSBjaGVja3MsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBzb21lIGFkdmFuY2VkIGZlYXR1cmVzLCBwcm92aWRlZCAnICtcbiAgICAgICAgICAnYnkgZHJpdmVycyBzdXBwb3J0aW5nIHRoaXMgb3B0aW9uLiBPbmx5IGVuYWJsZSBpdCBpZiBhbGwgdGhlICcgK1xuICAgICAgICAgICdjbGllbnRzIGFyZSBpbiB0aGUgdHJ1c3RlZCBuZXR3b3JrIGFuZCBpdFxcJ3Mgbm90IHRoZSBjYXNlIGlmIGEgY2xpZW50IGNvdWxkIHBvdGVudGlhbGx5ICcgK1xuICAgICAgICAgICdicmVhayBvdXQgb2YgdGhlIHNlc3Npb24gc2FuZGJveC4gU3BlY2lmaWMgZmVhdHVyZXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgJyArXG4gICAgICAgICAgJ3VzaW5nIHRoZSAtLWRlbnktaW5zZWN1cmUgZmxhZycsXG4gIH1dLFxuXG4gIFtbJy0tYWxsb3ctaW5zZWN1cmUnXSwge1xuICAgIGRlc3Q6ICdhbGxvd0luc2VjdXJlJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgICB0eXBlOiBwYXJzZVNlY3VyaXR5RmVhdHVyZXMsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdTZXQgd2hpY2ggaW5zZWN1cmUgZmVhdHVyZXMgYXJlIGFsbG93ZWQgdG8gcnVuIGluIHRoaXMgc2VydmVyXFwncyBzZXNzaW9ucy4gJyArXG4gICAgICAgICAgJ0ZlYXR1cmVzIGFyZSBkZWZpbmVkIG9uIGEgZHJpdmVyIGxldmVsOyBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAnICtcbiAgICAgICAgICAnVGhpcyBzaG91bGQgYmUgZWl0aGVyIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmVhdHVyZSBuYW1lcywgb3IgYSBwYXRoIHRvICcgK1xuICAgICAgICAgICdhIGZpbGUgd2hlcmUgZWFjaCBmZWF0dXJlIG5hbWUgaXMgb24gYSBsaW5lLiBOb3RlIHRoYXQgZmVhdHVyZXMgZGVmaW5lZCB2aWEgJyArXG4gICAgICAgICAgJy0tZGVueS1pbnNlY3VyZSB3aWxsIGJlIGRpc2FibGVkLCBldmVuIGlmIGFsc28gbGlzdGVkIGhlcmUuJyxcbiAgfV0sXG5cbiAgW1snLS1kZW55LWluc2VjdXJlJ10sIHtcbiAgICBkZXN0OiAnZGVueUluc2VjdXJlJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgICB0eXBlOiBwYXJzZVNlY3VyaXR5RmVhdHVyZXMsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdTZXQgd2hpY2ggaW5zZWN1cmUgZmVhdHVyZXMgYXJlIG5vdCBhbGxvd2VkIHRvIHJ1biBpbiB0aGlzIHNlcnZlclxcJ3Mgc2Vzc2lvbnMuICcgK1xuICAgICAgICAgICdGZWF0dXJlcyBhcmUgZGVmaW5lZCBvbiBhIGRyaXZlciBsZXZlbDsgc2VlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gJyArXG4gICAgICAgICAgJ1RoaXMgc2hvdWxkIGJlIGVpdGhlciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZlYXR1cmUgbmFtZXMsIG9yIGEgcGF0aCB0byAnICtcbiAgICAgICAgICAnYSBmaWxlIHdoZXJlIGVhY2ggZmVhdHVyZSBuYW1lIGlzIG9uIGEgbGluZS4gRmVhdHVyZXMgbGlzdGVkIGhlcmUgd2lsbCBub3QgYmUgJyArXG4gICAgICAgICAgJ2VuYWJsZWQgZXZlbiBpZiBhbHNvIGxpc3RlZCBpbiAtLWFsbG93LWluc2VjdXJlLCBhbmQgZXZlbiBpZiAtLXJlbGF4ZWQtc2VjdXJpdHkgJyArXG4gICAgICAgICAgJ2lzIHR1cm5lZCBvbi4gRm9yIGV4YW1wbGU6IGV4ZWN1dGVfZHJpdmVyX3NjcmlwdCxhZGJfc2hlbGwnLFxuICB9XSxcblxuICBbWyctLWRyaXZlci1hcmdzJ10sIHtcbiAgICBkZXN0OiAnZHJpdmVyQXJncycsXG4gICAgZGVmYXVsdDoge30sXG4gICAgdHlwZTogcGFyc2VKc29uU3RyaW5nT3JGaWxlLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBoZWxwOiAnU2V0IHRoZSBkZWZhdWx0IGRlc2lyZWQgY2xpZW50IGFyZ3VtZW50cyBmb3IgYSBkcml2ZXIsICcgK1xuICAgICAgICAgICdGb3IgZXhhbXBsZTogJyArXG4gICAgICAgICAgJ1sgXFwne1wieGN1aXRlc3RcIjoge1wiZm9vMVwiOiBcImJhcjFcIiwgXCJmb28yXCI6IFwiYmFyMlwifX1cXCcgJyArXG4gICAgICAgICAgJ3wgL3BhdGgvdG8vZHJpdmVyQXJncy5qc29uIF0nXG4gIH1dLFxuXG4gIFtbJy0tcGx1Z2luLWFyZ3MnXSwge1xuICAgIGRlc3Q6ICdwbHVnaW5BcmdzJyxcbiAgICBkZWZhdWx0OiB7fSxcbiAgICB0eXBlOiBwYXJzZUpzb25TdHJpbmdPckZpbGUsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGhlbHA6ICdTZXQgdGhlIGRlZmF1bHQgZGVzaXJlZCBjbGllbnQgYXJndW1lbnRzIGZvciBhIHBsdWdpbiwgJyArXG4gICAgICAgICAgJ0ZvciBleGFtcGxlOiAnICtcbiAgICAgICAgICAnWyBcXCd7XCJpbWFnZXNcIjoge1wiZm9vMVwiOiBcImJhcjFcIiwgXCJmb28yXCI6IFwiYmFyMlwifX1cXCcgJyArXG4gICAgICAgICAgJ3wgL3BhdGgvdG8vcGx1Z2luQXJncy5qc29uIF0nXG4gIH1dLFxuXTtcblxuLy8gdGhpcyBzZXQgb2YgYXJncyB3b3JrcyBmb3IgYm90aCBkcml2ZXJzIGFuZCBwbHVnaW5zICgnZXh0ZW5zaW9ucycpXG5jb25zdCBnbG9iYWxFeHRlbnNpb25BcmdzID0gW1xuICBbWyctLWpzb24nXSwge1xuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBhY3Rpb246ICdzdG9yZV90cnVlJyxcbiAgICBoZWxwOiAnVXNlIEpTT04gZm9yIG91dHB1dCBmb3JtYXQnLFxuICAgIGRlc3Q6ICdqc29uJ1xuICB9XVxuXTtcblxuY29uc3QgZXh0ZW5zaW9uQXJncyA9IHtbRFJJVkVSX1RZUEVdOiB7fSwgW1BMVUdJTl9UWVBFXToge319O1xuXG5mdW5jdGlvbiBtYWtlTGlzdEFyZ3MgKHR5cGUpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5nbG9iYWxFeHRlbnNpb25BcmdzLFxuICAgIFtbJy0taW5zdGFsbGVkJ10sIHtcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgICBoZWxwOiBgTGlzdCBvbmx5IGluc3RhbGxlZCAke3R5cGV9c2AsXG4gICAgICBkZXN0OiAnc2hvd0luc3RhbGxlZCdcbiAgICB9XSxcbiAgICBbWyctLXVwZGF0ZXMnXSwge1xuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBhY3Rpb246ICdzdG9yZV90cnVlJyxcbiAgICAgIGhlbHA6ICdTaG93IGluZm9ybWF0aW9uIGFib3V0IG5ld2VyIHZlcnNpb25zJyxcbiAgICAgIGRlc3Q6ICdzaG93VXBkYXRlcydcbiAgICB9XVxuICBdO1xufVxuXG5cbmZ1bmN0aW9uIG1ha2VJbnN0YWxsQXJncyAodHlwZSkge1xuICByZXR1cm4gW1xuICAgIC4uLmdsb2JhbEV4dGVuc2lvbkFyZ3MsXG4gICAgW1t0eXBlXSwge1xuICAgICAgdHlwZTogJ3N0cicsXG4gICAgICBoZWxwOiBgTmFtZSBvZiB0aGUgJHt0eXBlfSB0byBpbnN0YWxsLCBmb3IgZXhhbXBsZTogYCArXG4gICAgICAgICAgICB0eXBlID09PSBEUklWRVJfVFlQRSA/IERSSVZFUl9FWEFNUExFIDogUExVR0lOX0VYQU1QTEUsXG4gICAgfV0sXG4gICAgW1snLS1zb3VyY2UnXSwge1xuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIHR5cGU6IHBhcnNlSW5zdGFsbFR5cGVzLFxuICAgICAgaGVscDogYFdoZXJlIHRvIGxvb2sgZm9yIHRoZSAke3R5cGV9IGlmIGl0IGlzIG5vdCBvbmUgb2YgQXBwaXVtJ3MgdmVyaWZpZWQgYCArXG4gICAgICAgICAgICBgJHt0eXBlfXMuIFBvc3NpYmxlIHZhbHVlczogJHtKU09OLnN0cmluZ2lmeShJTlNUQUxMX1RZUEVTKX1gLFxuICAgICAgZGVzdDogJ2luc3RhbGxUeXBlJ1xuICAgIH1dLFxuICAgIFtbJy0tcGFja2FnZSddLCB7XG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgdHlwZTogJ3N0cicsXG4gICAgICBoZWxwOiBgSWYgaW5zdGFsbGluZyBmcm9tIEdpdCBvciBHaXRIdWIsIHRoZSBwYWNrYWdlIG5hbWUsIGFzIGRlZmluZWQgaW4gdGhlIHBsdWdpbidzIGAgK1xuICAgICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGluIHRoZSBcIm5hbWVcIiBmaWVsZCwgY2Fubm90IGJlIGRldGVybWluZWQgYXV0b21hdGljYWxseSwgYW5kIGAgK1xuICAgICAgICAgICAgYHNob3VsZCBiZSByZXBvcnRlZCBoZXJlLCBvdGhlcndpc2UgdGhlIGluc3RhbGwgd2lsbCBwcm9iYWJseSBmYWlsLmAsXG4gICAgICBkZXN0OiAncGFja2FnZU5hbWUnLFxuICAgIH1dLFxuICBdO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5pbnN0YWxsQXJncyAodHlwZSkge1xuICByZXR1cm4gW1xuICAgIC4uLmdsb2JhbEV4dGVuc2lvbkFyZ3MsXG4gICAgW1t0eXBlXSwge1xuICAgICAgdHlwZTogJ3N0cicsXG4gICAgICBoZWxwOiAnTmFtZSBvZiB0aGUgZHJpdmVyIHRvIHVuaW5zdGFsbCwgZm9yIGV4YW1wbGU6ICcgK1xuICAgICAgICAgICAgdHlwZSA9PT0gRFJJVkVSX1RZUEUgPyBEUklWRVJfRVhBTVBMRSA6IFBMVUdJTl9FWEFNUExFXG4gICAgfV0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIG1ha2VVcGRhdGVBcmdzICh0eXBlKSB7XG4gIHJldHVybiBbXG4gICAgLi4uZ2xvYmFsRXh0ZW5zaW9uQXJncyxcbiAgICBbW3R5cGVdLCB7XG4gICAgICB0eXBlOiAnc3RyJyxcbiAgICAgIGhlbHA6IGBOYW1lIG9mIHRoZSAke3R5cGV9IHRvIHVwZGF0ZSwgb3IgdGhlIHdvcmQgXCJpbnN0YWxsZWRcIiB0byB1cGRhdGUgYWxsIGluc3RhbGxlZCBgICtcbiAgICAgICAgICAgIGAke3R5cGV9cy4gVG8gc2VlIGF2YWlsYWJsZSB1cGRhdGVzLCBydW4gXCJhcHBpdW0gJHt0eXBlfSBsaXN0IC0taW5zdGFsbGVkIC0tdXBkYXRlc1wiLiBgICtcbiAgICAgICAgICAgICdGb3IgZXhhbXBsZTogJyArIHR5cGUgPT09IERSSVZFUl9UWVBFID8gRFJJVkVSX0VYQU1QTEUgOiBQTFVHSU5fRVhBTVBMRSxcbiAgICB9XSxcbiAgICBbWyctLXVuc2FmZSddLCB7XG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgICAgaGVscDogYEluY2x1ZGUgdXBkYXRlcyB0aGF0IG1pZ2h0IGhhdmUgYSBuZXcgbWFqb3IgcmV2aXNpb24sIGFuZCBwb3RlbnRpYWxseSBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgYGJyZWFraW5nIGNoYW5nZXNgLFxuICAgIH1dLFxuICBdO1xufVxuXG5mdW5jdGlvbiBtYWtlUnVuQXJncyAodHlwZSkge1xuICByZXR1cm4gW1xuICAgIC4uLmdsb2JhbEV4dGVuc2lvbkFyZ3MsXG4gICAgW1t0eXBlXSwge1xuICAgICAgdHlwZTogJ3N0cicsXG4gICAgICBoZWxwOiBgTmFtZSBvZiB0aGUgJHt0eXBlfSB0byBydW4gYSBzY3JpcHQgZnJvbSwgZm9yIGV4YW1wbGU6IGAgK1xuICAgICAgICAgICAgdHlwZSA9PT0gRFJJVkVSX1RZUEUgPyBEUklWRVJfRVhBTVBMRSA6IFBMVUdJTl9FWEFNUExFLFxuICAgIH1dLFxuICAgIFtbJ3NjcmlwdE5hbWUnXSwge1xuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIHR5cGU6ICdzdHInLFxuICAgICAgaGVscDogYE5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW4gZnJvbSB0aGUgJHt0eXBlfS4gVGhlIHNjcmlwdCBuYW1lIG11c3QgYmUgY2FjaGVkIGAgK1xuICAgICAgICAgICAgYGluc2lkZSB0aGUgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXIgXCJhcHBpdW1cIiBpbnNpZGUgdGhlICR7dHlwZX0ncyBcInBhY2thZ2UuanNvblwiIGZpbGVgXG4gICAgfV0sXG4gIF07XG59XG5cbmZvciAoY29uc3QgdHlwZSBvZiBbRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFXSkge1xuICBleHRlbnNpb25BcmdzW3R5cGVdLmxpc3QgPSBtYWtlTGlzdEFyZ3ModHlwZSk7XG4gIGV4dGVuc2lvbkFyZ3NbdHlwZV0uaW5zdGFsbCA9IG1ha2VJbnN0YWxsQXJncyh0eXBlKTtcbiAgZXh0ZW5zaW9uQXJnc1t0eXBlXS51bmluc3RhbGwgPSBtYWtlVW5pbnN0YWxsQXJncyh0eXBlKTtcbiAgZXh0ZW5zaW9uQXJnc1t0eXBlXS51cGRhdGUgPSBtYWtlVXBkYXRlQXJncyh0eXBlKTtcbiAgZXh0ZW5zaW9uQXJnc1t0eXBlXS5ydW4gPSBtYWtlUnVuQXJncyh0eXBlKTtcbn1cblxuZXhwb3J0IHtcbiAgc2hhcmVkQXJncyxcbiAgc2VydmVyQXJncyxcbiAgZXh0ZW5zaW9uQXJncyxcbiAgVVNFX0FMTF9QTFVHSU5TLFxufTtcbiJdLCJmaWxlIjoibGliL2NsaS9hcmdzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
166
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvYXJncy5qcyJdLCJuYW1lcyI6WyJEUklWRVJfRVhBTVBMRSIsIlBMVUdJTl9FWEFNUExFIiwiVVNFX0FMTF9QTFVHSU5TIiwiRVhURU5TSU9OX1RZUEVTIiwiU2V0IiwiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsImRyaXZlckNvbmZpZyIsIkRyaXZlckNvbmZpZyIsImdldEluc3RhbmNlIiwiQVBQSVVNX0hPTUUiLCJwbHVnaW5Db25maWciLCJQbHVnaW5Db25maWciLCJnbG9iYWxFeHRlbnNpb25BcmdzIiwiTWFwIiwicmVxdWlyZWQiLCJkZWZhdWx0IiwiYWN0aW9uIiwiaGVscCIsImRlc3QiLCJnZXRFeHRlbnNpb25BcmdzIiwiXyIsIm9uY2UiLCJleHRlbnNpb25BcmdzIiwidHlwZSIsImxpc3QiLCJtYWtlTGlzdEFyZ3MiLCJpbnN0YWxsIiwibWFrZUluc3RhbGxBcmdzIiwidW5pbnN0YWxsIiwibWFrZVVuaW5zdGFsbEFyZ3MiLCJ1cGRhdGUiLCJtYWtlVXBkYXRlQXJncyIsInJ1biIsIm1ha2VSdW5BcmdzIiwiY2hvaWNlcyIsIklOU1RBTExfVFlQRVMiLCJqb2luIiwiZ2V0U2VydmVyQXJncyIsIm92ZXJyaWRlcyIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJzZXJ2ZXJBcmdzRGlzYWxsb3dlZEluQ29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsY0FBYyxHQUFHLFVBQXZCO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLGVBQXZCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEtBQXhCOztBQUdBLE1BQU1DLGVBQWUsR0FBRyxJQUFJQyxHQUFKLENBQVEsQ0FBQ0MsNEJBQUQsRUFBY0MsNEJBQWQsQ0FBUixDQUF4Qjs7QUFFQSxNQUFNQyxZQUFZLEdBQUdDLHNCQUFhQyxXQUFiLENBQXlCQyw0QkFBekIsQ0FBckI7Ozs7QUFDQSxNQUFNQyxZQUFZLEdBQUdDLHNCQUFhSCxXQUFiLENBQXlCQyw0QkFBekIsQ0FBckI7OztBQUlBLE1BQU1HLG1CQUFtQixHQUFHLElBQUlDLEdBQUosQ0FBUSxDQUNsQyxDQUFDLENBQUMsUUFBRCxDQUFELEVBQWE7QUFDWEMsRUFBQUEsUUFBUSxFQUFFLEtBREM7QUFFWEMsRUFBQUEsT0FBTyxFQUFFLEtBRkU7QUFHWEMsRUFBQUEsTUFBTSxFQUFFLFlBSEc7QUFJWEMsRUFBQUEsSUFBSSxFQUFFLDRCQUpLO0FBS1hDLEVBQUFBLElBQUksRUFBRTtBQUxLLENBQWIsQ0FEa0MsQ0FBUixDQUE1Qjs7QUFhQSxNQUFNQyxnQkFBZ0IsR0FBR0MsZ0JBQUVDLElBQUYsQ0FBTyxTQUFTRixnQkFBVCxHQUE2QjtBQUMzRCxRQUFNRyxhQUFhLEdBQUcsRUFBdEI7O0FBQ0EsT0FBSyxNQUFNQyxJQUFYLElBQW1CckIsZUFBbkIsRUFBb0M7QUFDbENvQixJQUFBQSxhQUFhLENBQUNDLElBQUQsQ0FBYixHQUFzQjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFQyxZQUFZLENBQUNGLElBQUQsQ0FERTtBQUVwQkcsTUFBQUEsT0FBTyxFQUFFQyxlQUFlLENBQUNKLElBQUQsQ0FGSjtBQUdwQkssTUFBQUEsU0FBUyxFQUFFQyxpQkFBaUIsQ0FBQ04sSUFBRCxDQUhSO0FBSXBCTyxNQUFBQSxNQUFNLEVBQUVDLGNBQWMsQ0FBQ1IsSUFBRCxDQUpGO0FBS3BCUyxNQUFBQSxHQUFHLEVBQUVDLFdBQVcsQ0FBQ1YsSUFBRDtBQUxJLEtBQXRCO0FBT0Q7O0FBQ0QsU0FBbUZELGFBQW5GO0FBQ0QsQ0Fad0IsQ0FBekI7Ozs7QUFtQkEsU0FBU0csWUFBVCxDQUF1QkYsSUFBdkIsRUFBNkI7QUFDM0IsU0FBTyxJQUFJVixHQUFKLENBQVEsQ0FDYixHQUFHRCxtQkFEVSxFQUViLENBQUMsQ0FBQyxhQUFELENBQUQsRUFBa0I7QUFDaEJFLElBQUFBLFFBQVEsRUFBRSxLQURNO0FBRWhCQyxJQUFBQSxPQUFPLEVBQUUsS0FGTztBQUdoQkMsSUFBQUEsTUFBTSxFQUFFLFlBSFE7QUFJaEJDLElBQUFBLElBQUksRUFBRyx1QkFBc0JNLElBQUssR0FKbEI7QUFLaEJMLElBQUFBLElBQUksRUFBRTtBQUxVLEdBQWxCLENBRmEsRUFTYixDQUFDLENBQUMsV0FBRCxDQUFELEVBQWdCO0FBQ2RKLElBQUFBLFFBQVEsRUFBRSxLQURJO0FBRWRDLElBQUFBLE9BQU8sRUFBRSxLQUZLO0FBR2RDLElBQUFBLE1BQU0sRUFBRSxZQUhNO0FBSWRDLElBQUFBLElBQUksRUFBRSx1Q0FKUTtBQUtkQyxJQUFBQSxJQUFJLEVBQUU7QUFMUSxHQUFoQixDQVRhLENBQVIsQ0FBUDtBQWlCRDs7QUFPRCxTQUFTUyxlQUFULENBQTBCSixJQUExQixFQUFnQztBQUM5QixTQUFPLElBQUlWLEdBQUosQ0FBUSxDQUNiLEdBQUdELG1CQURVLEVBRWIsQ0FBQyxDQUFDVyxJQUFELENBQUQsRUFBUztBQUNQQSxJQUFBQSxJQUFJLEVBQUUsS0FEQztBQUVQTixJQUFBQSxJQUFJLEVBQUcsZUFBY00sSUFBSyw0QkFBcEIsR0FDQUEsSUFEQSxLQUNTbkIsNEJBRFQsR0FDdUJMLGNBRHZCLEdBQ3dDQztBQUh2QyxHQUFULENBRmEsRUFPYixDQUFDLENBQUMsVUFBRCxDQUFELEVBQWU7QUFDYmMsSUFBQUEsUUFBUSxFQUFFLEtBREc7QUFFYkMsSUFBQUEsT0FBTyxFQUFFLElBRkk7QUFHYm1CLElBQUFBLE9BQU8sRUFBRUMsOEJBSEk7QUFJYmxCLElBQUFBLElBQUksRUFBRyx5QkFBd0JNLElBQUsseUNBQTlCLEdBQ0MsR0FBRUEsSUFBSyx1QkFBc0JZLCtCQUFjQyxJQUFkLENBQW1CLElBQW5CLENBQXlCLEVBTGhEO0FBTWJsQixJQUFBQSxJQUFJLEVBQUU7QUFOTyxHQUFmLENBUGEsRUFlYixDQUFDLENBQUMsV0FBRCxDQUFELEVBQWdCO0FBQ2RKLElBQUFBLFFBQVEsRUFBRSxLQURJO0FBRWRDLElBQUFBLE9BQU8sRUFBRSxJQUZLO0FBR2RRLElBQUFBLElBQUksRUFBRSxLQUhRO0FBSWROLElBQUFBLElBQUksRUFBRyxpRkFBRCxHQUNDLGlGQURELEdBRUMsb0VBTk87QUFPZEMsSUFBQUEsSUFBSSxFQUFFO0FBUFEsR0FBaEIsQ0FmYSxDQUFSLENBQVA7QUF5QkQ7O0FBUUQsU0FBU1csaUJBQVQsQ0FBNEJOLElBQTVCLEVBQWtDO0FBQ2hDLFNBQU8sSUFBSVYsR0FBSixDQUFRLENBQ2IsR0FBR0QsbUJBRFUsRUFFYixDQUFDLENBQUNXLElBQUQsQ0FBRCxFQUFTO0FBQ1BBLElBQUFBLElBQUksRUFBRSxLQURDO0FBRVBOLElBQUFBLElBQUksRUFBRSxtREFDQU0sSUFEQSxLQUNTbkIsNEJBRFQsR0FDdUJMLGNBRHZCLEdBQ3dDQztBQUh2QyxHQUFULENBRmEsQ0FBUixDQUFQO0FBUUQ7O0FBT0QsU0FBUytCLGNBQVQsQ0FBeUJSLElBQXpCLEVBQStCO0FBQzdCLFNBQU8sSUFBSVYsR0FBSixDQUFRLENBQ2IsR0FBR0QsbUJBRFUsRUFFYixDQUFDLENBQUNXLElBQUQsQ0FBRCxFQUFTO0FBQ1BBLElBQUFBLElBQUksRUFBRSxLQURDO0FBRVBOLElBQUFBLElBQUksRUFBRyxlQUFjTSxJQUFLLDhEQUFwQixHQUNDLEdBQUVBLElBQUssNENBQTJDQSxJQUFLLGdDQUR4RCxHQUVBLGVBRkEsR0FFa0JBLElBRmxCLEtBRTJCbkIsNEJBRjNCLEdBRXlDTCxjQUZ6QyxHQUUwREM7QUFKekQsR0FBVCxDQUZhLEVBUWIsQ0FBQyxDQUFDLFVBQUQsQ0FBRCxFQUFlO0FBQ2JjLElBQUFBLFFBQVEsRUFBRSxLQURHO0FBRWJDLElBQUFBLE9BQU8sRUFBRSxLQUZJO0FBR2JDLElBQUFBLE1BQU0sRUFBRSxZQUhLO0FBSWJDLElBQUFBLElBQUksRUFBRyxnRkFBRCxHQUNDO0FBTE0sR0FBZixDQVJhLENBQVIsQ0FBUDtBQWdCRDs7QUFPRCxTQUFTZ0IsV0FBVCxDQUFzQlYsSUFBdEIsRUFBNEI7QUFDMUIsU0FBTyxJQUFJVixHQUFKLENBQVEsQ0FDYixHQUFHRCxtQkFEVSxFQUViLENBQUMsQ0FBQ1csSUFBRCxDQUFELEVBQVM7QUFDUEEsSUFBQUEsSUFBSSxFQUFFLEtBREM7QUFFUE4sSUFBQUEsSUFBSSxFQUFHLGVBQWNNLElBQUssc0NBQXBCLEdBQ0FBLElBREEsS0FDU25CLDRCQURULEdBQ3VCTCxjQUR2QixHQUN3Q0M7QUFIdkMsR0FBVCxDQUZhLEVBT2IsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxFQUFpQjtBQUNmZSxJQUFBQSxPQUFPLEVBQUUsSUFETTtBQUVmUSxJQUFBQSxJQUFJLEVBQUUsS0FGUztBQUdmTixJQUFBQSxJQUFJLEVBQUcsc0NBQXFDTSxJQUFLLG1DQUEzQyxHQUNDLHdEQUF1REEsSUFBSztBQUpwRCxHQUFqQixDQVBhLENBQVIsQ0FBUDtBQWNEOztBQU9ELFNBQVNjLGFBQVQsR0FBMEI7QUFDeEIsU0FBTyxJQUFJeEIsR0FBSixDQUFRLENBQ2IsR0FBRywyQkFBYTtBQUNkeUIsSUFBQUEsU0FBUyxFQUFFO0FBQ1RDLE1BQUFBLFFBQVEsRUFBRTtBQUNSeEIsUUFBQUEsT0FBTyxFQUFFeUI7QUFERDtBQUREO0FBREcsR0FBYixDQURVLEVBUWIsR0FBR0MsNEJBUlUsQ0FBUixDQUFQO0FBVUQ7O0FBTUQsTUFBTUEsNEJBQTRCLEdBQUcsSUFBSTVCLEdBQUosQ0FBUSxDQUMzQyxDQUNFLENBQUMsU0FBRCxDQURGLEVBRUU7QUFDRUMsRUFBQUEsUUFBUSxFQUFFLEtBRFo7QUFFRUMsRUFBQUEsT0FBTyxFQUFFLElBRlg7QUFHRUUsRUFBQUEsSUFBSSxFQUFFLGlCQUhSO0FBSUVELEVBQUFBLE1BQU0sRUFBRSxZQUpWO0FBS0VFLEVBQUFBLElBQUksRUFBRTtBQUxSLENBRkYsQ0FEMkMsRUFXM0MsQ0FDRSxDQUFDLGVBQUQsQ0FERixFQUVFO0FBQ0VILEVBQUFBLE9BQU8sRUFBRSxLQURYO0FBRUVHLEVBQUFBLElBQUksRUFBRSxZQUZSO0FBR0VGLEVBQUFBLE1BQU0sRUFBRSxZQUhWO0FBSUVGLEVBQUFBLFFBQVEsRUFBRSxLQUpaO0FBS0VHLEVBQUFBLElBQUksRUFBRTtBQUxSLENBRkYsQ0FYMkMsRUFxQjNDLENBQ0UsQ0FBQyxVQUFELENBREYsRUFFRTtBQUNFQyxFQUFBQSxJQUFJLEVBQUUsWUFEUjtBQUVFSyxFQUFBQSxJQUFJLEVBQUUsUUFGUjtBQUdFVCxFQUFBQSxRQUFRLEVBQUUsS0FIWjtBQUlFRyxFQUFBQSxJQUFJLEVBQUU7QUFKUixDQUZGLENBckIyQyxDQUFSLENBQXJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERFRkFVTFRfQkFTRV9QQVRIIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IERyaXZlckNvbmZpZyBmcm9tICcuLi9kcml2ZXItY29uZmlnJztcbmltcG9ydCB7IEFQUElVTV9IT01FLCBEUklWRVJfVFlQRSwgSU5TVEFMTF9UWVBFUywgUExVR0lOX1RZUEUgfSBmcm9tICcuLi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCBQbHVnaW5Db25maWcgZnJvbSAnLi4vcGx1Z2luLWNvbmZpZyc7XG5pbXBvcnQgeyB0b1BhcnNlckFyZ3MgfSBmcm9tICcuLi9zY2hlbWEvY2xpLWFyZ3MnO1xuXG5jb25zdCBEUklWRVJfRVhBTVBMRSA9ICd4Y3VpdGVzdCc7XG5jb25zdCBQTFVHSU5fRVhBTVBMRSA9ICdmaW5kX2J5X2ltYWdlJztcbmNvbnN0IFVTRV9BTExfUExVR0lOUyA9ICdhbGwnO1xuXG4vKiogQHR5cGUge1NldDxFeHRlbnNpb25UeXBlPn0gKi9cbmNvbnN0IEVYVEVOU0lPTl9UWVBFUyA9IG5ldyBTZXQoW0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRV0pO1xuXG5jb25zdCBkcml2ZXJDb25maWcgPSBEcml2ZXJDb25maWcuZ2V0SW5zdGFuY2UoQVBQSVVNX0hPTUUpO1xuY29uc3QgcGx1Z2luQ29uZmlnID0gUGx1Z2luQ29uZmlnLmdldEluc3RhbmNlKEFQUElVTV9IT01FKTtcblxuLy8gdGhpcyBzZXQgb2YgYXJncyB3b3JrcyBmb3IgYm90aCBkcml2ZXJzIGFuZCBwbHVnaW5zICgnZXh0ZW5zaW9ucycpXG4vKiogQHR5cGUge0FyZ3VtZW50RGVmaW5pdGlvbnN9ICovXG5jb25zdCBnbG9iYWxFeHRlbnNpb25BcmdzID0gbmV3IE1hcChbXG4gIFtbJy0tanNvbiddLCB7XG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgIGhlbHA6ICdVc2UgSlNPTiBmb3Igb3V0cHV0IGZvcm1hdCcsXG4gICAgZGVzdDogJ2pzb24nXG4gIH1dXG5dKTtcblxuLyoqXG4gKiBCdWlsZHMgYSBSZWNvcmQgb2YgZXh0ZW5zaW9uIHR5cGVzIHRvIGEgUmVjb3JkIG9mIHN1YmNvbW1hbmRzIHRvIHRoZWlyIGFyZ3VtZW50IGRlZmluaXRpb25zXG4gKi9cbmNvbnN0IGdldEV4dGVuc2lvbkFyZ3MgPSBfLm9uY2UoZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQXJncyAoKSB7XG4gIGNvbnN0IGV4dGVuc2lvbkFyZ3MgPSB7fTtcbiAgZm9yIChjb25zdCB0eXBlIG9mIEVYVEVOU0lPTl9UWVBFUykge1xuICAgIGV4dGVuc2lvbkFyZ3NbdHlwZV0gPSB7XG4gICAgICBsaXN0OiBtYWtlTGlzdEFyZ3ModHlwZSksXG4gICAgICBpbnN0YWxsOiBtYWtlSW5zdGFsbEFyZ3ModHlwZSksXG4gICAgICB1bmluc3RhbGw6IG1ha2VVbmluc3RhbGxBcmdzKHR5cGUpLFxuICAgICAgdXBkYXRlOiBtYWtlVXBkYXRlQXJncyh0eXBlKSxcbiAgICAgIHJ1bjogbWFrZVJ1bkFyZ3ModHlwZSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8RXh0ZW5zaW9uVHlwZSwgUmVjb3JkPHN0cmluZyxBcmd1bWVudERlZmluaXRpb25zW10+Pn0gKi8gKGV4dGVuc2lvbkFyZ3MpO1xufSk7XG5cbi8qKlxuICogTWFrZXMgdGhlIG9wdHMgZm9yIHRoZSBgbGlzdGAgc3ViY29tbWFuZCBmb3IgZWFjaCBleHRlbnNpb24gdHlwZS5cbiAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gdHlwZVxuICogQHJldHVybnMge0FyZ3VtZW50RGVmaW5pdGlvbnN9XG4gKi9cbmZ1bmN0aW9uIG1ha2VMaXN0QXJncyAodHlwZSkge1xuICByZXR1cm4gbmV3IE1hcChbXG4gICAgLi4uZ2xvYmFsRXh0ZW5zaW9uQXJncyxcbiAgICBbWyctLWluc3RhbGxlZCddLCB7XG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgICAgaGVscDogYExpc3Qgb25seSBpbnN0YWxsZWQgJHt0eXBlfXNgLFxuICAgICAgZGVzdDogJ3Nob3dJbnN0YWxsZWQnXG4gICAgfV0sXG4gICAgW1snLS11cGRhdGVzJ10sIHtcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgICBoZWxwOiAnU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBuZXdlciB2ZXJzaW9ucycsXG4gICAgICBkZXN0OiAnc2hvd1VwZGF0ZXMnXG4gICAgfV1cbiAgXSk7XG59XG5cbi8qKlxuICogTWFrZXMgdGhlIG9wdHMgZm9yIHRoZSBgaW5zdGFsbGAgc3ViY29tbWFuZCBmb3IgZWFjaCBleHRlbnNpb24gdHlwZVxuICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSB0eXBlXG4gKiBAcmV0dXJucyB7QXJndW1lbnREZWZpbml0aW9uc31cbiAqL1xuZnVuY3Rpb24gbWFrZUluc3RhbGxBcmdzICh0eXBlKSB7XG4gIHJldHVybiBuZXcgTWFwKFtcbiAgICAuLi5nbG9iYWxFeHRlbnNpb25BcmdzLFxuICAgIFtbdHlwZV0sIHtcbiAgICAgIHR5cGU6ICdzdHInLFxuICAgICAgaGVscDogYE5hbWUgb2YgdGhlICR7dHlwZX0gdG8gaW5zdGFsbCwgZm9yIGV4YW1wbGU6IGAgK1xuICAgICAgICAgICAgdHlwZSA9PT0gRFJJVkVSX1RZUEUgPyBEUklWRVJfRVhBTVBMRSA6IFBMVUdJTl9FWEFNUExFLFxuICAgIH1dLFxuICAgIFtbJy0tc291cmNlJ10sIHtcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBjaG9pY2VzOiBJTlNUQUxMX1RZUEVTLFxuICAgICAgaGVscDogYFdoZXJlIHRvIGxvb2sgZm9yIHRoZSAke3R5cGV9IGlmIGl0IGlzIG5vdCBvbmUgb2YgQXBwaXVtJ3MgdmVyaWZpZWQgYCArXG4gICAgICAgICAgICBgJHt0eXBlfXMuIFBvc3NpYmxlIHZhbHVlczogJHtJTlNUQUxMX1RZUEVTLmpvaW4oJywgJyl9YCxcbiAgICAgIGRlc3Q6ICdpbnN0YWxsVHlwZSdcbiAgICB9XSxcbiAgICBbWyctLXBhY2thZ2UnXSwge1xuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIHR5cGU6ICdzdHInLFxuICAgICAgaGVscDogYElmIGluc3RhbGxpbmcgZnJvbSBHaXQgb3IgR2l0SHViLCB0aGUgcGFja2FnZSBuYW1lLCBhcyBkZWZpbmVkIGluIHRoZSBwbHVnaW4ncyBgICtcbiAgICAgICAgICAgIGBwYWNrYWdlLmpzb24gZmlsZSBpbiB0aGUgXCJuYW1lXCIgZmllbGQsIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHksIGFuZCBgICtcbiAgICAgICAgICAgIGBzaG91bGQgYmUgcmVwb3J0ZWQgaGVyZSwgb3RoZXJ3aXNlIHRoZSBpbnN0YWxsIHdpbGwgcHJvYmFibHkgZmFpbC5gLFxuICAgICAgZGVzdDogJ3BhY2thZ2VOYW1lJyxcbiAgICB9XSxcbiAgXSk7XG59XG5cblxuLyoqXG4gKiBNYWtlcyB0aGUgb3B0cyBmb3IgdGhlIGB1bmluc3RhbGxgIHN1YmNvbW1hbmQgZm9yIGVhY2ggZXh0ZW5zaW9uIHR5cGVcbiAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gdHlwZVxuICogQHJldHVybnMge0FyZ3VtZW50RGVmaW5pdGlvbnN9XG4gKi9cbmZ1bmN0aW9uIG1ha2VVbmluc3RhbGxBcmdzICh0eXBlKSB7XG4gIHJldHVybiBuZXcgTWFwKFtcbiAgICAuLi5nbG9iYWxFeHRlbnNpb25BcmdzLFxuICAgIFtbdHlwZV0sIHtcbiAgICAgIHR5cGU6ICdzdHInLFxuICAgICAgaGVscDogJ05hbWUgb2YgdGhlIGRyaXZlciB0byB1bmluc3RhbGwsIGZvciBleGFtcGxlOiAnICtcbiAgICAgICAgICAgIHR5cGUgPT09IERSSVZFUl9UWVBFID8gRFJJVkVSX0VYQU1QTEUgOiBQTFVHSU5fRVhBTVBMRVxuICAgIH1dLFxuICBdKTtcbn1cblxuLyoqXG4gKiBNYWtlcyB0aGUgb3B0cyBmb3IgdGhlIGB1cGRhdGVgIHN1YmNvbW1hbmQgZm9yIGVhY2ggZXh0ZW5zaW9uIHR5cGVcbiAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gdHlwZVxuICogQHJldHVybnMge0FyZ3VtZW50RGVmaW5pdGlvbnN9XG4gKi9cbmZ1bmN0aW9uIG1ha2VVcGRhdGVBcmdzICh0eXBlKSB7XG4gIHJldHVybiBuZXcgTWFwKFtcbiAgICAuLi5nbG9iYWxFeHRlbnNpb25BcmdzLFxuICAgIFtbdHlwZV0sIHtcbiAgICAgIHR5cGU6ICdzdHInLFxuICAgICAgaGVscDogYE5hbWUgb2YgdGhlICR7dHlwZX0gdG8gdXBkYXRlLCBvciB0aGUgd29yZCBcImluc3RhbGxlZFwiIHRvIHVwZGF0ZSBhbGwgaW5zdGFsbGVkIGAgK1xuICAgICAgICAgICAgYCR7dHlwZX1zLiBUbyBzZWUgYXZhaWxhYmxlIHVwZGF0ZXMsIHJ1biBcImFwcGl1bSAke3R5cGV9IGxpc3QgLS1pbnN0YWxsZWQgLS11cGRhdGVzXCIuIGAgK1xuICAgICAgICAgICAgJ0ZvciBleGFtcGxlOiAnICsgdHlwZSA9PT0gRFJJVkVSX1RZUEUgPyBEUklWRVJfRVhBTVBMRSA6IFBMVUdJTl9FWEFNUExFLFxuICAgIH1dLFxuICAgIFtbJy0tdW5zYWZlJ10sIHtcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgICBoZWxwOiBgSW5jbHVkZSB1cGRhdGVzIHRoYXQgbWlnaHQgaGF2ZSBhIG5ldyBtYWpvciByZXZpc2lvbiwgYW5kIHBvdGVudGlhbGx5IGluY2x1ZGUgYCArXG4gICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlc2AsXG4gICAgfV0sXG4gIF0pO1xufVxuXG4vKipcbiAqIE1ha2VzIHRoZSBvcHRzIGZvciB0aGUgYHJ1bmAgc3ViY29tbWFuZCBmb3IgZWFjaCBleHRlbnNpb24gdHlwZVxuICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSB0eXBlXG4gKiBAcmV0dXJucyB7QXJndW1lbnREZWZpbml0aW9uc31cbiAqL1xuZnVuY3Rpb24gbWFrZVJ1bkFyZ3MgKHR5cGUpIHtcbiAgcmV0dXJuIG5ldyBNYXAoW1xuICAgIC4uLmdsb2JhbEV4dGVuc2lvbkFyZ3MsXG4gICAgW1t0eXBlXSwge1xuICAgICAgdHlwZTogJ3N0cicsXG4gICAgICBoZWxwOiBgTmFtZSBvZiB0aGUgJHt0eXBlfSB0byBydW4gYSBzY3JpcHQgZnJvbSwgZm9yIGV4YW1wbGU6IGAgK1xuICAgICAgICAgICAgdHlwZSA9PT0gRFJJVkVSX1RZUEUgPyBEUklWRVJfRVhBTVBMRSA6IFBMVUdJTl9FWEFNUExFLFxuICAgIH1dLFxuICAgIFtbJ3NjcmlwdE5hbWUnXSwge1xuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIHR5cGU6ICdzdHInLFxuICAgICAgaGVscDogYE5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW4gZnJvbSB0aGUgJHt0eXBlfS4gVGhlIHNjcmlwdCBuYW1lIG11c3QgYmUgY2FjaGVkIGAgK1xuICAgICAgICAgICAgYGluc2lkZSB0aGUgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXIgXCJhcHBpdW1cIiBpbnNpZGUgdGhlICR7dHlwZX0ncyBcInBhY2thZ2UuanNvblwiIGZpbGVgXG4gICAgfV0sXG4gIF0pO1xufVxuXG4vKipcbiAqIERlcml2ZXMgdGhlIG9wdGlvbnMgZm9yIHRoZSBgc2VydmVyYCBjb21tYW5kIGZyb20gdGhlIHNjaGVtYSwgYW5kIGFkZHMgdGhlIGFyZ3VtZW50c1xuICogd2hpY2ggYXJlIGRpc2FsbG93ZWQgaW4gdGhlIGNvbmZpZyBmaWxlLlxuICogQHJldHVybnMge0FyZ3VtZW50RGVmaW5pdGlvbnN9XG4gKi9cbmZ1bmN0aW9uIGdldFNlcnZlckFyZ3MgKCkge1xuICByZXR1cm4gbmV3IE1hcChbXG4gICAgLi4udG9QYXJzZXJBcmdzKHtcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICBiYXNlUGF0aDoge1xuICAgICAgICAgIGRlZmF1bHQ6IERFRkFVTFRfQkFTRV9QQVRIXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSksXG4gICAgLi4uc2VydmVyQXJnc0Rpc2FsbG93ZWRJbkNvbmZpZyxcbiAgXSk7XG59XG5cbi8qKlxuICogVGhlc2UgZG9uJ3QgbWFrZSBzZW5zZSBpbiB0aGUgY29udGV4dCBvZiBhIGNvbmZpZyBmaWxlIGZvciBvYnZpb3VzIHJlYXNvbnMuXG4gKiBAdHlwZSB7QXJndW1lbnREZWZpbml0aW9uc31cbiAqL1xuY29uc3Qgc2VydmVyQXJnc0Rpc2FsbG93ZWRJbkNvbmZpZyA9IG5ldyBNYXAoW1xuICBbXG4gICAgWyctLXNoZWxsJ10sXG4gICAge1xuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGhlbHA6ICdFbnRlciBSRVBMIG1vZGUnLFxuICAgICAgYWN0aW9uOiAnc3RvcmVfdHJ1ZScsXG4gICAgICBkZXN0OiAnc2hlbGwnLFxuICAgIH0sXG4gIF0sXG4gIFtcbiAgICBbJy0tc2hvdy1jb25maWcnXSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGRlc3Q6ICdzaG93Q29uZmlnJyxcbiAgICAgIGFjdGlvbjogJ3N0b3JlX3RydWUnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgaGVscDogJ1Nob3cgaW5mbyBhYm91dCB0aGUgYXBwaXVtIHNlcnZlciBjb25maWd1cmF0aW9uIGFuZCBleGl0JyxcbiAgICB9LFxuICBdLFxuICBbXG4gICAgWyctLWNvbmZpZyddLFxuICAgIHtcbiAgICAgIGRlc3Q6ICdjb25maWdGaWxlJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgaGVscDogJ0V4cGxpY2l0IHBhdGggdG8gQXBwaXVtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gICAgfSxcbiAgXSxcbl0pO1xuXG5leHBvcnQge1xuICBnZXRTZXJ2ZXJBcmdzLFxuICBnZXRFeHRlbnNpb25BcmdzLFxuICBVU0VfQUxMX1BMVUdJTlMsXG4gIGRyaXZlckNvbmZpZyxcbiAgcGx1Z2luQ29uZmlnLFxuICBBUFBJVU1fSE9NRVxufTtcblxuLyoqXG4gKiBBbGlhc1xuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEEgdHVwbGUgb2YgYXJndW1lbnQgYWxpYXNlcyBhbmQgYXJndW1lbnQgb3B0aW9uc1xuICogQHR5cGVkZWYge01hcDxzdHJpbmdbXSxpbXBvcnQoJ2FyZ3BhcnNlJykuQXJndW1lbnRPcHRpb25zPn0gQXJndW1lbnREZWZpbml0aW9uc1xuICovXG4iXSwiZmlsZSI6ImxpYi9jbGkvYXJncy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9