appium 2.0.0-beta.2 → 2.0.0-beta.20

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 (70) hide show
  1. package/README.md +9 -9
  2. package/build/lib/appium-config.schema.json +0 -0
  3. package/build/lib/appium.js +157 -53
  4. package/build/lib/cli/argparse-actions.js +104 -0
  5. package/build/lib/cli/args.js +115 -279
  6. package/build/lib/cli/driver-command.js +11 -1
  7. package/build/lib/cli/extension-command.js +60 -8
  8. package/build/lib/cli/extension.js +30 -7
  9. package/build/lib/cli/npm.js +17 -14
  10. package/build/lib/cli/parser.js +152 -89
  11. package/build/lib/cli/plugin-command.js +11 -1
  12. package/build/lib/cli/utils.js +29 -3
  13. package/build/lib/config-file.js +141 -0
  14. package/build/lib/config.js +76 -61
  15. package/build/lib/driver-config.js +42 -19
  16. package/build/lib/drivers.js +8 -4
  17. package/build/lib/ext-config-io.js +165 -0
  18. package/build/lib/extension-config.js +130 -61
  19. package/build/lib/grid-register.js +22 -24
  20. package/build/lib/logger.js +3 -3
  21. package/build/lib/logsink.js +11 -13
  22. package/build/lib/main.js +197 -77
  23. package/build/lib/plugin-config.js +20 -10
  24. package/build/lib/plugins.js +4 -2
  25. package/build/lib/schema/appium-config-schema.js +252 -0
  26. package/build/lib/schema/arg-spec.js +120 -0
  27. package/build/lib/schema/cli-args.js +173 -0
  28. package/build/lib/schema/cli-transformers.js +76 -0
  29. package/build/lib/schema/index.js +36 -0
  30. package/build/lib/schema/keywords.js +62 -0
  31. package/build/lib/schema/schema.js +357 -0
  32. package/build/lib/utils.js +44 -99
  33. package/lib/appium-config.schema.json +277 -0
  34. package/lib/appium.js +201 -65
  35. package/lib/cli/argparse-actions.js +77 -0
  36. package/lib/cli/args.js +174 -375
  37. package/lib/cli/driver-command.js +4 -0
  38. package/lib/cli/extension-command.js +70 -5
  39. package/lib/cli/extension.js +25 -5
  40. package/lib/cli/npm.js +18 -12
  41. package/lib/cli/parser.js +254 -79
  42. package/lib/cli/plugin-command.js +4 -0
  43. package/lib/cli/utils.js +21 -1
  44. package/lib/config-file.js +227 -0
  45. package/lib/config.js +109 -62
  46. package/lib/driver-config.js +66 -11
  47. package/lib/drivers.js +4 -1
  48. package/lib/ext-config-io.js +287 -0
  49. package/lib/extension-config.js +225 -67
  50. package/lib/grid-register.js +27 -24
  51. package/lib/logger.js +1 -1
  52. package/lib/logsink.js +10 -7
  53. package/lib/main.js +211 -77
  54. package/lib/plugin-config.js +34 -5
  55. package/lib/plugins.js +1 -0
  56. package/lib/schema/appium-config-schema.js +286 -0
  57. package/lib/schema/arg-spec.js +218 -0
  58. package/lib/schema/cli-args.js +273 -0
  59. package/lib/schema/cli-transformers.js +123 -0
  60. package/lib/schema/index.js +2 -0
  61. package/lib/schema/keywords.js +119 -0
  62. package/lib/schema/schema.js +577 -0
  63. package/lib/utils.js +42 -88
  64. package/package.json +55 -80
  65. package/postinstall.js +71 -0
  66. package/types/appium-config.d.ts +197 -0
  67. package/types/types.d.ts +201 -0
  68. package/CHANGELOG.md +0 -3515
  69. package/build/lib/cli/parser-helpers.js +0 -82
  70. package/lib/cli/parser-helpers.js +0 -79
@@ -5,7 +5,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.AppiumDriver = void 0;
8
+ exports.NoDriverProxyCommandError = exports.AppiumDriver = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
11
 
10
12
  require("source-map-support/register");
11
13
 
@@ -17,15 +19,13 @@ var _config = require("./config");
17
19
 
18
20
  var _drivers = require("./drivers");
19
21
 
20
- var _appiumBaseDriver = require("appium-base-driver");
21
-
22
- var _bluebird = _interopRequireDefault(require("bluebird"));
22
+ var _baseDriver = require("@appium/base-driver");
23
23
 
24
24
  var _asyncLock = _interopRequireDefault(require("async-lock"));
25
25
 
26
26
  var _utils = require("./utils");
27
27
 
28
- var _appiumSupport = require("appium-support");
28
+ var _support = require("@appium/support");
29
29
 
30
30
  const desiredCapabilityConstraints = {
31
31
  automationName: {
@@ -40,19 +40,23 @@ const desiredCapabilityConstraints = {
40
40
  const sessionsListGuard = new _asyncLock.default();
41
41
  const pendingDriversGuard = new _asyncLock.default();
42
42
 
43
- class AppiumDriver extends _appiumBaseDriver.BaseDriver {
43
+ class AppiumDriver extends _baseDriver.BaseDriver {
44
44
  constructor(args) {
45
45
  if (args.tmpDir) {
46
46
  process.env.APPIUM_TMP_DIR = args.tmpDir;
47
47
  }
48
48
 
49
49
  super(args);
50
+ (0, _defineProperty2.default)(this, "driverConfig", void 0);
50
51
  this.desiredCapConstraints = desiredCapabilityConstraints;
51
52
  this.newCommandTimeoutMs = 0;
52
- this.args = Object.assign({}, args);
53
+ this.args = { ...args
54
+ };
53
55
  this.sessions = {};
54
56
  this.pendingDrivers = {};
55
- this.plugins = [];
57
+ this.pluginClasses = [];
58
+ this.sessionPlugins = {};
59
+ this.sessionlessPlugins = [];
56
60
  (0, _config.updateBuildInfo)();
57
61
  }
58
62
 
@@ -83,16 +87,30 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
83
87
  }));
84
88
  }
85
89
 
86
- printNewSessionAnnouncement(driverName, driverVersion) {
87
- const introString = driverVersion ? `Appium v${_config.APPIUM_VER} creating new ${driverName} (v${driverVersion}) session` : `Appium v${_config.APPIUM_VER} creating new ${driverName} session`;
90
+ printNewSessionAnnouncement(driverName, driverVersion, driverBaseVersion) {
91
+ _logger.default.info(driverVersion ? `Appium v${_config.APPIUM_VER} creating new ${driverName} (v${driverVersion}) session` : `Appium v${_config.APPIUM_VER} creating new ${driverName} session`);
92
+
93
+ _logger.default.info(`Checking BaseDriver versions for Appium and ${driverName}`);
88
94
 
89
- _logger.default.info(introString);
95
+ _logger.default.info(AppiumDriver.baseVersion ? `Appium's BaseDriver version is ${AppiumDriver.baseVersion}` : `Could not determine Appium's BaseDriver version`);
96
+
97
+ _logger.default.info(driverBaseVersion ? `${driverName}'s BaseDriver version is ${driverBaseVersion}` : `Could not determine ${driverName}'s BaseDriver version`);
90
98
  }
91
99
 
92
100
  _findMatchingDriver(...args) {
93
101
  return (0, _drivers.findMatchingDriver)(...args);
94
102
  }
95
103
 
104
+ assignCliArgsToExtension(extType, extName, extInstance) {
105
+ var _this$args$extType;
106
+
107
+ const cliArgs = (_this$args$extType = this.args[extType]) === null || _this$args$extType === void 0 ? void 0 : _this$args$extType[extName];
108
+
109
+ if (!_lodash.default.isEmpty(cliArgs)) {
110
+ extInstance.cliArgs = cliArgs;
111
+ }
112
+ }
113
+
96
114
  async createSession(jsonwpCaps, reqCaps, w3cCapabilities) {
97
115
  const defaultCapabilities = _lodash.default.cloneDeep(this.args.defaultCapabilities);
98
116
 
@@ -126,78 +144,80 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
126
144
 
127
145
  const {
128
146
  driver: InnerDriver,
129
- version: driverVersion
147
+ version: driverVersion,
148
+ driverName
130
149
  } = this._findMatchingDriver(this.driverConfig, desiredCaps);
131
150
 
132
- this.printNewSessionAnnouncement(InnerDriver.name, driverVersion);
151
+ this.printNewSessionAnnouncement(InnerDriver.name, driverVersion, InnerDriver.baseVersion);
133
152
 
134
153
  if (this.args.sessionOverride) {
135
154
  await this.deleteAllSessions();
136
155
  }
137
156
 
138
157
  let runningDriversData, otherPendingDriversData;
139
- const d = new InnerDriver(this.args);
158
+ const driverInstance = new InnerDriver(this.args, true);
140
159
 
141
160
  if (this.args.relaxedSecurityEnabled) {
142
161
  _logger.default.info(`Applying relaxed security to '${InnerDriver.name}' as per ` + `server command line argument. All insecure features will be ` + `enabled unless explicitly disabled by --deny-insecure`);
143
162
 
144
- d.relaxedSecurityEnabled = true;
163
+ driverInstance.relaxedSecurityEnabled = true;
145
164
  }
146
165
 
147
166
  if (!_lodash.default.isEmpty(this.args.denyInsecure)) {
148
167
  _logger.default.info('Explicitly preventing use of insecure features:');
149
168
 
150
169
  this.args.denyInsecure.map(a => _logger.default.info(` ${a}`));
151
- d.denyInsecure = this.args.denyInsecure;
170
+ driverInstance.denyInsecure = this.args.denyInsecure;
152
171
  }
153
172
 
154
173
  if (!_lodash.default.isEmpty(this.args.allowInsecure)) {
155
174
  _logger.default.info('Explicitly enabling use of insecure features:');
156
175
 
157
176
  this.args.allowInsecure.map(a => _logger.default.info(` ${a}`));
158
- d.allowInsecure = this.args.allowInsecure;
177
+ driverInstance.allowInsecure = this.args.allowInsecure;
159
178
  }
160
179
 
161
- d.server = this.server;
180
+ this.assignCliArgsToExtension('driver', driverName, driverInstance);
181
+ driverInstance.server = this.server;
162
182
 
163
183
  try {
164
184
  runningDriversData = await this.curSessionDataForDriver(InnerDriver);
165
185
  } catch (e) {
166
- throw new _appiumBaseDriver.errors.SessionNotCreatedError(e.message);
186
+ throw new _baseDriver.errors.SessionNotCreatedError(e.message);
167
187
  }
168
188
 
169
189
  await pendingDriversGuard.acquire(AppiumDriver.name, () => {
170
190
  this.pendingDrivers[InnerDriver.name] = this.pendingDrivers[InnerDriver.name] || [];
171
191
  otherPendingDriversData = this.pendingDrivers[InnerDriver.name].map(drv => drv.driverData);
172
- this.pendingDrivers[InnerDriver.name].push(d);
192
+ this.pendingDrivers[InnerDriver.name].push(driverInstance);
173
193
  });
174
194
 
175
195
  try {
176
- [innerSessionId, dCaps] = await d.createSession(processedJsonwpCapabilities, reqCaps, processedW3CCapabilities, [...runningDriversData, ...otherPendingDriversData]);
177
- protocol = d.protocol;
196
+ [innerSessionId, dCaps] = await driverInstance.createSession(processedJsonwpCapabilities, reqCaps, processedW3CCapabilities, [...runningDriversData, ...otherPendingDriversData]);
197
+ protocol = driverInstance.protocol;
178
198
  await sessionsListGuard.acquire(AppiumDriver.name, () => {
179
- this.sessions[innerSessionId] = d;
199
+ this.sessions[innerSessionId] = driverInstance;
180
200
  });
181
201
  } finally {
182
202
  await pendingDriversGuard.acquire(AppiumDriver.name, () => {
183
- _lodash.default.pull(this.pendingDrivers[InnerDriver.name], d);
203
+ _lodash.default.pull(this.pendingDrivers[InnerDriver.name], driverInstance);
184
204
  });
185
205
  }
186
206
 
187
- this.attachUnexpectedShutdownHandler(d, innerSessionId);
207
+ this.attachUnexpectedShutdownHandler(driverInstance, innerSessionId);
188
208
 
189
209
  _logger.default.info(`New ${InnerDriver.name} session created successfully, session ` + `${innerSessionId} added to master session list`);
190
210
 
191
- d.startNewCommandTimeout();
211
+ driverInstance.startNewCommandTimeout();
192
212
 
193
- if (d.isW3CProtocol() && !_lodash.default.isEmpty(w3cSettings)) {
213
+ if (driverInstance.isW3CProtocol() && !_lodash.default.isEmpty(w3cSettings)) {
194
214
  _logger.default.info(`Applying the initial values to Appium settings parsed from W3C caps: ` + JSON.stringify(w3cSettings));
195
215
 
196
- await d.updateSettings(w3cSettings);
197
- } else if (d.isMjsonwpProtocol() && !_lodash.default.isEmpty(jwpSettings)) {
216
+ await driverInstance.updateSettings(w3cSettings);
217
+ } else if (driverInstance.isMjsonwpProtocol() && !_lodash.default.isEmpty(jwpSettings)) {
198
218
  _logger.default.info(`Applying the initial values to Appium settings parsed from MJSONWP caps: ` + JSON.stringify(jwpSettings));
199
219
 
200
- await d.updateSettings(jwpSettings);
220
+ await driverInstance.updateSettings(jwpSettings);
201
221
  }
202
222
  } catch (error) {
203
223
  return {
@@ -213,24 +233,33 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
213
233
  }
214
234
 
215
235
  attachUnexpectedShutdownHandler(driver, innerSessionId) {
216
- const removeSessionFromMasterList = (cause = new Error('Unknown error')) => {
217
- _logger.default.warn(`Closing session, cause was '${cause.message}'`);
236
+ const onShutdown = (cause = new Error('Unknown error')) => {
237
+ _logger.default.warn(`Ending session, cause was '${cause.message}'`);
238
+
239
+ if (this.sessionPlugins[innerSessionId]) {
240
+ for (const plugin of this.sessionPlugins[innerSessionId]) {
241
+ if (_lodash.default.isFunction(plugin.onUnexpectedShutdown)) {
242
+ _logger.default.debug(`Plugin ${plugin.name} defines an unexpected shutdown handler; calling it now`);
243
+
244
+ try {
245
+ plugin.onUnexpectedShutdown(driver, cause);
246
+ } catch (e) {
247
+ _logger.default.warn(`Got an error when running plugin ${plugin.name} shutdown handler: ${e}`);
248
+ }
249
+ } else {
250
+ _logger.default.debug(`Plugin ${plugin.name} does not define an unexpected shutdown handler`);
251
+ }
252
+ }
253
+ }
218
254
 
219
255
  _logger.default.info(`Removing session '${innerSessionId}' from our master session list`);
220
256
 
221
257
  delete this.sessions[innerSessionId];
258
+ delete this.sessionPlugins[innerSessionId];
222
259
  };
223
260
 
224
- if (_lodash.default.isFunction((driver.onUnexpectedShutdown || {}).then)) {
225
- driver.onUnexpectedShutdown.then(() => {
226
- throw new Error('Unexpected shutdown');
227
- }).catch(e => {
228
- if (!(e instanceof _bluebird.default.CancellationError)) {
229
- removeSessionFromMasterList(e);
230
- }
231
- });
232
- } else if (_lodash.default.isFunction(driver.onUnexpectedShutdown)) {
233
- driver.onUnexpectedShutdown(removeSessionFromMasterList);
261
+ if (_lodash.default.isFunction(driver.onUnexpectedShutdown)) {
262
+ driver.onUnexpectedShutdown(onShutdown);
234
263
  } else {
235
264
  _logger.default.warn(`Failed to attach the unexpected shutdown listener. ` + `Is 'onUnexpectedShutdown' method available for '${driver.constructor.name}'?`);
236
265
  }
@@ -269,6 +298,7 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
269
298
  _logger.default.info(`Removing session ${sessionId} from our master session list`);
270
299
 
271
300
  delete this.sessions[sessionId];
301
+ delete this.sessionPlugins[sessionId];
272
302
  });
273
303
  return {
274
304
  protocol,
@@ -298,7 +328,7 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
298
328
  reason
299
329
  } = opts;
300
330
 
301
- _logger.default.debug(`Cleaning up ${_appiumSupport.util.pluralize('active session', sessionsCount, true)}`);
331
+ _logger.default.debug(`Cleaning up ${_support.util.pluralize('active session', sessionsCount, true)}`);
302
332
 
303
333
  const cleanupPromises = force ? _lodash.default.values(this.sessions).map(drv => drv.startUnexpectedShutdown(reason && new Error(reason))) : _lodash.default.keys(this.sessions).map(id => this.deleteSession(id));
304
334
 
@@ -311,18 +341,51 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
311
341
  }
312
342
  }
313
343
 
314
- pluginsToHandleCmd(cmd) {
315
- return this.plugins.filter(p => p.commands === true || _lodash.default.isArray(p.commands) && _lodash.default.includes(p.commands, cmd));
344
+ pluginsForSession(sessionId = null) {
345
+ if (sessionId) {
346
+ if (!this.sessionPlugins[sessionId]) {
347
+ this.sessionPlugins[sessionId] = this.createPluginInstances();
348
+ }
349
+
350
+ return this.sessionPlugins[sessionId];
351
+ }
352
+
353
+ if (_lodash.default.isEmpty(this.sessionlessPlugins)) {
354
+ this.sessionlessPlugins = this.createPluginInstances();
355
+ }
356
+
357
+ return this.sessionlessPlugins;
358
+ }
359
+
360
+ pluginsToHandleCmd(cmd, sessionId = null) {
361
+ return this.pluginsForSession(sessionId).filter(p => _lodash.default.isFunction(p[cmd]) || _lodash.default.isFunction(p.handle));
362
+ }
363
+
364
+ createPluginInstances() {
365
+ return this.pluginClasses.map(PluginClass => {
366
+ const name = PluginClass.pluginName;
367
+ const plugin = new PluginClass(name);
368
+ this.assignCliArgsToExtension('plugin', name, plugin);
369
+ return plugin;
370
+ });
316
371
  }
317
372
 
318
373
  async executeCommand(cmd, ...args) {
374
+ var _$last;
375
+
319
376
  const isGetStatus = cmd === 'getStatus';
320
377
  const isUmbrellaCmd = !isGetStatus && isAppiumDriverCommand(cmd);
321
378
  const isSessionCmd = !isGetStatus && !isUmbrellaCmd;
322
- const plugins = this.pluginsToHandleCmd(cmd);
379
+ const reqForProxy = (_$last = _lodash.default.last(args)) === null || _$last === void 0 ? void 0 : _$last.reqForProxy;
380
+
381
+ if (reqForProxy) {
382
+ args.pop();
383
+ }
384
+
323
385
  let sessionId = null;
324
386
  let dstSession = null;
325
387
  let protocol = null;
388
+ let driver = this;
326
389
 
327
390
  if (isSessionCmd) {
328
391
  sessionId = _lodash.default.last(args);
@@ -333,8 +396,10 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
333
396
  }
334
397
 
335
398
  protocol = dstSession.protocol;
399
+ driver = dstSession;
336
400
  }
337
401
 
402
+ const plugins = this.pluginsToHandleCmd(cmd, sessionId);
338
403
  const cmdHandledBy = {
339
404
  default: false
340
405
  };
@@ -343,6 +408,14 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
343
408
  plugins.length && _logger.default.info(`Executing default handling behavior for command '${cmd}'`);
344
409
  cmdHandledBy.default = true;
345
410
 
411
+ if (reqForProxy) {
412
+ if (!dstSession.proxyCommand) {
413
+ throw new NoDriverProxyCommandError();
414
+ }
415
+
416
+ return await dstSession.proxyCommand(reqForProxy.originalUrl, reqForProxy.method, reqForProxy.body);
417
+ }
418
+
346
419
  if (isGetStatus) {
347
420
  return await this.getStatus();
348
421
  }
@@ -355,6 +428,7 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
355
428
  };
356
429
 
357
430
  const wrappedCmd = this.wrapCommandWithPlugins({
431
+ driver,
358
432
  cmd,
359
433
  args,
360
434
  plugins,
@@ -365,14 +439,25 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
365
439
  wrappedCmd,
366
440
  protocol
367
441
  });
368
- plugins.length && this.logPluginHandlerReport({
442
+ this.logPluginHandlerReport(plugins, {
369
443
  cmd,
370
444
  cmdHandledBy
371
445
  });
446
+
447
+ if (cmd === _baseDriver.CREATE_SESSION_COMMAND && this.sessionlessPlugins.length && !res.error) {
448
+ const sessionId = _lodash.default.first(res.value);
449
+
450
+ _logger.default.info(`Promoting ${this.sessionlessPlugins.length} sessionless plugins to be attached ` + `to session ID ${sessionId}`);
451
+
452
+ this.sessionPlugins[sessionId] = this.sessionlessPlugins;
453
+ this.sessionlessPlugins = [];
454
+ }
455
+
372
456
  return res;
373
457
  }
374
458
 
375
459
  wrapCommandWithPlugins({
460
+ driver,
376
461
  cmd,
377
462
  args,
378
463
  next,
@@ -388,22 +473,31 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
388
473
  _logger.default.info(`Plugin ${plugin.name} is now handling cmd '${cmd}'`);
389
474
 
390
475
  cmdHandledBy[plugin.name] = true;
391
- return await plugin.handle(_next, this, cmd, ...args);
476
+
477
+ if (plugin[cmd]) {
478
+ return await plugin[cmd](_next, driver, ...args);
479
+ }
480
+
481
+ return await plugin.handle(_next, driver, cmd, ...args);
392
482
  })(next);
393
483
  }
394
484
 
395
485
  return next;
396
486
  }
397
487
 
398
- logPluginHandlerReport({
488
+ logPluginHandlerReport(plugins, {
399
489
  cmd,
400
490
  cmdHandledBy
401
491
  }) {
492
+ if (!plugins.length) {
493
+ return;
494
+ }
495
+
402
496
  const didHandle = Object.keys(cmdHandledBy).filter(k => cmdHandledBy[k]);
403
497
  const didntHandle = Object.keys(cmdHandledBy).filter(k => !cmdHandledBy[k]);
404
498
 
405
499
  if (didntHandle.length > 0) {
406
- _logger.default.info(`Command '${cmd}' was not handled by the following beahviors or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
500
+ _logger.default.info(`Command '${cmd}' was *not* handled by the following behaviours or plugins, even ` + `though they were registered to handle it: ${JSON.stringify(didntHandle)}. The ` + `command *was* handled by these: ${JSON.stringify(didHandle)}.`);
407
501
  }
408
502
  }
409
503
 
@@ -452,8 +546,18 @@ class AppiumDriver extends _appiumBaseDriver.BaseDriver {
452
546
  exports.AppiumDriver = AppiumDriver;
453
547
 
454
548
  function isAppiumDriverCommand(cmd) {
455
- return !(0, _appiumBaseDriver.isSessionCommand)(cmd) || cmd === 'deleteSession';
456
- }require('source-map-support').install();
549
+ return !(0, _baseDriver.isSessionCommand)(cmd) || cmd === 'deleteSession';
550
+ }
551
+
552
+ class NoDriverProxyCommandError extends Error {
553
+ constructor() {
554
+ super(`The default behavior for this command was to proxy, but the driver ` + `did not have the 'proxyCommand' method defined. To fully support ` + `plugins, drivers should have 'proxyCommand' set to a jwpProxy object's ` + `'command()' method, in addition to the normal 'proxyReqRes'`);
555
+ (0, _defineProperty2.default)(this, "code", 'APPIUMERR_NO_DRIVER_PROXYCOMMAND');
556
+ }
557
+
558
+ }
559
+
560
+ exports.NoDriverProxyCommandError = NoDriverProxyCommandError;require('source-map-support').install();
457
561
 
458
562
 
459
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ0bXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1RNUF9ESVIiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwiT2JqZWN0IiwiYXNzaWduIiwic2Vzc2lvbnMiLCJwZW5kaW5nRHJpdmVycyIsInBsdWdpbnMiLCJpc0NvbW1hbmRzUXVldWVFbmFibGVkIiwic2Vzc2lvbkV4aXN0cyIsInNlc3Npb25JZCIsImRzdFNlc3Npb24iLCJkcml2ZXJGb3JTZXNzaW9uIiwiZ2V0U3RhdHVzIiwiYnVpbGQiLCJfIiwiY2xvbmUiLCJnZXRTZXNzaW9ucyIsImFjcXVpcmUiLCJuYW1lIiwidG9QYWlycyIsIm1hcCIsImlkIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwiY2FwcyIsInByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCIsImRyaXZlck5hbWUiLCJkcml2ZXJWZXJzaW9uIiwiaW50cm9TdHJpbmciLCJBUFBJVU1fVkVSIiwibG9nIiwiaW5mbyIsIl9maW5kTWF0Y2hpbmdEcml2ZXIiLCJjcmVhdGVTZXNzaW9uIiwianNvbndwQ2FwcyIsInJlcUNhcHMiLCJ3M2NDYXBhYmlsaXRpZXMiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwiY2xvbmVEZWVwIiwiZGVmYXVsdFNldHRpbmdzIiwiandwU2V0dGluZ3MiLCJ3M2NTZXR0aW5ncyIsImFsd2F5c01hdGNoIiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsInByb3RvY29sIiwiaW5uZXJTZXNzaW9uSWQiLCJkQ2FwcyIsInBhcnNlZENhcHMiLCJkZXNpcmVkQ2FwcyIsInByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyIsInByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyIsImVycm9yIiwiSW5uZXJEcml2ZXIiLCJ2ZXJzaW9uIiwiZHJpdmVyQ29uZmlnIiwic2Vzc2lvbk92ZXJyaWRlIiwiZGVsZXRlQWxsU2Vzc2lvbnMiLCJydW5uaW5nRHJpdmVyc0RhdGEiLCJvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSIsImQiLCJyZWxheGVkU2VjdXJpdHlFbmFibGVkIiwiaXNFbXB0eSIsImRlbnlJbnNlY3VyZSIsImEiLCJhbGxvd0luc2VjdXJlIiwic2VydmVyIiwiY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIiLCJlIiwiZXJyb3JzIiwiU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciIsIm1lc3NhZ2UiLCJkcnYiLCJkcml2ZXJEYXRhIiwicHVzaCIsInB1bGwiLCJhdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyIiwic3RhcnROZXdDb21tYW5kVGltZW91dCIsImlzVzNDUHJvdG9jb2wiLCJKU09OIiwic3RyaW5naWZ5IiwidXBkYXRlU2V0dGluZ3MiLCJpc01qc29ud3BQcm90b2NvbCIsInZhbHVlIiwicmVtb3ZlU2Vzc2lvbkZyb21NYXN0ZXJMaXN0IiwiY2F1c2UiLCJFcnJvciIsIndhcm4iLCJpc0Z1bmN0aW9uIiwib25VbmV4cGVjdGVkU2h1dGRvd24iLCJ0aGVuIiwiY2F0Y2giLCJCIiwiQ2FuY2VsbGF0aW9uRXJyb3IiLCJkYXRhIiwidmFsdWVzIiwiZmlsdGVyIiwicyIsImRhdHVtIiwiZGVsZXRlU2Vzc2lvbiIsIm90aGVyU2Vzc2lvbnNEYXRhIiwiY3VyQ29uc3RydWN0b3JOYW1lIiwia2V5Iiwib3B0cyIsInNlc3Npb25zQ291bnQiLCJzaXplIiwiZGVidWciLCJmb3JjZSIsInJlYXNvbiIsInV0aWwiLCJwbHVyYWxpemUiLCJjbGVhbnVwUHJvbWlzZXMiLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsImtleXMiLCJjbGVhbnVwUHJvbWlzZSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImNtZCIsInAiLCJjb21tYW5kcyIsImlzQXJyYXkiLCJpbmNsdWRlcyIsImV4ZWN1dGVDb21tYW5kIiwiaXNHZXRTdGF0dXMiLCJpc1VtYnJlbGxhQ21kIiwiaXNBcHBpdW1Ecml2ZXJDb21tYW5kIiwiaXNTZXNzaW9uQ21kIiwibGFzdCIsImNtZEhhbmRsZWRCeSIsImRlZmF1bHQiLCJkZWZhdWx0QmVoYXZpb3IiLCJsZW5ndGgiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwicGx1Z2luIiwiX25leHQiLCJoYW5kbGUiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLDRCQUE0QixHQUFHO0FBQ25DQyxFQUFBQSxjQUFjLEVBQUU7QUFDZEMsSUFBQUEsUUFBUSxFQUFFLElBREk7QUFFZEMsSUFBQUEsUUFBUSxFQUFFO0FBRkksR0FEbUI7QUFLbkNDLEVBQUFBLFlBQVksRUFBRTtBQUNaRixJQUFBQSxRQUFRLEVBQUUsSUFERTtBQUVaQyxJQUFBQSxRQUFRLEVBQUU7QUFGRTtBQUxxQixDQUFyQztBQVdBLE1BQU1FLGlCQUFpQixHQUFHLElBQUlDLGtCQUFKLEVBQTFCO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSUQsa0JBQUosRUFBNUI7O0FBRUEsTUFBTUUsWUFBTixTQUEyQkMsNEJBQTNCLENBQXNDO0FBQ3BDQyxFQUFBQSxXQUFXLENBQUVD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LE1BRU87QUFDTFQsTUFBQUEsR0FBRyxDQUFDbkQsS0FBSixHQUFZNEQsTUFBWjtBQUNBVCxNQUFBQSxHQUFHLENBQUNsRixLQUFKLEdBQVk0RixNQUFaO0FBQ0FWLE1BQUFBLEdBQUcsQ0FBQ3pGLFFBQUosR0FBZUEsUUFBZjtBQUNEOztBQUNELFdBQU95RixHQUFQO0FBQ0Q7O0FBR0RhLEVBQUFBLFdBQVcsQ0FBRTFJLFNBQUYsRUFBYTtBQUN0QixVQUFNQyxVQUFVLEdBQUcsS0FBS04sUUFBTCxDQUFjSyxTQUFkLENBQW5CO0FBQ0EsV0FBT0MsVUFBVSxJQUFJSSxnQkFBRTBFLFVBQUYsQ0FBYTlFLFVBQVUsQ0FBQ3lJLFdBQXhCLENBQWQsSUFBc0R6SSxVQUFVLENBQUN5SSxXQUFYLENBQXVCMUksU0FBdkIsQ0FBN0Q7QUFDRDs7QUFFRDJJLEVBQUFBLGlCQUFpQixDQUFFM0ksU0FBRixFQUFhO0FBQzVCLFVBQU1DLFVBQVUsR0FBRyxLQUFLTixRQUFMLENBQWNLLFNBQWQsQ0FBbkI7QUFDQSxXQUFPQyxVQUFVLEdBQUdBLFVBQVUsQ0FBQzBJLGlCQUFYLEVBQUgsR0FBb0MsRUFBckQ7QUFDRDs7QUFFREMsRUFBQUEsUUFBUSxDQUFFNUksU0FBRixFQUFhO0FBQ25CLFVBQU1DLFVBQVUsR0FBRyxLQUFLTixRQUFMLENBQWNLLFNBQWQsQ0FBbkI7QUFDQSxXQUFPQyxVQUFVLElBQUlBLFVBQVUsQ0FBQzJJLFFBQVgsQ0FBb0I1SSxTQUFwQixDQUFyQjtBQUNEOztBQW5lbUM7Ozs7QUF3ZXRDLFNBQVNtSCxxQkFBVCxDQUFnQ1IsR0FBaEMsRUFBcUM7QUFDbkMsU0FBTyxDQUFDLHdDQUFpQkEsR0FBakIsQ0FBRCxJQUEwQkEsR0FBRyxLQUFLLGVBQXpDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXRCdWlsZEluZm8sIHVwZGF0ZUJ1aWxkSW5mbywgQVBQSVVNX1ZFUiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGZpbmRNYXRjaGluZ0RyaXZlciB9IGZyb20gJy4vZHJpdmVycyc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzU2Vzc2lvbkNvbW1hbmQgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBwdWxsU2V0dGluZ3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5cbmNvbnN0IGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHMgPSB7XG4gIGF1dG9tYXRpb25OYW1lOiB7XG4gICAgcHJlc2VuY2U6IHRydWUsXG4gICAgaXNTdHJpbmc6IHRydWUsXG4gIH0sXG4gIHBsYXRmb3JtTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxufTtcblxuY29uc3Qgc2Vzc2lvbnNMaXN0R3VhcmQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBwZW5kaW5nRHJpdmVyc0d1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuXG5jbGFzcyBBcHBpdW1Ecml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MpIHtcbiAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc2V0IGAtLXRtcGAgaGVyZSBzaW5jZSBpdCBzaG91bGQgYmUgc2V0IHRvXG4gICAgLy8gcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgb25jZSBhdCBhbiBpbml0aWFsIHBvaW50IGluIHRoZSBBcHBpdW0gbGlmZWN5Y2xlLlxuICAgIC8vIFRoZSBwcm9jZXNzIGFyZ3VtZW50IHdpbGwgYmUgcmVmZXJlbmNlZCBieSBCYXNlRHJpdmVyLlxuICAgIC8vIFBsZWFzZSBjYWxsIGFwcGl1bS1zdXBwb3J0LnRlbXBEaXIgbW9kdWxlIHRvIGFwcGx5IHRoaXMgYmVuZWZpdC5cbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSID0gYXJncy50bXBEaXI7XG4gICAgfVxuXG4gICAgc3VwZXIoYXJncyk7XG5cbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBhYmlsaXR5Q29uc3RyYWludHM7XG5cbiAgICAvLyB0aGUgbWFpbiBBcHBpdW0gRHJpdmVyIGhhcyBubyBuZXcgY29tbWFuZCB0aW1lb3V0XG4gICAgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zID0gMDtcblxuICAgIHRoaXMuYXJncyA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xuXG4gICAgLy8gQWNjZXNzIHRvIHNlc3Npb25zIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnNlc3Npb25zID0ge307XG5cbiAgICAvLyBBY2Nlc3MgdG8gcGVuZGluZyBkcml2ZXJzIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnBlbmRpbmdEcml2ZXJzID0ge307XG5cbiAgICB0aGlzLnBsdWdpbnMgPSBbXTtcblxuICAgIC8vIGFsbG93IHRoaXMgdG8gaGFwcGVuIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyBubyBgYXdhaXRgXG4gICAgdXBkYXRlQnVpbGRJbmZvKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgcmV0dXJuIF8udG9QYWlycyhzZXNzaW9ucylcbiAgICAgIC5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtpZCwgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2Fwc30pKTtcbiAgfVxuXG4gIHByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCAoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbikge1xuICAgIGNvbnN0IGludHJvU3RyaW5nID0gZHJpdmVyVmVyc2lvblxuICAgICAgPyBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9ICh2JHtkcml2ZXJWZXJzaW9ufSkgc2Vzc2lvbmBcbiAgICAgIDogYEFwcGl1bSB2JHtBUFBJVU1fVkVSfSBjcmVhdGluZyBuZXcgJHtkcml2ZXJOYW1lfSBzZXNzaW9uYDtcbiAgICBsb2cuaW5mbyhpbnRyb1N0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBqdXN0IGFuIGFsaWFzIGZvciBkcml2ZXIuanMncyBtZXRob2QsIHdoaWNoIGlzIG5lY2Vzc2FyeSBmb3JcbiAgICogbW9ja2luZyBpbiB0aGUgdGVzdCBzdWl0ZVxuICAgKi9cbiAgX2ZpbmRNYXRjaGluZ0RyaXZlciAoLi4uYXJncykge1xuICAgIHJldHVybiBmaW5kTWF0Y2hpbmdEcml2ZXIoLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHNlc3Npb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGpzb253cENhcHMgSlNPTldQIGZvcm1hdHRlZCBkZXNpcmVkIGNhcGFiaWxpdGllc1xuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxQ2FwcyBSZXF1aXJlZCBjYXBhYmlsaXRpZXMgKEpTT05XUCBzdGFuZGFyZClcbiAgICogQHBhcmFtIHtPYmplY3R9IHczY0NhcGFiaWxpdGllcyBXM0MgY2FwYWJpbGl0aWVzXG4gICAqIEByZXR1cm4ge0FycmF5fSBVbmlxdWUgc2Vzc2lvbiBJRCBhbmQgY2FwYWJpbGl0aWVzXG4gICAqL1xuICBhc3luYyBjcmVhdGVTZXNzaW9uIChqc29ud3BDYXBzLCByZXFDYXBzLCB3M2NDYXBhYmlsaXRpZXMpIHtcbiAgICBjb25zdCBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAodGhpcy5hcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5ncyA9IHB1bGxTZXR0aW5ncyhkZWZhdWx0Q2FwYWJpbGl0aWVzKTtcbiAgICBqc29ud3BDYXBzID0gXy5jbG9uZURlZXAoanNvbndwQ2Fwcyk7XG4gICAgY29uc3QgandwU2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0U2V0dGluZ3MsIHB1bGxTZXR0aW5ncyhqc29ud3BDYXBzKSk7XG4gICAgdzNjQ2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAodzNjQ2FwYWJpbGl0aWVzKTtcbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjbGllbnQgb25seSBwcm92aWRlcyBjYXBzIHVzaW5nIEpTT05XUCBzdGFuZGFyZCxcbiAgICAvLyBhbHRob3VnaCBmaXJzdE1hdGNoL2Fsd2F5c01hdGNoIHByb3BlcnRpZXMgYXJlIHN0aWxsIHByZXNlbnQuXG4gICAgLy8gSW4gc3VjaCBjYXNlIHdlIGFzc3VtZSB0aGUgY2xpZW50IHVuZGVyc3RhbmRzIFczQyBwcm90b2NvbCBhbmQgbWVyZ2UgdGhlIGdpdmVuXG4gICAgLy8gSlNPTldQIGNhcHMgdG8gVzNDIGNhcHNcbiAgICBjb25zdCB3M2NTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGp3cFNldHRpbmdzKTtcbiAgICBPYmplY3QuYXNzaWduKHczY1NldHRpbmdzLCBwdWxsU2V0dGluZ3MoKHczY0NhcGFiaWxpdGllcyB8fCB7fSkuYWx3YXlzTWF0Y2ggfHwge30pKTtcbiAgICBmb3IgKGNvbnN0IGZpcnN0TWF0Y2hFbnRyeSBvZiAoKHczY0NhcGFiaWxpdGllcyB8fCB7fSkuZmlyc3RNYXRjaCB8fCBbXSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncyhmaXJzdE1hdGNoRW50cnkpKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvdG9jb2w7XG4gICAgbGV0IGlubmVyU2Vzc2lvbklkLCBkQ2FwcztcbiAgICB0cnkge1xuICAgICAgLy8gUGFyc2UgdGhlIGNhcHMgaW50byBhIGZvcm1hdCB0aGF0IHRoZSBJbm5lckRyaXZlciB3aWxsIGFjY2VwdFxuICAgICAgY29uc3QgcGFyc2VkQ2FwcyA9IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyKFxuICAgICAgICBqc29ud3BDYXBzLFxuICAgICAgICB3M2NDYXBhYmlsaXRpZXMsXG4gICAgICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzLFxuICAgICAgICBkZWZhdWx0Q2FwYWJpbGl0aWVzXG4gICAgICApO1xuXG4gICAgICBjb25zdCB7ZGVzaXJlZENhcHMsIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcywgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLCBlcnJvcn0gPSBwYXJzZWRDYXBzO1xuICAgICAgcHJvdG9jb2wgPSBwYXJzZWRDYXBzLnByb3RvY29sO1xuXG4gICAgICAvLyBJZiB0aGUgcGFyc2luZyBvZiB0aGUgY2FwcyBwcm9kdWNlZCBhbiBlcnJvciwgdGhyb3cgaXQgaW4gaGVyZVxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGRyaXZlcjogSW5uZXJEcml2ZXIsXG4gICAgICAgIHZlcnNpb246IGRyaXZlclZlcnNpb25cbiAgICAgIH0gPSB0aGlzLl9maW5kTWF0Y2hpbmdEcml2ZXIodGhpcy5kcml2ZXJDb25maWcsIGRlc2lyZWRDYXBzKTtcbiAgICAgIHRoaXMucHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50KElubmVyRHJpdmVyLm5hbWUsIGRyaXZlclZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEsIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhO1xuICAgICAgY29uc3QgZCA9IG5ldyBJbm5lckRyaXZlcih0aGlzLmFyZ3MpO1xuXG4gICAgICAvLyBXZSB3YW50IHRvIGFzc2lnbiBzZWN1cml0eSB2YWx1ZXMgZGlyZWN0bHkgb24gdGhlIGRyaXZlci4gVGhlIGRyaXZlclxuICAgICAgLy8gc2hvdWxkIG5vdCByZWFkIHNlY3VyaXR5IHZhbHVlcyBmcm9tIGB0aGlzLm9wdHNgIGJlY2F1c2UgdGhvc2UgdmFsdWVzXG4gICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gc2V0IGJ5IGEgbWFsaWNpb3VzIHVzZXIgdmlhIGNhcGFiaWxpdGllcywgd2hlcmVhcyB3ZVxuICAgICAgLy8gd2FudCBhIGd1YXJhbnRlZSB0aGUgdmFsdWVzIHdlcmUgc2V0IGJ5IHRoZSBhcHBpdW0gc2VydmVyIGFkbWluXG4gICAgICBpZiAodGhpcy5hcmdzLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICBgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSAtLWRlbnktaW5zZWN1cmVgKTtcbiAgICAgICAgZC5yZWxheGVkU2VjdXJpdHlFbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcmdzLmRlbnlJbnNlY3VyZSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0V4cGxpY2l0bHkgcHJldmVudGluZyB1c2Ugb2YgaW5zZWN1cmUgZmVhdHVyZXM6Jyk7XG4gICAgICAgIHRoaXMuYXJncy5kZW55SW5zZWN1cmUubWFwKChhKSA9PiBsb2cuaW5mbyhgICAgICR7YX1gKSk7XG4gICAgICAgIGQuZGVueUluc2VjdXJlID0gdGhpcy5hcmdzLmRlbnlJbnNlY3VyZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcmdzLmFsbG93SW5zZWN1cmUpKSB7XG4gICAgICAgIGxvZy5pbmZvKCdFeHBsaWNpdGx5IGVuYWJsaW5nIHVzZSBvZiBpbnNlY3VyZSBmZWF0dXJlczonKTtcbiAgICAgICAgdGhpcy5hcmdzLmFsbG93SW5zZWN1cmUubWFwKChhKSA9PiBsb2cuaW5mbyhgICAgICR7YX1gKSk7XG4gICAgICAgIGQuYWxsb3dJbnNlY3VyZSA9IHRoaXMuYXJncy5hbGxvd0luc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGFzc2lnbm1lbnQgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3Qgd2ViIHNvY2tldHMgZnVuY3Rpb25hbGl0eSBpbnNpZGUgdGhlIGRyaXZlclxuICAgICAgZC5zZXJ2ZXIgPSB0aGlzLnNlcnZlcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bm5pbmdEcml2ZXJzRGF0YSA9IGF3YWl0IHRoaXMuY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIoSW5uZXJEcml2ZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBlbmRpbmdEcml2ZXJzR3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdID0gdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSB8fCBbXTtcbiAgICAgICAgb3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEgPSB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdLm1hcCgoZHJ2KSA9PiBkcnYuZHJpdmVyRGF0YSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ucHVzaChkKTtcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzXSA9IGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihcbiAgICAgICAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcmVxQ2FwcyxcbiAgICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgWy4uLnJ1bm5pbmdEcml2ZXJzRGF0YSwgLi4ub3RoZXJQZW5kaW5nRHJpdmVyc0RhdGFdXG4gICAgICAgICk7XG4gICAgICAgIHByb3RvY29sID0gZC5wcm90b2NvbDtcbiAgICAgICAgYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbnNbaW5uZXJTZXNzaW9uSWRdID0gZDtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICBfLnB1bGwodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSwgZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIoZCwgaW5uZXJTZXNzaW9uSWQpO1xuXG4gICAgICBsb2cuaW5mbyhgTmV3ICR7SW5uZXJEcml2ZXIubmFtZX0gc2Vzc2lvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSwgc2Vzc2lvbiBgICtcbiAgICAgICAgICAgICAgYCR7aW5uZXJTZXNzaW9uSWR9IGFkZGVkIHRvIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcblxuICAgICAgLy8gc2V0IHRoZSBOZXcgQ29tbWFuZCBUaW1lb3V0IGZvciB0aGUgaW5uZXIgZHJpdmVyXG4gICAgICBkLnN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgICAgLy8gYXBwbHkgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIChpZiBwcm92aWRlZClcbiAgICAgIGlmIChkLmlzVzNDUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KHczY1NldHRpbmdzKSkge1xuICAgICAgICBsb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBXM0MgY2FwczogYCArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodzNjU2V0dGluZ3MpKTtcbiAgICAgICAgYXdhaXQgZC51cGRhdGVTZXR0aW5ncyh3M2NTZXR0aW5ncyk7XG4gICAgICB9IGVsc2UgaWYgKGQuaXNNanNvbndwUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KGp3cFNldHRpbmdzKSkge1xuICAgICAgICBsb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBNSlNPTldQIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGp3cFNldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGQudXBkYXRlU2V0dGluZ3MoandwU2V0dGluZ3MpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwcm90b2NvbCxcbiAgICAgIHZhbHVlOiBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzLCBwcm90b2NvbF1cbiAgICB9O1xuICB9XG5cbiAgYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlciAoZHJpdmVyLCBpbm5lclNlc3Npb25JZCkge1xuICAgIGNvbnN0IHJlbW92ZVNlc3Npb25Gcm9tTWFzdGVyTGlzdCA9IChjYXVzZSA9IG5ldyBFcnJvcignVW5rbm93biBlcnJvcicpKSA9PiB7XG4gICAgICBsb2cud2FybihgQ2xvc2luZyBzZXNzaW9uLCBjYXVzZSB3YXMgJyR7Y2F1c2UubWVzc2FnZX0nYCk7XG4gICAgICBsb2cuaW5mbyhgUmVtb3Zpbmcgc2Vzc2lvbiAnJHtpbm5lclNlc3Npb25JZH0nIGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW2lubmVyU2Vzc2lvbklkXTtcbiAgICB9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKChkcml2ZXIub25VbmV4cGVjdGVkU2h1dGRvd24gfHwge30pLnRoZW4pKSB7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBhZnRlciBhbGwgdGhlIGRyaXZlcnMgdXNlIGJhc2UgZHJpdmVyIGFib3ZlIHYgNS4wLjBcbiAgICAgIC8vIFJlbW92ZSB0aGUgc2Vzc2lvbiBvbiB1bmV4cGVjdGVkIHNodXRkb3duLCBzbyB0aGF0IHdlIGFyZSBpbiBhIHBvc2l0aW9uXG4gICAgICAvLyB0byBvcGVuIGFub3RoZXIgc2Vzc2lvbiBsYXRlciBvbi5cbiAgICAgIGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93blxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIGhhZCBhbiB1bmV4cGVjdGVkIHNodXRkb3duLCBzbyBlcnJvclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaHV0ZG93bicpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAvLyBpZiB3ZSBjYW5jZWxsZWQgdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24gcHJvbWlzZSwgdGhhdCBtZWFucyB3ZVxuICAgICAgICAgIC8vIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LCBhbmQgY2FuIHNhZmVseSBpZ25vcmUgaXRcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQi5DYW5jZWxsYXRpb25FcnJvcikpIHtcbiAgICAgICAgICAgIHJlbW92ZVNlc3Npb25Gcm9tTWFzdGVyTGlzdChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyB0aGlzIGlzIGEgY2FuY2VsbGFibGUgcHJvbWlzZVxuICAgIH0gZWxzZSBpZiAoXy5pc0Z1bmN0aW9uKGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bikpIHtcbiAgICAgIC8vIHNpbmNlIGJhc2UgZHJpdmVyIHYgNS4wLjBcbiAgICAgIGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bihyZW1vdmVTZXNzaW9uRnJvbU1hc3Rlckxpc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2FybihgRmFpbGVkIHRvIGF0dGFjaCB0aGUgdW5leHBlY3RlZCBzaHV0ZG93biBsaXN0ZW5lci4gYCArXG4gICAgICAgIGBJcyAnb25VbmV4cGVjdGVkU2h1dGRvd24nIG1ldGhvZCBhdmFpbGFibGUgZm9yICcke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfSc/YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3VyU2Vzc2lvbkRhdGFGb3JEcml2ZXIgKElubmVyRHJpdmVyKSB7XG4gICAgY29uc3Qgc2Vzc2lvbnMgPSBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB0aGlzLnNlc3Npb25zKTtcbiAgICBjb25zdCBkYXRhID0gXy52YWx1ZXMoc2Vzc2lvbnMpXG4gICAgICAgICAgICAgICAgICAgLmZpbHRlcigocykgPT4gcy5jb25zdHJ1Y3Rvci5uYW1lID09PSBJbm5lckRyaXZlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZHJpdmVyRGF0YSk7XG4gICAgZm9yIChsZXQgZGF0dW0gb2YgZGF0YSkge1xuICAgICAgaWYgKCFkYXR1bSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2JsZW0gZ2V0dGluZyBzZXNzaW9uIGRhdGEgZm9yIGRyaXZlciB0eXBlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7SW5uZXJEcml2ZXIubmFtZX07IGRvZXMgaXQgaW1wbGVtZW50ICdnZXQgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZHJpdmVyRGF0YSc/YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoc2Vzc2lvbklkKSB7XG4gICAgbGV0IHByb3RvY29sO1xuICAgIHRyeSB7XG4gICAgICBsZXQgb3RoZXJTZXNzaW9uc0RhdGEgPSBudWxsO1xuICAgICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgICAgYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJDb25zdHJ1Y3Rvck5hbWUgPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgb3RoZXJTZXNzaW9uc0RhdGEgPSBfLnRvUGFpcnModGhpcy5zZXNzaW9ucylcbiAgICAgICAgICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lID09PSBjdXJDb25zdHJ1Y3Rvck5hbWUgJiYga2V5ICE9PSBzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUuZHJpdmVyRGF0YSk7XG4gICAgICAgIGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgICAgbG9nLmluZm8oYFJlbW92aW5nIHNlc3Npb24gJHtzZXNzaW9uSWR9IGZyb20gb3VyIG1hc3RlciBzZXNzaW9uIGxpc3RgKTtcbiAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkZWxldGVTZXNzaW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgb3Igbm90XG4gICAgICAgIC8vIG1ha2UgdGhlIHNlc3Npb24gdW5hdmFpbGFibGUsIGJlY2F1c2Ugd2hvIGtub3dzIHdoYXQgc3RhdGUgaXQgbWlnaHRcbiAgICAgICAgLy8gYmUgaW4gb3RoZXJ3aXNlXG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICB2YWx1ZTogYXdhaXQgZHN0U2Vzc2lvbi5kZWxldGVTZXNzaW9uKHNlc3Npb25JZCwgb3RoZXJTZXNzaW9uc0RhdGEpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoYEhhZCB0cm91YmxlIGVuZGluZyBzZXNzaW9uICR7c2Vzc2lvbklkfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3I6IGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbFNlc3Npb25zIChvcHRzID0ge30pIHtcbiAgICBjb25zdCBzZXNzaW9uc0NvdW50ID0gXy5zaXplKHRoaXMuc2Vzc2lvbnMpO1xuICAgIGlmICgwID09PSBzZXNzaW9uc0NvdW50KSB7XG4gICAgICBsb2cuZGVidWcoJ1RoZXJlIGFyZSBubyBhY3RpdmUgc2Vzc2lvbnMgZm9yIGNsZWFudXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBmb3JjZSA9IGZhbHNlLFxuICAgICAgcmVhc29uLFxuICAgIH0gPSBvcHRzO1xuICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnYWN0aXZlIHNlc3Npb24nLCBzZXNzaW9uc0NvdW50LCB0cnVlKX1gKTtcbiAgICBjb25zdCBjbGVhbnVwUHJvbWlzZXMgPSBmb3JjZVxuICAgICAgPyBfLnZhbHVlcyh0aGlzLnNlc3Npb25zKS5tYXAoKGRydikgPT4gZHJ2LnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKHJlYXNvbiAmJiBuZXcgRXJyb3IocmVhc29uKSkpXG4gICAgICA6IF8ua2V5cyh0aGlzLnNlc3Npb25zKS5tYXAoKGlkKSA9PiB0aGlzLmRlbGV0ZVNlc3Npb24oaWQpKTtcbiAgICBmb3IgKGNvbnN0IGNsZWFudXBQcm9taXNlIG9mIGNsZWFudXBQcm9taXNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xlYW51cFByb21pc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwbHVnaW5zVG9IYW5kbGVDbWQgKGNtZCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbnMuZmlsdGVyKChwKSA9PlxuICAgICAgcC5jb21tYW5kcyA9PT0gdHJ1ZSB8fFxuICAgICAgKF8uaXNBcnJheShwLmNvbW1hbmRzKSAmJiBfLmluY2x1ZGVzKHAuY29tbWFuZHMsIGNtZCkpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjbWQsIC4uLmFyZ3MpIHtcbiAgICAvLyBXZSBoYXZlIGJhc2ljYWxseSB0aHJlZSBjYXNlcyBmb3IgaG93IHRvIGhhbmRsZSBjb21tYW5kczpcbiAgICAvLyAxLiBoYW5kbGUgZ2V0U3RhdHVzICh3ZSBkbyB0aGlzIGFzIGEgc3BlY2lhbCBvdXQgb2YgYmFuZCBjYXNlIHNvIGl0IGRvZXNuJ3QgZ2V0IGFkZGVkIHRvIGFuXG4gICAgLy8gICAgZXhlY3V0aW9uIHF1ZXVlLCBhbmQgY2FuIGJlIGNhbGxlZCB3aGlsZSBlLmcuIGNyZWF0ZVNlc3Npb24gaXMgaW4gcHJvZ3Jlc3MpXG4gICAgLy8gMi4gaGFuZGxlIGNvbW1hbmRzIHRoYXQgdGhpcyB1bWJyZWxsYSBkcml2ZXIgc2hvdWxkIGhhbmRsZSwgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBzZXNzaW9uXG4gICAgLy8gICAgZHJpdmVyIChmb3IgZXhhbXBsZSwgZGVsZXRlU2Vzc2lvbiwgb3Igb3RoZXIgbm9uLXNlc3Npb24gY29tbWFuZHMpXG4gICAgLy8gMy4gaGFuZGxlIHNlc3Npb24gZHJpdmVyIGNvbW1hbmRzLlxuICAgIC8vIFRoZSB0cmlja3kgcGFydCBpcyB0aGF0IGJlY2F1c2Ugd2Ugc3VwcG9ydCBjb21tYW5kIHBsdWdpbnMsIHdlIG5lZWQgdG8gd3JhcCBhbnkgb2YgdGhlc2VcbiAgICAvLyBjYXNlcyB3aXRoIHBsdWdpbiBoYW5kbGluZy5cblxuICAgIGNvbnN0IGlzR2V0U3RhdHVzID0gY21kID09PSAnZ2V0U3RhdHVzJztcbiAgICBjb25zdCBpc1VtYnJlbGxhQ21kID0gIWlzR2V0U3RhdHVzICYmIGlzQXBwaXVtRHJpdmVyQ29tbWFuZChjbWQpO1xuICAgIGNvbnN0IGlzU2Vzc2lvbkNtZCA9ICFpc0dldFN0YXR1cyAmJiAhaXNVbWJyZWxsYUNtZDtcblxuICAgIC8vIGdldCBhbnkgcGx1Z2lucyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBhcyBoYW5kbGluZyB0aGlzIGNvbW1hbmRcbiAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5wbHVnaW5zVG9IYW5kbGVDbWQoY21kKTtcblxuICAgIC8vIGZpcnN0IGRvIHNvbWUgZXJyb3IgY2hlY2tpbmcuIElmIHdlJ3JlIHJlcXVlc3RpbmcgYSBzZXNzaW9uIGNvbW1hbmQgZXhlY3V0aW9uLCB0aGVuIG1ha2VcbiAgICAvLyBzdXJlIHRoYXQgc2Vzc2lvbiBhY3R1YWxseSBleGlzdHMgb24gdGhlIHNlc3Npb24gZHJpdmVyLCBhbmQgc2V0IHRoZSBzZXNzaW9uIGRyaXZlciBpdHNlbGZcbiAgICBsZXQgc2Vzc2lvbklkID0gbnVsbDtcbiAgICBsZXQgZHN0U2Vzc2lvbiA9IG51bGw7XG4gICAgbGV0IHByb3RvY29sID0gbnVsbDtcbiAgICBpZiAoaXNTZXNzaW9uQ21kKSB7XG4gICAgICBzZXNzaW9uSWQgPSBfLmxhc3QoYXJncyk7XG4gICAgICBkc3RTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdKTtcbiAgICAgIGlmICghZHN0U2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzZXNzaW9uIHdpdGggaWQgJyR7c2Vzc2lvbklkfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgIH1cbiAgICAgIC8vIG5vdyBzYXZlIHRoZSByZXNwb25zZSBwcm90b2NvbCBnaXZlbiB0aGF0IHRoZSBzZXNzaW9uIGRyaXZlcidzIHByb3RvY29sIG1pZ2h0IGRpZmZlclxuICAgICAgcHJvdG9jb2wgPSBkc3RTZXNzaW9uLnByb3RvY29sO1xuICAgIH1cblxuICAgIC8vIG5vdyB3ZSBkZWZpbmUgYSAnY21kSGFuZGxlZEJ5JyBvYmplY3Qgd2hpY2ggd2lsbCBrZWVwIHRyYWNrIG9mIHdoaWNoIHBsdWdpbnMgaGF2ZSBoYW5kbGVkIHRoaXNcbiAgICAvLyBjb21tYW5kLiB3ZSBjYXJlIGFib3V0IHRoaXMgYmVjYXVzZSAoYSkgbXVsdGlwbGUgcGx1Z2lucyBjYW4gaGFuZGxlIHRoZSBzYW1lIGNvbW1hbmQsIGFuZFxuICAgIC8vIChiKSB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGEgcGx1Z2luIHdpbGwgYWN0dWFsbHkgY2FsbCB0aGUgbmV4dCgpIG1ldGhvZCB3aGljaCBydW5zIHRoZVxuICAgIC8vIG9yaWdpbmFsIGNvbW1hbmQgZXhlY3V0aW9uLiBUaGlzIHJlc3VsdHMgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGNvbW1hbmQgbWlnaHQgYmUgaGFuZGxlZFxuICAgIC8vIGJ5IHNvbWUgYnV0IG5vdCBhbGwgcGx1Z2lucywgb3IgYnkgcGx1Z2luKHMpIGJ1dCBub3QgYnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFNvIHN0YXJ0IG91dFxuICAgIC8vIHRoaXMgb2JqZWN0IGRlY2xhcmluZyB0aGF0IHRoZSBkZWZhdWx0IGhhbmRsZXIgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLlxuICAgIGNvbnN0IGNtZEhhbmRsZWRCeSA9IHtkZWZhdWx0OiBmYWxzZX07XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHBsdWdpbnMsIGFuZCBzdWNjZXNzaXZlbHkgd3JhcHBlZFxuICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGx1Z2luIHRoYXQgY2FuIGhhbmRsZSB0aGUgY29tbWFuZC4gVG8gc3RhcnQgb2ZmIHdpdGgsIHRoZSBhc3luY1xuICAgIC8vIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgY2FsbGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaS5lLiwgd2hpY2hldmVyIG9mIHRoZSAzIGNhc2VzIGFib3ZlIGlzXG4gICAgLy8gdGhlIGFwcHJvcHJpYXRlIG9uZVxuICAgIGNvbnN0IGRlZmF1bHRCZWhhdmlvciA9IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGlmIHdlJ3JlIHJ1bm5pbmcgd2l0aCBwbHVnaW5zLCBtYWtlIHN1cmUgd2UgbG9nIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgYWN0dWFsbHlcbiAgICAgIC8vIGhhcHBlbmluZyBzbyB3ZSBjYW4gdGVsbCB3aGVuIHRoZSBwbHVnaW4gY2FsbCBjaGFpbiBpcyB1bndyYXBwaW5nIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAvLyBpZiB0aGF0J3Mgd2hhdCBoYXBwZW5zXG4gICAgICBwbHVnaW5zLmxlbmd0aCAmJiBsb2cuaW5mbyhgRXhlY3V0aW5nIGRlZmF1bHQgaGFuZGxpbmcgYmVoYXZpb3IgZm9yIGNvbW1hbmQgJyR7Y21kfSdgKTtcblxuICAgICAgLy8gaWYgd2UgbWFrZSBpdCBoZXJlLCB3ZSBrbm93IHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgaGFuZGxlZFxuICAgICAgY21kSGFuZGxlZEJ5LmRlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBpZiAoaXNHZXRTdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1VtYnJlbGxhQ21kKSB7XG4gICAgICAgIC8vIHNvbWUgY29tbWFuZHMsIGxpa2UgZGVsZXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gaGFuZGxlIG9uICp0aGlzKiBkcml2ZXIsXG4gICAgICAgIC8vIG5vdCB0aGUgcGxhdGZvcm0gZHJpdmVyXG4gICAgICAgIHJldHVybiBhd2FpdCBzdXBlci5leGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBoZXJlIHdlIGtub3cgdGhhdCB3ZSBhcmUgZXhlY3V0aW5nIGEgc2Vzc2lvbiBjb21tYW5kLCBhbmQgaGF2ZSBhIHZhbGlkIHNlc3Npb24gZHJpdmVyXG4gICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5leGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBub3cgdGFrZSBvdXIgZGVmYXVsdCBiZWhhdmlvciwgd3JhcCBpdCB3aXRoIGFueSBudW1iZXIgb2YgcGx1Z2luIGJlaGF2aW9ycywgYW5kIHJ1biBpdFxuICAgIGNvbnN0IHdyYXBwZWRDbWQgPSB0aGlzLndyYXBDb21tYW5kV2l0aFBsdWdpbnMoe2NtZCwgYXJncywgcGx1Z2lucywgY21kSGFuZGxlZEJ5LCBuZXh0OiBkZWZhdWx0QmVoYXZpb3J9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXcmFwcGVkQ29tbWFuZCh7d3JhcHBlZENtZCwgcHJvdG9jb2x9KTtcblxuICAgIC8vIGlmIHdlIGhhZCBwbHVnaW5zLCBtYWtlIHN1cmUgdG8gbG9nIG91dCB0aGUgaGVscGZ1bCByZXBvcnQgYWJvdXQgd2hpY2ggcGx1Z2lucyBlbmRlZCB1cFxuICAgIC8vIGhhbmRsaW5nIHRoZSBjb21tYW5kIGFuZCB3aGljaCBkaWRuJ3RcbiAgICBwbHVnaW5zLmxlbmd0aCAmJiB0aGlzLmxvZ1BsdWdpbkhhbmRsZXJSZXBvcnQoe2NtZCwgY21kSGFuZGxlZEJ5fSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgd3JhcENvbW1hbmRXaXRoUGx1Z2lucyAoe2NtZCwgYXJncywgbmV4dCwgY21kSGFuZGxlZEJ5LCBwbHVnaW5zfSkge1xuICAgIHBsdWdpbnMubGVuZ3RoICYmIGxvZy5pbmZvKGBQbHVnaW5zIHdoaWNoIGNhbiBoYW5kbGUgY21kICcke2NtZH0nOiAke3BsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpfWApO1xuXG4gICAgLy8gbm93IHdlIGNhbiBnbyB0aHJvdWdoIGVhY2ggcGx1Z2luIGFuZCB3cmFwIGBuZXh0YCBhcm91bmQgaXRzIG93biBoYW5kbGVyLCBwYXNzaW5nIHRoZSAqb2xkKlxuICAgIC8vIG5leHQgaW4gc28gdGhhdCBpdCBjYW4gY2FsbCBpdCBpZiBpdCB3YW50cyB0b1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgIC8vIG5lZWQgYW4gSUlGRSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgb2YgbmV4dCB0aGF0J3MgcGFzc2VkIHRvIHBsdWdpbi5oYW5kbGUgdG8gYmVcbiAgICAgIC8vIGV4YWN0bHkgdGhlIHZhbHVlIG9mIG5leHQgaGVyZSBiZWZvcmUgcmVhc3NpZ25tZW50OyB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGxhemlseVxuICAgICAgLy8gZXZhbHVhdGVkLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBsYXN0IGBuZXh0YCB0byBiZSBkZWZpbmVkLlxuICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IGZhbHNlOyAvLyB3ZSBzZWUgYSBuZXcgcGx1Z2luLCBzbyBhZGQgaXQgdG8gdGhlICdjbWRIYW5kbGVkQnknIG9iamVjdFxuICAgICAgbmV4dCA9ICgoX25leHQpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgbG9nLmluZm8oYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBpcyBub3cgaGFuZGxpbmcgY21kICcke2NtZH0nYCk7XG4gICAgICAgIGNtZEhhbmRsZWRCeVtwbHVnaW4ubmFtZV0gPSB0cnVlOyAvLyBpZiB3ZSBtYWtlIGl0IGhlcmUsIHRoaXMgcGx1Z2luIGhhcyBhdHRlbXB0ZWQgdG8gaGFuZGxlIGNtZFxuICAgICAgICByZXR1cm4gYXdhaXQgcGx1Z2luLmhhbmRsZShfbmV4dCwgdGhpcywgY21kLCAuLi5hcmdzKTtcbiAgICAgIH0pKG5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgbG9nUGx1Z2luSGFuZGxlclJlcG9ydCAoe2NtZCwgY21kSGFuZGxlZEJ5fSkge1xuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGRheSwgd2UgaGF2ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHdoaWNoIHBsdWdpbnMgZW5kZWQgdXAgZ2V0dGluZ1xuICAgIC8vIHRoZWlyIGNvZGUgcnVuIGFzIHBhcnQgb2YgaGFuZGxpbmcgdGhpcyBjb21tYW5kLiBCZWNhdXNlIHBsdWdpbnMgY2FuIGNob29zZSAqbm90KiB0b1xuICAgIC8vIHBhc3MgY29udHJvbCB0byBvdGhlciBwbHVnaW5zIG9yIHRvIHRoZSBkZWZhdWx0IGRyaXZlciBiZWhhdmlvciwgdGhpcyBpcyBpbmZvcm1hdGlvblxuICAgIC8vIHdoaWNoIGlzIHByb2JhYmx5IHVzZWZ1bCB0byB0aGUgdXNlciAoZXNwZWNpYWxseSBpbiBzaXR1YXRpb25zIHdoZXJlIHBsdWdpbnMgbWlnaHQgbm90XG4gICAgLy8gaW50ZXJhY3Qgd2VsbCB0b2dldGhlciwgYW5kIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGVidWcgb3RoZXJ3aXNlIHdpdGhvdXQgdGhpcyBraW5kIG9mXG4gICAgLy8gbWVzc2FnZSkuXG4gICAgY29uc3QgZGlkSGFuZGxlID0gT2JqZWN0LmtleXMoY21kSGFuZGxlZEJ5KS5maWx0ZXIoKGspID0+IGNtZEhhbmRsZWRCeVtrXSk7XG4gICAgY29uc3QgZGlkbnRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gIWNtZEhhbmRsZWRCeVtrXSk7XG4gICAgaWYgKGRpZG50SGFuZGxlLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy5pbmZvKGBDb21tYW5kICcke2NtZH0nIHdhcyBub3QgaGFuZGxlZCBieSB0aGUgZm9sbG93aW5nIGJlYWh2aW9ycyBvciBwbHVnaW5zLCBldmVuIGAgK1xuICAgICAgICAgICAgICAgYHRob3VnaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCB0byBoYW5kbGUgaXQ6ICR7SlNPTi5zdHJpbmdpZnkoZGlkbnRIYW5kbGUpfS4gVGhlIGAgK1xuICAgICAgICAgICAgICAgYGNvbW1hbmQgKndhcyogaGFuZGxlZCBieSB0aGVzZTogJHtKU09OLnN0cmluZ2lmeShkaWRIYW5kbGUpfS5gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleGVjdXRlV3JhcHBlZENvbW1hbmQgKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pIHtcbiAgICBsZXQgY21kUmVzLCBjbWRFcnIsIHJlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCBgd3JhcHBlZENtZGAgZGVmaW5lcyBhIHdob2xlIHNlcXVlbmNlIG9mIHBsdWdpbiBoYW5kbGVycywgY3VsbWluYXRpbmcgaW5cbiAgICAgIC8vIG91ciBkZWZhdWx0IGhhbmRsZXIuIFdoYXRldmVyIGl0IHJldHVybnMgaXMgd2hhdCB3ZSdyZSBnb2luZyB0byB3YW50IHRvIHNlbmQgYmFjayB0byB0aGVcbiAgICAgIC8vIHVzZXIuXG4gICAgICBjbWRSZXMgPSBhd2FpdCB3cmFwcGVkQ21kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY21kRXJyID0gZTtcbiAgICB9XG5cbiAgICAvLyBTYWRseSwgd2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQga2luZCBvZiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4gSXQgd2lsbCBlaXRoZXIgYmUgYSBiYXJlXG4gICAgLy8gb2JqZWN0LCBvciBhIHByb3RvY29sLWF3YXJlIG9iamVjdCB3aXRoIHByb3RvY29sIGFuZCBlcnJvci92YWx1ZSBrZXlzLiBTbyB3ZSBuZWVkIHRvIHNuaWZmXG4gICAgLy8gaXQgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBkb3VibGUtd3JhcCBpdCBpZiBpdCdzIHRoZSBsYXR0ZXIga2luZC5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGNtZFJlcykgJiYgXy5oYXMoY21kUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgcmVzID0gY21kUmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMudmFsdWUgPSBjbWRSZXM7XG4gICAgICByZXMuZXJyb3IgPSBjbWRFcnI7XG4gICAgICByZXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgXy5pc0Z1bmN0aW9uKGRzdFNlc3Npb24ucHJveHlBY3RpdmUpICYmIGRzdFNlc3Npb24ucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uID8gZHN0U2Vzc2lvbi5nZXRQcm94eUF2b2lkTGlzdCgpIDogW107XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiAmJiBkc3RTZXNzaW9uLmNhblByb3h5KHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8gaGVscCBkZWNpZGUgd2hpY2ggY29tbWFuZHMgc2hvdWxkIGJlIHByb3hpZWQgdG8gc3ViLWRyaXZlcnMgYW5kIHdoaWNoXG4vLyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzLCBvdXIgdW1icmVsbGEgZHJpdmVyXG5mdW5jdGlvbiBpc0FwcGl1bURyaXZlckNvbW1hbmQgKGNtZCkge1xuICByZXR1cm4gIWlzU2Vzc2lvbkNvbW1hbmQoY21kKSB8fCBjbWQgPT09ICdkZWxldGVTZXNzaW9uJztcbn1cblxuZXhwb3J0IHsgQXBwaXVtRHJpdmVyIH07XG4iXSwiZmlsZSI6ImxpYi9hcHBpdW0uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
563
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hcHBpdW0uanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cyIsImF1dG9tYXRpb25OYW1lIiwicHJlc2VuY2UiLCJpc1N0cmluZyIsInBsYXRmb3JtTmFtZSIsInNlc3Npb25zTGlzdEd1YXJkIiwiQXN5bmNMb2NrIiwicGVuZGluZ0RyaXZlcnNHdWFyZCIsIkFwcGl1bURyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJ0bXBEaXIiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1RNUF9ESVIiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZXdDb21tYW5kVGltZW91dE1zIiwic2Vzc2lvbnMiLCJwZW5kaW5nRHJpdmVycyIsInBsdWdpbkNsYXNzZXMiLCJzZXNzaW9uUGx1Z2lucyIsInNlc3Npb25sZXNzUGx1Z2lucyIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJzZXNzaW9uRXhpc3RzIiwic2Vzc2lvbklkIiwiZHN0U2Vzc2lvbiIsImRyaXZlckZvclNlc3Npb24iLCJnZXRTdGF0dXMiLCJidWlsZCIsIl8iLCJjbG9uZSIsImdldFNlc3Npb25zIiwiYWNxdWlyZSIsIm5hbWUiLCJ0b1BhaXJzIiwibWFwIiwiaWQiLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJjYXBzIiwicHJpbnROZXdTZXNzaW9uQW5ub3VuY2VtZW50IiwiZHJpdmVyTmFtZSIsImRyaXZlclZlcnNpb24iLCJkcml2ZXJCYXNlVmVyc2lvbiIsImxvZyIsImluZm8iLCJBUFBJVU1fVkVSIiwiYmFzZVZlcnNpb24iLCJfZmluZE1hdGNoaW5nRHJpdmVyIiwiYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJleHRJbnN0YW5jZSIsImNsaUFyZ3MiLCJpc0VtcHR5IiwiY3JlYXRlU2Vzc2lvbiIsImpzb253cENhcHMiLCJyZXFDYXBzIiwidzNjQ2FwYWJpbGl0aWVzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImNsb25lRGVlcCIsImRlZmF1bHRTZXR0aW5ncyIsImp3cFNldHRpbmdzIiwiT2JqZWN0IiwiYXNzaWduIiwidzNjU2V0dGluZ3MiLCJhbHdheXNNYXRjaCIsImZpcnN0TWF0Y2hFbnRyeSIsImZpcnN0TWF0Y2giLCJwcm90b2NvbCIsImlubmVyU2Vzc2lvbklkIiwiZENhcHMiLCJwYXJzZWRDYXBzIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJlcnJvciIsIklubmVyRHJpdmVyIiwidmVyc2lvbiIsImRyaXZlckNvbmZpZyIsInNlc3Npb25PdmVycmlkZSIsImRlbGV0ZUFsbFNlc3Npb25zIiwicnVubmluZ0RyaXZlcnNEYXRhIiwib3RoZXJQZW5kaW5nRHJpdmVyc0RhdGEiLCJkcml2ZXJJbnN0YW5jZSIsInJlbGF4ZWRTZWN1cml0eUVuYWJsZWQiLCJkZW55SW5zZWN1cmUiLCJhIiwiYWxsb3dJbnNlY3VyZSIsInNlcnZlciIsImN1clNlc3Npb25EYXRhRm9yRHJpdmVyIiwiZSIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJtZXNzYWdlIiwiZHJ2IiwiZHJpdmVyRGF0YSIsInB1c2giLCJwdWxsIiwiYXR0YWNoVW5leHBlY3RlZFNodXRkb3duSGFuZGxlciIsInN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQiLCJpc1czQ1Byb3RvY29sIiwiSlNPTiIsInN0cmluZ2lmeSIsInVwZGF0ZVNldHRpbmdzIiwiaXNNanNvbndwUHJvdG9jb2wiLCJ2YWx1ZSIsIm9uU2h1dGRvd24iLCJjYXVzZSIsIkVycm9yIiwid2FybiIsInBsdWdpbiIsImlzRnVuY3Rpb24iLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsImRlYnVnIiwiZGF0YSIsInZhbHVlcyIsImZpbHRlciIsInMiLCJkYXR1bSIsImRlbGV0ZVNlc3Npb24iLCJvdGhlclNlc3Npb25zRGF0YSIsImN1ckNvbnN0cnVjdG9yTmFtZSIsImtleSIsIm9wdHMiLCJzZXNzaW9uc0NvdW50Iiwic2l6ZSIsImZvcmNlIiwicmVhc29uIiwidXRpbCIsInBsdXJhbGl6ZSIsImNsZWFudXBQcm9taXNlcyIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwia2V5cyIsImNsZWFudXBQcm9taXNlIiwicGx1Z2luc0ZvclNlc3Npb24iLCJjcmVhdGVQbHVnaW5JbnN0YW5jZXMiLCJwbHVnaW5zVG9IYW5kbGVDbWQiLCJjbWQiLCJwIiwiaGFuZGxlIiwiUGx1Z2luQ2xhc3MiLCJwbHVnaW5OYW1lIiwiZXhlY3V0ZUNvbW1hbmQiLCJpc0dldFN0YXR1cyIsImlzVW1icmVsbGFDbWQiLCJpc0FwcGl1bURyaXZlckNvbW1hbmQiLCJpc1Nlc3Npb25DbWQiLCJyZXFGb3JQcm94eSIsImxhc3QiLCJwb3AiLCJwbHVnaW5zIiwiY21kSGFuZGxlZEJ5IiwiZGVmYXVsdCIsImRlZmF1bHRCZWhhdmlvciIsImxlbmd0aCIsInByb3h5Q29tbWFuZCIsIk5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IiLCJvcmlnaW5hbFVybCIsIm1ldGhvZCIsImJvZHkiLCJ3cmFwcGVkQ21kIiwid3JhcENvbW1hbmRXaXRoUGx1Z2lucyIsIm5leHQiLCJyZXMiLCJleGVjdXRlV3JhcHBlZENvbW1hbmQiLCJsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsImZpcnN0IiwiX25leHQiLCJkaWRIYW5kbGUiLCJrIiwiZGlkbnRIYW5kbGUiLCJjbWRSZXMiLCJjbWRFcnIiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsNEJBQTRCLEdBQUc7QUFDbkNDLEVBQUFBLGNBQWMsRUFBRTtBQUNkQyxJQUFBQSxRQUFRLEVBQUUsSUFESTtB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Qyw2REFIUDtBQURhLGdEQUZSLGtDQUVRO0FBS2Q7O0FBWGtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0QnVpbGRJbmZvLCB1cGRhdGVCdWlsZEluZm8sIEFQUElVTV9WRVIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBmaW5kTWF0Y2hpbmdEcml2ZXIgfSBmcm9tICcuL2RyaXZlcnMnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgZXJyb3JzLCBpc1Nlc3Npb25Db21tYW5kLFxuICAgICAgICAgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBwdWxsU2V0dGluZ3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBkZXNpcmVkQ2FwYWJpbGl0eUNvbnN0cmFpbnRzID0ge1xuICBhdXRvbWF0aW9uTmFtZToge1xuICAgIHByZXNlbmNlOiB0cnVlLFxuICAgIGlzU3RyaW5nOiB0cnVlLFxuICB9LFxuICBwbGF0Zm9ybU5hbWU6IHtcbiAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgfSxcbn07XG5cbmNvbnN0IHNlc3Npb25zTGlzdEd1YXJkID0gbmV3IEFzeW5jTG9jaygpO1xuY29uc3QgcGVuZGluZ0RyaXZlcnNHdWFyZCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChhcmdzKSB7XG4gICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIHNldCBgLS10bXBgIGhlcmUgc2luY2UgaXQgc2hvdWxkIGJlIHNldCB0b1xuICAgIC8vIHByb2Nlc3MuZW52LkFQUElVTV9UTVBfRElSIG9uY2UgYXQgYW4gaW5pdGlhbCBwb2ludCBpbiB0aGUgQXBwaXVtIGxpZmVjeWNsZS5cbiAgICAvLyBUaGUgcHJvY2VzcyBhcmd1bWVudCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgQmFzZURyaXZlci5cbiAgICAvLyBQbGVhc2UgY2FsbCBAYXBwaXVtL3N1cHBvcnQudGVtcERpciBtb2R1bGUgdG8gYXBwbHkgdGhpcyBiZW5lZml0LlxuICAgIGlmIChhcmdzLnRtcERpcikge1xuICAgICAgcHJvY2Vzcy5lbnYuQVBQSVVNX1RNUF9ESVIgPSBhcmdzLnRtcERpcjtcbiAgICB9XG5cbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcGFiaWxpdHlDb25zdHJhaW50cztcblxuICAgIC8vIHRoZSBtYWluIEFwcGl1bSBEcml2ZXIgaGFzIG5vIG5ldyBjb21tYW5kIHRpbWVvdXRcbiAgICB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSAwO1xuXG4gICAgdGhpcy5hcmdzID0gey4uLmFyZ3N9O1xuXG4gICAgLy8gQWNjZXNzIHRvIHNlc3Npb25zIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnNlc3Npb25zID0ge307XG5cbiAgICAvLyBBY2Nlc3MgdG8gcGVuZGluZyBkcml2ZXJzIGxpc3QgbXVzdCBiZSBndWFyZGVkIHdpdGggYSBTZW1hcGhvcmUsIGJlY2F1c2VcbiAgICAvLyBpdCBtaWdodCBiZSBjaGFuZ2VkIGJ5IG90aGVyIGFzeW5jIGNhbGxzIGF0IGFueSB0aW1lXG4gICAgLy8gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIG91dHNpZGVcbiAgICB0aGlzLnBlbmRpbmdEcml2ZXJzID0ge307XG5cbiAgICB0aGlzLnBsdWdpbkNsYXNzZXMgPSBbXTsgLy8gbGlzdCBvZiB3aGljaCBwbHVnaW5zIGFyZSBhY3RpdmVcbiAgICB0aGlzLnNlc3Npb25QbHVnaW5zID0ge307IC8vIG1hcCBvZiBzZXNzaW9ucyB0byBhY3R1YWwgcGx1Z2luIGluc3RhbmNlcyBwZXIgc2Vzc2lvblxuICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gW107IC8vIHNvbWUgY29tbWFuZHMgYXJlIHNlc3Npb25sZXNzLCBzbyB3ZSBuZWVkIGEgc2V0IG9mIHBsdWdpbnMgZm9yIHRoZW1cblxuICAgIC8vIGFsbG93IHRoaXMgdG8gaGFwcGVuIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyBubyBgYXdhaXRgXG4gICAgdXBkYXRlQnVpbGRJbmZvKCk7XG4gIH1cblxuICAvKiogQHR5cGUge0RyaXZlckNvbmZpZ3x1bmRlZmluZWR9ICovXG4gIGRyaXZlckNvbmZpZztcblxuICAvKipcbiAgICogQ2FuY2VsIGNvbW1hbmRzIHF1ZXVlaW5nIGZvciB0aGUgdW1icmVsbGEgQXBwaXVtIGRyaXZlclxuICAgKi9cbiAgZ2V0IGlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlc3Npb25FeGlzdHMgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5zZXNzaW9uSWQgIT09IG51bGw7XG4gIH1cblxuICBkcml2ZXJGb3JTZXNzaW9uIChzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1aWxkOiBfLmNsb25lKGdldEJ1aWxkSW5mbygpKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbnMgKCkge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgcmV0dXJuIF8udG9QYWlycyhzZXNzaW9ucylcbiAgICAgIC5tYXAoKFtpZCwgZHJpdmVyXSkgPT4gKHtpZCwgY2FwYWJpbGl0aWVzOiBkcml2ZXIuY2Fwc30pKTtcbiAgfVxuXG4gIHByaW50TmV3U2Vzc2lvbkFubm91bmNlbWVudCAoZHJpdmVyTmFtZSwgZHJpdmVyVmVyc2lvbiwgZHJpdmVyQmFzZVZlcnNpb24pIHtcbiAgICBsb2cuaW5mbyhkcml2ZXJWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0gdiR7QVBQSVVNX1ZFUn0gY3JlYXRpbmcgbmV3ICR7ZHJpdmVyTmFtZX0gKHYke2RyaXZlclZlcnNpb259KSBzZXNzaW9uYFxuICAgICAgOiBgQXBwaXVtIHYke0FQUElVTV9WRVJ9IGNyZWF0aW5nIG5ldyAke2RyaXZlck5hbWV9IHNlc3Npb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhgQ2hlY2tpbmcgQmFzZURyaXZlciB2ZXJzaW9ucyBmb3IgQXBwaXVtIGFuZCAke2RyaXZlck5hbWV9YCk7XG4gICAgbG9nLmluZm8oQXBwaXVtRHJpdmVyLmJhc2VWZXJzaW9uXG4gICAgICA/IGBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb24gaXMgJHtBcHBpdW1Ecml2ZXIuYmFzZVZlcnNpb259YFxuICAgICAgOiBgQ291bGQgbm90IGRldGVybWluZSBBcHBpdW0ncyBCYXNlRHJpdmVyIHZlcnNpb25gXG4gICAgKTtcbiAgICBsb2cuaW5mbyhkcml2ZXJCYXNlVmVyc2lvblxuICAgICAgPyBgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbiBpcyAke2RyaXZlckJhc2VWZXJzaW9ufWBcbiAgICAgIDogYENvdWxkIG5vdCBkZXRlcm1pbmUgJHtkcml2ZXJOYW1lfSdzIEJhc2VEcml2ZXIgdmVyc2lvbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMganVzdCBhbiBhbGlhcyBmb3IgZHJpdmVyLmpzJ3MgbWV0aG9kLCB3aGljaCBpcyBuZWNlc3NhcnkgZm9yXG4gICAqIG1vY2tpbmcgaW4gdGhlIHRlc3Qgc3VpdGVcbiAgICovXG4gIF9maW5kTWF0Y2hpbmdEcml2ZXIgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZmluZE1hdGNoaW5nRHJpdmVyKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBhc3NpZ24gQ0xJIGFyZ3MgZm9yIGEgZHJpdmVyIG9yIHBsdWdpblxuICAgKlxuICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBwcm92aWRlZCBhIHNjaGVtYSwgdmFsaWRhdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoJy4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IGV4dFR5cGUgJ2RyaXZlcicgb3IgJ3BsdWdpbidcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0gZXh0SW5zdGFuY2UgdGhlIGRyaXZlciBvciBwbHVnaW4gaW5zdGFuY2VcbiAgICovXG4gIGFzc2lnbkNsaUFyZ3NUb0V4dGVuc2lvbiAoZXh0VHlwZSwgZXh0TmFtZSwgZXh0SW5zdGFuY2UpIHtcbiAgICBjb25zdCBjbGlBcmdzID0gdGhpcy5hcmdzW2V4dFR5cGVdPy5bZXh0TmFtZV07XG4gICAgaWYgKCFfLmlzRW1wdHkoY2xpQXJncykpIHtcbiAgICAgIGV4dEluc3RhbmNlLmNsaUFyZ3MgPSBjbGlBcmdzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2Vzc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgZm9ybWF0dGVkIGRlc2lyZWQgY2FwYWJpbGl0aWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXFDYXBzIFJlcXVpcmVkIGNhcGFiaWxpdGllcyAoSlNPTldQIHN0YW5kYXJkKVxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwYWJpbGl0aWVzIFczQyBjYXBhYmlsaXRpZXNcbiAgICogQHJldHVybiB7QXJyYXl9IFVuaXF1ZSBzZXNzaW9uIElEIGFuZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKGpzb253cENhcHMsIHJlcUNhcHMsIHczY0NhcGFiaWxpdGllcykge1xuICAgIGNvbnN0IGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh0aGlzLmFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZGVmYXVsdFNldHRpbmdzID0gcHVsbFNldHRpbmdzKGRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICAgIGpzb253cENhcHMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBzKTtcbiAgICBjb25zdCBqd3BTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgcHVsbFNldHRpbmdzKGpzb253cENhcHMpKTtcbiAgICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBvbmx5IHByb3ZpZGVzIGNhcHMgdXNpbmcgSlNPTldQIHN0YW5kYXJkLFxuICAgIC8vIGFsdGhvdWdoIGZpcnN0TWF0Y2gvYWx3YXlzTWF0Y2ggcHJvcGVydGllcyBhcmUgc3RpbGwgcHJlc2VudC5cbiAgICAvLyBJbiBzdWNoIGNhc2Ugd2UgYXNzdW1lIHRoZSBjbGllbnQgdW5kZXJzdGFuZHMgVzNDIHByb3RvY29sIGFuZCBtZXJnZSB0aGUgZ2l2ZW5cbiAgICAvLyBKU09OV1AgY2FwcyB0byBXM0MgY2Fwc1xuICAgIGNvbnN0IHczY1NldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgandwU2V0dGluZ3MpO1xuICAgIE9iamVjdC5hc3NpZ24odzNjU2V0dGluZ3MsIHB1bGxTZXR0aW5ncygodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5hbHdheXNNYXRjaCB8fCB7fSkpO1xuICAgIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mICgodzNjQ2FwYWJpbGl0aWVzIHx8IHt9KS5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbih3M2NTZXR0aW5ncywgcHVsbFNldHRpbmdzKGZpcnN0TWF0Y2hFbnRyeSkpO1xuICAgIH1cblxuICAgIGxldCBwcm90b2NvbDtcbiAgICBsZXQgaW5uZXJTZXNzaW9uSWQsIGRDYXBzO1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSB0aGUgY2FwcyBpbnRvIGEgZm9ybWF0IHRoYXQgdGhlIElubmVyRHJpdmVyIHdpbGwgYWNjZXB0XG4gICAgICBjb25zdCBwYXJzZWRDYXBzID0gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIoXG4gICAgICAgIGpzb253cENhcHMsXG4gICAgICAgIHczY0NhcGFiaWxpdGllcyxcbiAgICAgICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIGVycm9yfSA9IHBhcnNlZENhcHM7XG4gICAgICBwcm90b2NvbCA9IHBhcnNlZENhcHMucHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIHRoZSBwYXJzaW5nIG9mIHRoZSBjYXBzIHByb2R1Y2VkIGFuIGVycm9yLCB0aHJvdyBpdCBpbiBoZXJlXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJpdmVyOiBJbm5lckRyaXZlcixcbiAgICAgICAgdmVyc2lvbjogZHJpdmVyVmVyc2lvbixcbiAgICAgICAgZHJpdmVyTmFtZVxuICAgICAgfSA9IHRoaXMuX2ZpbmRNYXRjaGluZ0RyaXZlcih0aGlzLmRyaXZlckNvbmZpZywgZGVzaXJlZENhcHMpO1xuICAgICAgdGhpcy5wcmludE5ld1Nlc3Npb25Bbm5vdW5jZW1lbnQoSW5uZXJEcml2ZXIubmFtZSwgZHJpdmVyVmVyc2lvbiwgSW5uZXJEcml2ZXIuYmFzZVZlcnNpb24pO1xuXG4gICAgICBpZiAodGhpcy5hcmdzLnNlc3Npb25PdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbFNlc3Npb25zKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBydW5uaW5nRHJpdmVyc0RhdGEsIG90aGVyUGVuZGluZ0RyaXZlcnNEYXRhO1xuXG4gICAgICBjb25zdCBkcml2ZXJJbnN0YW5jZSA9IG5ldyBJbm5lckRyaXZlcih0aGlzLmFyZ3MsIHRydWUpO1xuXG4gICAgICAvLyBXZSB3YW50IHRvIGFzc2lnbiBzZWN1cml0eSB2YWx1ZXMgZGlyZWN0bHkgb24gdGhlIGRyaXZlci4gVGhlIGRyaXZlclxuICAgICAgLy8gc2hvdWxkIG5vdCByZWFkIHNlY3VyaXR5IHZhbHVlcyBmcm9tIGB0aGlzLm9wdHNgIGJlY2F1c2UgdGhvc2UgdmFsdWVzXG4gICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gc2V0IGJ5IGEgbWFsaWNpb3VzIHVzZXIgdmlhIGNhcGFiaWxpdGllcywgd2hlcmVhcyB3ZVxuICAgICAgLy8gd2FudCBhIGd1YXJhbnRlZSB0aGUgdmFsdWVzIHdlcmUgc2V0IGJ5IHRoZSBhcHBpdW0gc2VydmVyIGFkbWluXG4gICAgICBpZiAodGhpcy5hcmdzLnJlbGF4ZWRTZWN1cml0eUVuYWJsZWQpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHJlbGF4ZWQgc2VjdXJpdHkgdG8gJyR7SW5uZXJEcml2ZXIubmFtZX0nIGFzIHBlciBgICtcbiAgICAgICAgICAgICAgICAgYHNlcnZlciBjb21tYW5kIGxpbmUgYXJndW1lbnQuIEFsbCBpbnNlY3VyZSBmZWF0dXJlcyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICBgZW5hYmxlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSAtLWRlbnktaW5zZWN1cmVgKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UucmVsYXhlZFNlY3VyaXR5RW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuYXJncy5kZW55SW5zZWN1cmUpKSB7XG4gICAgICAgIGxvZy5pbmZvKCdFeHBsaWNpdGx5IHByZXZlbnRpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuZGVueUluc2VjdXJlLm1hcCgoYSkgPT4gbG9nLmluZm8oYCAgICAke2F9YCkpO1xuICAgICAgICBkcml2ZXJJbnN0YW5jZS5kZW55SW5zZWN1cmUgPSB0aGlzLmFyZ3MuZGVueUluc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0V4cGxpY2l0bHkgZW5hYmxpbmcgdXNlIG9mIGluc2VjdXJlIGZlYXR1cmVzOicpO1xuICAgICAgICB0aGlzLmFyZ3MuYWxsb3dJbnNlY3VyZS5tYXAoKGEpID0+IGxvZy5pbmZvKGAgICAgJHthfWApKTtcbiAgICAgICAgZHJpdmVySW5zdGFuY2UuYWxsb3dJbnNlY3VyZSA9IHRoaXMuYXJncy5hbGxvd0luc2VjdXJlO1xuICAgICAgfVxuXG4gICAgICAvLyBMaWtld2lzZSwgYW55IGRyaXZlci1zcGVjaWZpYyBDTEkgYXJncyB0aGF0IHdlcmUgcGFzc2VkIGluIHNob3VsZCBiZSBhc3NpZ25lZCBkaXJlY3RseSB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIG1pbWlja2VkIGJ5IGEgbWFsaWNpb3VzIHVzZXIgc2VuZGluZyBpbiBjYXBhYmlsaXRpZXNcbiAgICAgIHRoaXMuYXNzaWduQ2xpQXJnc1RvRXh0ZW5zaW9uKCdkcml2ZXInLCBkcml2ZXJOYW1lLCBkcml2ZXJJbnN0YW5jZSk7XG5cblxuICAgICAgLy8gVGhpcyBhc3NpZ25tZW50IGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IHdlYiBzb2NrZXRzIGZ1bmN0aW9uYWxpdHkgaW5zaWRlIHRoZSBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnNlcnZlciA9IHRoaXMuc2VydmVyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnVubmluZ0RyaXZlcnNEYXRhID0gYXdhaXQgdGhpcy5jdXJTZXNzaW9uRGF0YUZvckRyaXZlcihJbm5lckRyaXZlcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcGVuZGluZ0RyaXZlcnNHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0gPSB0aGlzLnBlbmRpbmdEcml2ZXJzW0lubmVyRHJpdmVyLm5hbWVdIHx8IFtdO1xuICAgICAgICBvdGhlclBlbmRpbmdEcml2ZXJzRGF0YSA9IHRoaXMucGVuZGluZ0RyaXZlcnNbSW5uZXJEcml2ZXIubmFtZV0ubWFwKChkcnYpID0+IGRydi5kcml2ZXJEYXRhKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXS5wdXNoKGRyaXZlckluc3RhbmNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBbaW5uZXJTZXNzaW9uSWQsIGRDYXBzXSA9IGF3YWl0IGRyaXZlckluc3RhbmNlLmNyZWF0ZVNlc3Npb24oXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHJlcUNhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIFsuLi5ydW5uaW5nRHJpdmVyc0RhdGEsIC4uLm90aGVyUGVuZGluZ0RyaXZlcnNEYXRhXVxuICAgICAgICApO1xuICAgICAgICBwcm90b2NvbCA9IGRyaXZlckluc3RhbmNlLnByb3RvY29sO1xuICAgICAgICBhd2FpdCBzZXNzaW9uc0xpc3RHdWFyZC5hY3F1aXJlKEFwcGl1bURyaXZlci5uYW1lLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uc1tpbm5lclNlc3Npb25JZF0gPSBkcml2ZXJJbnN0YW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBwZW5kaW5nRHJpdmVyc0d1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgICBfLnB1bGwodGhpcy5wZW5kaW5nRHJpdmVyc1tJbm5lckRyaXZlci5uYW1lXSwgZHJpdmVySW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hdHRhY2hVbmV4cGVjdGVkU2h1dGRvd25IYW5kbGVyKGRyaXZlckluc3RhbmNlLCBpbm5lclNlc3Npb25JZCk7XG5cbiAgICAgIGxvZy5pbmZvKGBOZXcgJHtJbm5lckRyaXZlci5uYW1lfSBzZXNzaW9uIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCBzZXNzaW9uIGAgK1xuICAgICAgICAgICAgICBgJHtpbm5lclNlc3Npb25JZH0gYWRkZWQgdG8gbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuXG4gICAgICAvLyBzZXQgdGhlIE5ldyBDb21tYW5kIFRpbWVvdXQgZm9yIHRoZSBpbm5lciBkcml2ZXJcbiAgICAgIGRyaXZlckluc3RhbmNlLnN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgICAgLy8gYXBwbHkgaW5pdGlhbCB2YWx1ZXMgdG8gQXBwaXVtIHNldHRpbmdzIChpZiBwcm92aWRlZClcbiAgICAgIGlmIChkcml2ZXJJbnN0YW5jZS5pc1czQ1Byb3RvY29sKCkgJiYgIV8uaXNFbXB0eSh3M2NTZXR0aW5ncykpIHtcbiAgICAgICAgbG9nLmluZm8oYEFwcGx5aW5nIHRoZSBpbml0aWFsIHZhbHVlcyB0byBBcHBpdW0gc2V0dGluZ3MgcGFyc2VkIGZyb20gVzNDIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHczY1NldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKHczY1NldHRpbmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoZHJpdmVySW5zdGFuY2UuaXNNanNvbndwUHJvdG9jb2woKSAmJiAhXy5pc0VtcHR5KGp3cFNldHRpbmdzKSkge1xuICAgICAgICBsb2cuaW5mbyhgQXBwbHlpbmcgdGhlIGluaXRpYWwgdmFsdWVzIHRvIEFwcGl1bSBzZXR0aW5ncyBwYXJzZWQgZnJvbSBNSlNPTldQIGNhcHM6IGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGp3cFNldHRpbmdzKSk7XG4gICAgICAgIGF3YWl0IGRyaXZlckluc3RhbmNlLnVwZGF0ZVNldHRpbmdzKGp3cFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2wsXG4gICAgICB2YWx1ZTogW2lubmVyU2Vzc2lvbklkLCBkQ2FwcywgcHJvdG9jb2xdXG4gICAgfTtcbiAgfVxuXG4gIGF0dGFjaFVuZXhwZWN0ZWRTaHV0ZG93bkhhbmRsZXIgKGRyaXZlciwgaW5uZXJTZXNzaW9uSWQpIHtcbiAgICBjb25zdCBvblNodXRkb3duID0gKGNhdXNlID0gbmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpID0+IHtcbiAgICAgIGxvZy53YXJuKGBFbmRpbmcgc2Vzc2lvbiwgY2F1c2Ugd2FzICcke2NhdXNlLm1lc3NhZ2V9J2ApO1xuXG4gICAgICBpZiAodGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5zZXNzaW9uUGx1Z2luc1tpbm5lclNlc3Npb25JZF0pIHtcbiAgICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKHBsdWdpbi5vblVuZXhwZWN0ZWRTaHV0ZG93bikpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgUGx1Z2luICR7cGx1Z2luLm5hbWV9IGRlZmluZXMgYW4gdW5leHBlY3RlZCBzaHV0ZG93biBoYW5kbGVyOyBjYWxsaW5nIGl0IG5vd2ApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcGx1Z2luLm9uVW5leHBlY3RlZFNodXRkb3duKGRyaXZlciwgY2F1c2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBsb2cud2FybihgR290IGFuIGVycm9yIHdoZW4gcnVubmluZyBwbHVnaW4gJHtwbHVnaW4ubmFtZX0gc2h1dGRvd24gaGFuZGxlcjogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBkb2VzIG5vdCBkZWZpbmUgYW4gdW5leHBlY3RlZCBzaHV0ZG93biBoYW5kbGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKGBSZW1vdmluZyBzZXNzaW9uICcke2lubmVyU2Vzc2lvbklkfScgZnJvbSBvdXIgbWFzdGVyIHNlc3Npb24gbGlzdGApO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgICAgZGVsZXRlIHRoaXMuc2Vzc2lvblBsdWdpbnNbaW5uZXJTZXNzaW9uSWRdO1xuICAgIH07XG5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bikpIHtcbiAgICAgIGRyaXZlci5vblVuZXhwZWN0ZWRTaHV0ZG93bihvblNodXRkb3duKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBhdHRhY2ggdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24gbGlzdGVuZXIuIGAgK1xuICAgICAgICBgSXMgJ29uVW5leHBlY3RlZFNodXRkb3duJyBtZXRob2QgYXZhaWxhYmxlIGZvciAnJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0nP2ApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGN1clNlc3Npb25EYXRhRm9yRHJpdmVyIChJbm5lckRyaXZlcikge1xuICAgIGNvbnN0IHNlc3Npb25zID0gYXdhaXQgc2Vzc2lvbnNMaXN0R3VhcmQuYWNxdWlyZShBcHBpdW1Ecml2ZXIubmFtZSwgKCkgPT4gdGhpcy5zZXNzaW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IF8udmFsdWVzKHNlc3Npb25zKVxuICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMuY29uc3RydWN0b3IubmFtZSA9PT0gSW5uZXJEcml2ZXIubmFtZSlcbiAgICAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLmRyaXZlckRhdGEpO1xuICAgIGZvciAobGV0IGRhdHVtIG9mIGRhdGEpIHtcbiAgICAgIGlmICghZGF0dW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ibGVtIGdldHRpbmcgc2Vzc2lvbiBkYXRhIGZvciBkcml2ZXIgdHlwZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke0lubmVyRHJpdmVyLm5hbWV9OyBkb2VzIGl0IGltcGxlbWVudCAnZ2V0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGRyaXZlckRhdGEnP2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKHNlc3Npb25JZCkge1xuICAgIGxldCBwcm90b2NvbDtcbiAgICB0cnkge1xuICAgICAgbGV0IG90aGVyU2Vzc2lvbnNEYXRhID0gbnVsbDtcbiAgICAgIGxldCBkc3RTZXNzaW9uID0gbnVsbDtcbiAgICAgIGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VyQ29uc3RydWN0b3JOYW1lID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIG90aGVyU2Vzc2lvbnNEYXRhID0gXy50b1BhaXJzKHRoaXMuc2Vzc2lvbnMpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUuY29uc3RydWN0b3IubmFtZSA9PT0gY3VyQ29uc3RydWN0b3JOYW1lICYmIGtleSAhPT0gc2Vzc2lvbklkKVxuICAgICAgICAgICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlLmRyaXZlckRhdGEpO1xuICAgICAgICBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgICBwcm90b2NvbCA9IGRzdFNlc3Npb24ucHJvdG9jb2w7XG4gICAgICAgIGxvZy5pbmZvKGBSZW1vdmluZyBzZXNzaW9uICR7c2Vzc2lvbklkfSBmcm9tIG91ciBtYXN0ZXIgc2Vzc2lvbiBsaXN0YCk7XG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZGVsZXRlU2Vzc2lvbiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IG9yIG5vdFxuICAgICAgICAvLyBtYWtlIHRoZSBzZXNzaW9uIHVuYXZhaWxhYmxlLCBiZWNhdXNlIHdobyBrbm93cyB3aGF0IHN0YXRlIGl0IG1pZ2h0XG4gICAgICAgIC8vIGJlIGluIG90aGVyd2lzZVxuICAgICAgICBkZWxldGUgdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgdmFsdWU6IGF3YWl0IGRzdFNlc3Npb24uZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQsIG90aGVyU2Vzc2lvbnNEYXRhKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmVycm9yKGBIYWQgdHJvdWJsZSBlbmRpbmcgc2Vzc2lvbiAke3Nlc3Npb25JZH06ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGVycm9yOiBlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGxTZXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gICAgY29uc3Qgc2Vzc2lvbnNDb3VudCA9IF8uc2l6ZSh0aGlzLnNlc3Npb25zKTtcbiAgICBpZiAoMCA9PT0gc2Vzc2lvbnNDb3VudCkge1xuICAgICAgbG9nLmRlYnVnKCdUaGVyZSBhcmUgbm8gYWN0aXZlIHNlc3Npb25zIGZvciBjbGVhbnVwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZm9yY2UgPSBmYWxzZSxcbiAgICAgIHJlYXNvbixcbiAgICB9ID0gb3B0cztcbiAgICBsb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ2FjdGl2ZSBzZXNzaW9uJywgc2Vzc2lvbnNDb3VudCwgdHJ1ZSl9YCk7XG4gICAgY29uc3QgY2xlYW51cFByb21pc2VzID0gZm9yY2VcbiAgICAgID8gXy52YWx1ZXModGhpcy5zZXNzaW9ucykubWFwKChkcnYpID0+IGRydi5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihyZWFzb24gJiYgbmV3IEVycm9yKHJlYXNvbikpKVxuICAgICAgOiBfLmtleXModGhpcy5zZXNzaW9ucykubWFwKChpZCkgPT4gdGhpcy5kZWxldGVTZXNzaW9uKGlkKSk7XG4gICAgZm9yIChjb25zdCBjbGVhbnVwUHJvbWlzZSBvZiBjbGVhbnVwUHJvbWlzZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBQcm9taXNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cuZGVidWcoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgcGx1Z2lucyBmb3IgYSBzZXNzaW9uIChvciBzZXNzaW9ubGVzcyBwbHVnaW5zKVxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHNlc3Npb25JZCAtIHRoZSBzZXNzaW9uSWQgKG9yIG51bGwpIHRvIHVzZSB0byBmaW5kIHBsdWdpbnNcbiAgICogQHJldHVybnMge0FycmF5fSAtIGFycmF5IG9mIHBsdWdpbiBpbnN0YW5jZXNcbiAgICovXG4gIHBsdWdpbnNGb3JTZXNzaW9uIChzZXNzaW9uSWQgPSBudWxsKSB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaWYgKCF0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uUGx1Z2luc1tzZXNzaW9uSWRdID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF07XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLnNlc3Npb25sZXNzUGx1Z2lucykpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gdGhpcy5jcmVhdGVQbHVnaW5JbnN0YW5jZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGdldCBwbHVnaW5zIGZvciBhIGNvbW1hbmQsIHdlIGVpdGhlciBnZXQgdGhlIHBsdWdpbiBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBwYXJ0aWN1bGFyIGNvbW1hbmQncyBzZXNzaW9uLCBvciBpbiB0aGUgY2FzZSBvZiBzZXNzaW9ubGVzcyBwbHVnaW5zLCBwdWxsIGZyb20gdGhlIHNldCBvZlxuICAgKiBwbHVnaW4gaW5zdGFuY2VzIHJlc2VydmVkIGZvciBzZXNzaW9ubGVzcyBjb21tYW5kcyAoYW5kIHdlIGxhemlseSBjcmVhdGUgcGx1Z2luIGluc3RhbmNlcyBvblxuICAgKiBmaXJzdCB1c2UpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWQgLSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0byBmaW5kIGEgcGx1Z2luIHRvIGhhbmRsZVxuICAgKiBAcGFyYW0gez9zdHJpbmd9IHNlc3Npb25JZCAtIHRoZSBwYXJ0aWN1bGFyIHNlc3Npb24gZm9yIHdoaWNoIHRvIGZpbmQgYSBwbHVnaW4sIG9yIG51bGwgaWZcbiAgICogc2Vzc2lvbmxlc3NcbiAgICovXG4gIHBsdWdpbnNUb0hhbmRsZUNtZCAoY21kLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gICAgLy8gdG8gaGFuZGxlIGEgZ2l2ZW4gY29tbWFuZCwgYSBwbHVnaW4gc2hvdWxkIGVpdGhlciBpbXBsZW1lbnQgdGhhdCBjb21tYW5kIGFzIGEgcGx1Z2luXG4gICAgLy8gaW5zdGFuY2UgbWV0aG9kIG9yIGl0IHNob3VsZCBpbXBsZW1lbnQgYSBnZW5lcmljICdoYW5kbGUnIG1ldGhvZFxuICAgIHJldHVybiB0aGlzLnBsdWdpbnNGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICAgIC5maWx0ZXIoKHApID0+IF8uaXNGdW5jdGlvbihwW2NtZF0pIHx8IF8uaXNGdW5jdGlvbihwLmhhbmRsZSkpO1xuICB9XG5cbiAgY3JlYXRlUGx1Z2luSW5zdGFuY2VzICgpIHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5DbGFzc2VzLm1hcCgoUGx1Z2luQ2xhc3MpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBQbHVnaW5DbGFzcy5wbHVnaW5OYW1lO1xuICAgICAgY29uc3QgcGx1Z2luID0gbmV3IFBsdWdpbkNsYXNzKG5hbWUpO1xuICAgICAgdGhpcy5hc3NpZ25DbGlBcmdzVG9FeHRlbnNpb24oJ3BsdWdpbicsIG5hbWUsIHBsdWdpbik7XG4gICAgICByZXR1cm4gcGx1Z2luO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQgKGNtZCwgLi4uYXJncykge1xuICAgIC8vIFdlIGhhdmUgYmFzaWNhbGx5IHRocmVlIGNhc2VzIGZvciBob3cgdG8gaGFuZGxlIGNvbW1hbmRzOlxuICAgIC8vIDEuIGhhbmRsZSBnZXRTdGF0dXMgKHdlIGRvIHRoaXMgYXMgYSBzcGVjaWFsIG91dCBvZiBiYW5kIGNhc2Ugc28gaXQgZG9lc24ndCBnZXQgYWRkZWQgdG8gYW5cbiAgICAvLyAgICBleGVjdXRpb24gcXVldWUsIGFuZCBjYW4gYmUgY2FsbGVkIHdoaWxlIGUuZy4gY3JlYXRlU2Vzc2lvbiBpcyBpbiBwcm9ncmVzcylcbiAgICAvLyAyLiBoYW5kbGUgY29tbWFuZHMgdGhhdCB0aGlzIHVtYnJlbGxhIGRyaXZlciBzaG91bGQgaGFuZGxlLCByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIHNlc3Npb25cbiAgICAvLyAgICBkcml2ZXIgKGZvciBleGFtcGxlLCBkZWxldGVTZXNzaW9uLCBvciBvdGhlciBub24tc2Vzc2lvbiBjb21tYW5kcylcbiAgICAvLyAzLiBoYW5kbGUgc2Vzc2lvbiBkcml2ZXIgY29tbWFuZHMuXG4gICAgLy8gVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgYmVjYXVzZSB3ZSBzdXBwb3J0IGNvbW1hbmQgcGx1Z2lucywgd2UgbmVlZCB0byB3cmFwIGFueSBvZiB0aGVzZVxuICAgIC8vIGNhc2VzIHdpdGggcGx1Z2luIGhhbmRsaW5nLlxuXG4gICAgY29uc3QgaXNHZXRTdGF0dXMgPSBjbWQgPT09ICdnZXRTdGF0dXMnO1xuICAgIGNvbnN0IGlzVW1icmVsbGFDbWQgPSAhaXNHZXRTdGF0dXMgJiYgaXNBcHBpdW1Ecml2ZXJDb21tYW5kKGNtZCk7XG4gICAgY29uc3QgaXNTZXNzaW9uQ21kID0gIWlzR2V0U3RhdHVzICYmICFpc1VtYnJlbGxhQ21kO1xuXG4gICAgLy8gaWYgYSBwbHVnaW4gb3ZlcnJpZGUgcHJveHlpbmcgZm9yIHRoaXMgY29tbWFuZCBhbmQgdGhhdCBpcyB3aHkgd2UgYXJlIGhlcmUgaW5zdGVhZCBvZiBqdXN0XG4gICAgLy8gbGV0dGluZyB0aGUgcHJvdG9jb2wgcHJveHkgdGhlIGNvbW1hbmQgZW50aXJlbHksIGRldGVybWluZSB0aGF0LCBnZXQgdGhlIHJlcXVlc3Qgb2JqZWN0IGZvclxuICAgIC8vIHVzZSBsYXRlciBvbiwgdGhlbiBjbGVhbiB1cCB0aGUgYXJnc1xuICAgIGNvbnN0IHJlcUZvclByb3h5ID0gXy5sYXN0KGFyZ3MpPy5yZXFGb3JQcm94eTtcbiAgICBpZiAocmVxRm9yUHJveHkpIHtcbiAgICAgIGFyZ3MucG9wKCk7XG4gICAgfVxuXG5cbiAgICAvLyBmaXJzdCBkbyBzb21lIGVycm9yIGNoZWNraW5nLiBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBjb21tYW5kIGV4ZWN1dGlvbiwgdGhlbiBtYWtlXG4gICAgLy8gc3VyZSB0aGF0IHNlc3Npb24gYWN0dWFsbHkgZXhpc3RzIG9uIHRoZSBzZXNzaW9uIGRyaXZlciwgYW5kIHNldCB0aGUgc2Vzc2lvbiBkcml2ZXIgaXRzZWxmXG4gICAgbGV0IHNlc3Npb25JZCA9IG51bGw7XG4gICAgbGV0IGRzdFNlc3Npb24gPSBudWxsO1xuICAgIGxldCBwcm90b2NvbCA9IG51bGw7XG4gICAgbGV0IGRyaXZlciA9IHRoaXM7XG4gICAgaWYgKGlzU2Vzc2lvbkNtZCkge1xuICAgICAgc2Vzc2lvbklkID0gXy5sYXN0KGFyZ3MpO1xuICAgICAgZHN0U2Vzc2lvbiA9IGF3YWl0IHNlc3Npb25zTGlzdEd1YXJkLmFjcXVpcmUoQXBwaXVtRHJpdmVyLm5hbWUsICgpID0+IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXSk7XG4gICAgICBpZiAoIWRzdFNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2Vzc2lvbiB3aXRoIGlkICcke3Nlc3Npb25JZH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICAvLyBub3cgc2F2ZSB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgZ2l2ZW4gdGhhdCB0aGUgc2Vzc2lvbiBkcml2ZXIncyBwcm90b2NvbCBtaWdodCBkaWZmZXJcbiAgICAgIHByb3RvY29sID0gZHN0U2Vzc2lvbi5wcm90b2NvbDtcbiAgICAgIGRyaXZlciA9IGRzdFNlc3Npb247XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFueSBwbHVnaW5zIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGhhbmRsaW5nIHRoaXMgY29tbWFuZFxuICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLnBsdWdpbnNUb0hhbmRsZUNtZChjbWQsIHNlc3Npb25JZCk7XG5cbiAgICAvLyBub3cgd2UgZGVmaW5lIGEgJ2NtZEhhbmRsZWRCeScgb2JqZWN0IHdoaWNoIHdpbGwga2VlcCB0cmFjayBvZiB3aGljaCBwbHVnaW5zIGhhdmUgaGFuZGxlZCB0aGlzXG4gICAgLy8gY29tbWFuZC4gd2UgY2FyZSBhYm91dCB0aGlzIGJlY2F1c2UgKGEpIG11bHRpcGxlIHBsdWdpbnMgY2FuIGhhbmRsZSB0aGUgc2FtZSBjb21tYW5kLCBhbmRcbiAgICAvLyAoYikgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHBsdWdpbiB3aWxsIGFjdHVhbGx5IGNhbGwgdGhlIG5leHQoKSBtZXRob2Qgd2hpY2ggcnVucyB0aGVcbiAgICAvLyBvcmlnaW5hbCBjb21tYW5kIGV4ZWN1dGlvbi4gVGhpcyByZXN1bHRzIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBjb21tYW5kIG1pZ2h0IGJlIGhhbmRsZWRcbiAgICAvLyBieSBzb21lIGJ1dCBub3QgYWxsIHBsdWdpbnMsIG9yIGJ5IHBsdWdpbihzKSBidXQgbm90IGJ5IHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBTbyBzdGFydCBvdXRcbiAgICAvLyB0aGlzIG9iamVjdCBkZWNsYXJpbmcgdGhhdCB0aGUgZGVmYXVsdCBoYW5kbGVyIGhhcyBub3QgYmVlbiBleGVjdXRlZC5cbiAgICBjb25zdCBjbWRIYW5kbGVkQnkgPSB7ZGVmYXVsdDogZmFsc2V9O1xuXG4gICAgLy8gbm93IHdlIGRlZmluZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBwbHVnaW5zLCBhbmQgc3VjY2Vzc2l2ZWx5IHdyYXBwZWRcbiAgICAvLyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBsdWdpbiB0aGF0IGNhbiBoYW5kbGUgdGhlIGNvbW1hbmQuIFRvIHN0YXJ0IG9mZiB3aXRoLCB0aGUgYXN5bmNcbiAgICAvLyBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGNhbGxpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGkuZS4sIHdoaWNoZXZlciBvZiB0aGUgMyBjYXNlcyBhYm92ZSBpc1xuICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBvbmVcbiAgICBjb25zdCBkZWZhdWx0QmVoYXZpb3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBpZiB3ZSdyZSBydW5uaW5nIHdpdGggcGx1Z2lucywgbWFrZSBzdXJlIHdlIGxvZyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGFjdHVhbGx5XG4gICAgICAvLyBoYXBwZW5pbmcgc28gd2UgY2FuIHRlbGwgd2hlbiB0aGUgcGx1Z2luIGNhbGwgY2hhaW4gaXMgdW53cmFwcGluZyB0byB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgLy8gaWYgdGhhdCdzIHdoYXQgaGFwcGVuc1xuICAgICAgcGx1Z2lucy5sZW5ndGggJiYgbG9nLmluZm8oYEV4ZWN1dGluZyBkZWZhdWx0IGhhbmRsaW5nIGJlaGF2aW9yIGZvciBjb21tYW5kICcke2NtZH0nYCk7XG5cbiAgICAgIC8vIGlmIHdlIG1ha2UgaXQgaGVyZSwgd2Uga25vdyB0aGF0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGhhbmRsZWRcbiAgICAgIGNtZEhhbmRsZWRCeS5kZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgaWYgKHJlcUZvclByb3h5KSB7XG4gICAgICAgIC8vIHdlIHdvdWxkIGhhdmUgcHJveGllZCB0aGlzIGNvbW1hbmQgaGFkIGEgcGx1Z2luIG5vdCBoYW5kbGVkIGl0LCBzbyB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAvLyBpcyB0byBkbyB0aGUgcHJveHkgYW5kIHJldHJpZXZlIHRoZSByZXN1bHQgaW50ZXJuYWxseSBzbyBpdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgLy8gaW4gY2FzZSBpdCBjYWxscyAnYXdhaXQgbmV4dCgpJy4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBkcml2ZXIgaGF2ZSBkZWZpbmVkXG4gICAgICAgIC8vICdwcm94eUNvbW1hbmQnIGFuZCBub3QganVzdCAncHJveHlSZXFSZXMnLlxuICAgICAgICBpZiAoIWRzdFNlc3Npb24ucHJveHlDb21tYW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRHJpdmVyUHJveHlDb21tYW5kRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZHN0U2Vzc2lvbi5wcm94eUNvbW1hbmQocmVxRm9yUHJveHkub3JpZ2luYWxVcmwsIHJlcUZvclByb3h5Lm1ldGhvZCxcbiAgICAgICAgICByZXFGb3JQcm94eS5ib2R5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzR2V0U3RhdHVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbWJyZWxsYUNtZCkge1xuICAgICAgICAvLyBzb21lIGNvbW1hbmRzLCBsaWtlIGRlbGV0ZVNlc3Npb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIGhhbmRsZSBvbiAqdGhpcyogZHJpdmVyLFxuICAgICAgICAvLyBub3QgdGhlIHBsYXRmb3JtIGRyaXZlclxuICAgICAgICByZXR1cm4gYXdhaXQgc3VwZXIuZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gaGVyZSB3ZSBrbm93IHRoYXQgd2UgYXJlIGV4ZWN1dGluZyBhIHNlc3Npb24gY29tbWFuZCwgYW5kIGhhdmUgYSB2YWxpZCBzZXNzaW9uIGRyaXZlclxuICAgICAgcmV0dXJuIGF3YWl0IGRzdFNlc3Npb24uZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRha2Ugb3VyIGRlZmF1bHQgYmVoYXZpb3IsIHdyYXAgaXQgd2l0aCBhbnkgbnVtYmVyIG9mIHBsdWdpbiBiZWhhdmlvcnMsIGFuZCBydW4gaXRcbiAgICBjb25zdCB3cmFwcGVkQ21kID0gdGhpcy53cmFwQ29tbWFuZFdpdGhQbHVnaW5zKHtcbiAgICAgIGRyaXZlciwgY21kLCBhcmdzLCBwbHVnaW5zLCBjbWRIYW5kbGVkQnksIG5leHQ6IGRlZmF1bHRCZWhhdmlvclxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlY3V0ZVdyYXBwZWRDb21tYW5kKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pO1xuXG4gICAgLy8gaWYgd2UgaGFkIHBsdWdpbnMsIG1ha2Ugc3VyZSB0byBsb2cgb3V0IHRoZSBoZWxwZnVsIHJlcG9ydCBhYm91dCB3aGljaCBwbHVnaW5zIGVuZGVkIHVwXG4gICAgLy8gaGFuZGxpbmcgdGhlIGNvbW1hbmQgYW5kIHdoaWNoIGRpZG4ndFxuICAgIHRoaXMubG9nUGx1Z2luSGFuZGxlclJlcG9ydChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KTtcblxuICAgIC8vIEFuZCBmaW5hbGx5LCBpZiB0aGUgY29tbWFuZCB3YXMgY3JlYXRlU2Vzc2lvbiwgd2Ugd2FudCB0byBtaWdyYXRlIGFueSBwbHVnaW5zIHdoaWNoIHdlcmVcbiAgICAvLyBwcmV2aW91c2x5IHNlc3Npb25sZXNzIHRvIHVzZSB0aGUgbmV3IHNlc3Npb25JZCwgc28gdGhhdCBwbHVnaW5zIGNhbiBzaGFyZSBzdGF0ZSBiZXR3ZWVuXG4gICAgLy8gdGhlaXIgY3JlYXRlU2Vzc2lvbiBtZXRob2QgYW5kIG90aGVyIGluc3RhbmNlIG1ldGhvZHNcbiAgICBpZiAoY21kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EICYmIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zLmxlbmd0aCAmJiAhcmVzLmVycm9yKSB7XG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBfLmZpcnN0KHJlcy52YWx1ZSk7XG4gICAgICBsb2cuaW5mbyhgUHJvbW90aW5nICR7dGhpcy5zZXNzaW9ubGVzc1BsdWdpbnMubGVuZ3RofSBzZXNzaW9ubGVzcyBwbHVnaW5zIHRvIGJlIGF0dGFjaGVkIGAgK1xuICAgICAgICAgICAgICAgYHRvIHNlc3Npb24gSUQgJHtzZXNzaW9uSWR9YCk7XG4gICAgICB0aGlzLnNlc3Npb25QbHVnaW5zW3Nlc3Npb25JZF0gPSB0aGlzLnNlc3Npb25sZXNzUGx1Z2lucztcbiAgICAgIHRoaXMuc2Vzc2lvbmxlc3NQbHVnaW5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHdyYXBDb21tYW5kV2l0aFBsdWdpbnMgKHtkcml2ZXIsIGNtZCwgYXJncywgbmV4dCwgY21kSGFuZGxlZEJ5LCBwbHVnaW5zfSkge1xuICAgIHBsdWdpbnMubGVuZ3RoICYmIGxvZy5pbmZvKGBQbHVnaW5zIHdoaWNoIGNhbiBoYW5kbGUgY21kICcke2NtZH0nOiAke3BsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpfWApO1xuXG4gICAgLy8gbm93IHdlIGNhbiBnbyB0aHJvdWdoIGVhY2ggcGx1Z2luIGFuZCB3cmFwIGBuZXh0YCBhcm91bmQgaXRzIG93biBoYW5kbGVyLCBwYXNzaW5nIHRoZSAqb2xkKlxuICAgIC8vIG5leHQgaW4gc28gdGhhdCBpdCBjYW4gY2FsbCBpdCBpZiBpdCB3YW50cyB0b1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgIC8vIG5lZWQgYW4gSUlGRSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgb2YgbmV4dCB0aGF0J3MgcGFzc2VkIHRvIHBsdWdpbi5oYW5kbGUgdG8gYmVcbiAgICAgIC8vIGV4YWN0bHkgdGhlIHZhbHVlIG9mIG5leHQgaGVyZSBiZWZvcmUgcmVhc3NpZ25tZW50OyB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGxhemlseVxuICAgICAgLy8gZXZhbHVhdGVkLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBsYXN0IGBuZXh0YCB0byBiZSBkZWZpbmVkLlxuICAgICAgY21kSGFuZGxlZEJ5W3BsdWdpbi5uYW1lXSA9IGZhbHNlOyAvLyB3ZSBzZWUgYSBuZXcgcGx1Z2luLCBzbyBhZGQgaXQgdG8gdGhlICdjbWRIYW5kbGVkQnknIG9iamVjdFxuICAgICAgbmV4dCA9ICgoX25leHQpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgbG9nLmluZm8oYFBsdWdpbiAke3BsdWdpbi5uYW1lfSBpcyBub3cgaGFuZGxpbmcgY21kICcke2NtZH0nYCk7XG4gICAgICAgIGNtZEhhbmRsZWRCeVtwbHVnaW4ubmFtZV0gPSB0cnVlOyAvLyBpZiB3ZSBtYWtlIGl0IGhlcmUsIHRoaXMgcGx1Z2luIGhhcyBhdHRlbXB0ZWQgdG8gaGFuZGxlIGNtZFxuICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgY29tbWFuZCB2aWEgYSBjb21tYW5kLXNwZWNpZmljIGhhbmRsZXIgb24gdGhlIHBsdWdpblxuICAgICAgICBpZiAocGx1Z2luW2NtZF0pIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcGx1Z2luW2NtZF0oX25leHQsIGRyaXZlciwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjYWxsIHRoZSBnZW5lcmljICdoYW5kbGUnIG1ldGhvZFxuICAgICAgICByZXR1cm4gYXdhaXQgcGx1Z2luLmhhbmRsZShfbmV4dCwgZHJpdmVyLCBjbWQsIC4uLmFyZ3MpO1xuICAgICAgfSkobmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICBsb2dQbHVnaW5IYW5kbGVyUmVwb3J0IChwbHVnaW5zLCB7Y21kLCBjbWRIYW5kbGVkQnl9KSB7XG4gICAgaWYgKCFwbHVnaW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGRheSwgd2UgaGF2ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHdoaWNoIHBsdWdpbnMgZW5kZWQgdXAgZ2V0dGluZ1xuICAgIC8vIHRoZWlyIGNvZGUgcnVuIGFzIHBhcnQgb2YgaGFuZGxpbmcgdGhpcyBjb21tYW5kLiBCZWNhdXNlIHBsdWdpbnMgY2FuIGNob29zZSAqbm90KiB0b1xuICAgIC8vIHBhc3MgY29udHJvbCB0byBvdGhlciBwbHVnaW5zIG9yIHRvIHRoZSBkZWZhdWx0IGRyaXZlciBiZWhhdmlvciwgdGhpcyBpcyBpbmZvcm1hdGlvblxuICAgIC8vIHdoaWNoIGlzIHByb2JhYmx5IHVzZWZ1bCB0byB0aGUgdXNlciAoZXNwZWNpYWxseSBpbiBzaXR1YXRpb25zIHdoZXJlIHBsdWdpbnMgbWlnaHQgbm90XG4gICAgLy8gaW50ZXJhY3Qgd2VsbCB0b2dldGhlciwgYW5kIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGVidWcgb3RoZXJ3aXNlIHdpdGhvdXQgdGhpcyBraW5kIG9mXG4gICAgLy8gbWVzc2FnZSkuXG4gICAgY29uc3QgZGlkSGFuZGxlID0gT2JqZWN0LmtleXMoY21kSGFuZGxlZEJ5KS5maWx0ZXIoKGspID0+IGNtZEhhbmRsZWRCeVtrXSk7XG4gICAgY29uc3QgZGlkbnRIYW5kbGUgPSBPYmplY3Qua2V5cyhjbWRIYW5kbGVkQnkpLmZpbHRlcigoaykgPT4gIWNtZEhhbmRsZWRCeVtrXSk7XG4gICAgaWYgKGRpZG50SGFuZGxlLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy5pbmZvKGBDb21tYW5kICcke2NtZH0nIHdhcyAqbm90KiBoYW5kbGVkIGJ5IHRoZSBmb2xsb3dpbmcgYmVoYXZpb3VycyBvciBwbHVnaW5zLCBldmVuIGAgK1xuICAgICAgICAgICAgICAgYHRob3VnaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCB0byBoYW5kbGUgaXQ6ICR7SlNPTi5zdHJpbmdpZnkoZGlkbnRIYW5kbGUpfS4gVGhlIGAgK1xuICAgICAgICAgICAgICAgYGNvbW1hbmQgKndhcyogaGFuZGxlZCBieSB0aGVzZTogJHtKU09OLnN0cmluZ2lmeShkaWRIYW5kbGUpfS5gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleGVjdXRlV3JhcHBlZENvbW1hbmQgKHt3cmFwcGVkQ21kLCBwcm90b2NvbH0pIHtcbiAgICBsZXQgY21kUmVzLCBjbWRFcnIsIHJlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCBgd3JhcHBlZENtZGAgZGVmaW5lcyBhIHdob2xlIHNlcXVlbmNlIG9mIHBsdWdpbiBoYW5kbGVycywgY3VsbWluYXRpbmcgaW5cbiAgICAgIC8vIG91ciBkZWZhdWx0IGhhbmRsZXIuIFdoYXRldmVyIGl0IHJldHVybnMgaXMgd2hhdCB3ZSdyZSBnb2luZyB0byB3YW50IHRvIHNlbmQgYmFjayB0byB0aGVcbiAgICAgIC8vIHVzZXIuXG4gICAgICBjbWRSZXMgPSBhd2FpdCB3cmFwcGVkQ21kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY21kRXJyID0gZTtcbiAgICB9XG5cbiAgICAvLyBTYWRseSwgd2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQga2luZCBvZiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4gSXQgd2lsbCBlaXRoZXIgYmUgYSBiYXJlXG4gICAgLy8gb2JqZWN0LCBvciBhIHByb3RvY29sLWF3YXJlIG9iamVjdCB3aXRoIHByb3RvY29sIGFuZCBlcnJvci92YWx1ZSBrZXlzLiBTbyB3ZSBuZWVkIHRvIHNuaWZmXG4gICAgLy8gaXQgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBkb3VibGUtd3JhcCBpdCBpZiBpdCdzIHRoZSBsYXR0ZXIga2luZC5cbiAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGNtZFJlcykgJiYgXy5oYXMoY21kUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgcmVzID0gY21kUmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMudmFsdWUgPSBjbWRSZXM7XG4gICAgICByZXMuZXJyb3IgPSBjbWRFcnI7XG4gICAgICByZXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBjb25zdCBkc3RTZXNzaW9uID0gdGhpcy5zZXNzaW9uc1tzZXNzaW9uSWRdO1xuICAgIHJldHVybiBkc3RTZXNzaW9uICYmIF8uaXNGdW5jdGlvbihkc3RTZXNzaW9uLnByb3h5QWN0aXZlKSAmJiBkc3RTZXNzaW9uLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgZHN0U2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbnNbc2Vzc2lvbklkXTtcbiAgICByZXR1cm4gZHN0U2Vzc2lvbiA/IGRzdFNlc3Npb24uZ2V0UHJveHlBdm9pZExpc3QoKSA6IFtdO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIGNvbnN0IGRzdFNlc3Npb24gPSB0aGlzLnNlc3Npb25zW3Nlc3Npb25JZF07XG4gICAgcmV0dXJuIGRzdFNlc3Npb24gJiYgZHN0U2Vzc2lvbi5jYW5Qcm94eShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vIGhlbHAgZGVjaWRlIHdoaWNoIGNvbW1hbmRzIHNob3VsZCBiZSBwcm94aWVkIHRvIHN1Yi1kcml2ZXJzIGFuZCB3aGljaFxuLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhpcywgb3VyIHVtYnJlbGxhIGRyaXZlclxuZnVuY3Rpb24gaXNBcHBpdW1Ecml2ZXJDb21tYW5kIChjbWQpIHtcbiAgcmV0dXJuICFpc1Nlc3Npb25Db21tYW5kKGNtZCkgfHwgY21kID09PSAnZGVsZXRlU2Vzc2lvbic7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gQXBwaXVtIHRyaWVkIHRvIHByb3h5IGEgY29tbWFuZCB1c2luZyBhIGRyaXZlcidzIGBwcm94eUNvbW1hbmRgIG1ldGhvZCBidXQgdGhlXG4gKiBtZXRob2QgZGlkIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm9Ecml2ZXJQcm94eUNvbW1hbmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfTk9fRFJJVkVSX1BST1hZQ09NTUFORCc7XG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKGBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhpcyBjb21tYW5kIHdhcyB0byBwcm94eSwgYnV0IHRoZSBkcml2ZXIgYCArXG4gICAgICAgICAgYGRpZCBub3QgaGF2ZSB0aGUgJ3Byb3h5Q29tbWFuZCcgbWV0aG9kIGRlZmluZWQuIFRvIGZ1bGx5IHN1cHBvcnQgYCArXG4gICAgICAgICAgYHBsdWdpbnMsIGRyaXZlcnMgc2hvdWxkIGhhdmUgJ3Byb3h5Q29tbWFuZCcgc2V0IHRvIGEgandwUHJveHkgb2JqZWN0J3MgYCArXG4gICAgICAgICAgYCdjb21tYW5kKCknIG1ldGhvZCwgaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCAncHJveHlSZXFSZXMnYCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQXBwaXVtRHJpdmVyIH07XG4iXSwiZmlsZSI6ImxpYi9hcHBpdW0uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==