appium-android-driver 5.0.6 → 5.0.7

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 (37) hide show
  1. package/build/lib/commands/actions.js +16 -20
  2. package/build/lib/commands/app-management.js +10 -18
  3. package/build/lib/commands/context.js +43 -56
  4. package/build/lib/commands/coverage.js +2 -6
  5. package/build/lib/commands/element.js +3 -9
  6. package/build/lib/commands/emu-console.js +3 -5
  7. package/build/lib/commands/execute.js +3 -6
  8. package/build/lib/commands/file-actions.js +22 -29
  9. package/build/lib/commands/general.js +18 -30
  10. package/build/lib/commands/ime.js +8 -21
  11. package/build/lib/commands/network.js +14 -27
  12. package/build/lib/commands/performance.js +3 -6
  13. package/build/lib/commands/recordscreen.js +27 -38
  14. package/build/lib/commands/shell.js +6 -7
  15. package/build/lib/commands/streamscreen.js +29 -43
  16. package/build/lib/commands/system-bars.js +10 -16
  17. package/build/lib/commands/touch.js +4 -10
  18. package/build/lib/driver.js +36 -60
  19. package/lib/commands/actions.js +18 -19
  20. package/lib/commands/app-management.js +10 -11
  21. package/lib/commands/context.js +33 -34
  22. package/lib/commands/coverage.js +1 -4
  23. package/lib/commands/element.js +2 -3
  24. package/lib/commands/emu-console.js +2 -2
  25. package/lib/commands/execute.js +2 -3
  26. package/lib/commands/file-actions.js +31 -25
  27. package/lib/commands/general.js +16 -18
  28. package/lib/commands/ime.js +7 -8
  29. package/lib/commands/network.js +15 -16
  30. package/lib/commands/performance.js +2 -3
  31. package/lib/commands/recordscreen.js +23 -22
  32. package/lib/commands/shell.js +6 -6
  33. package/lib/commands/streamscreen.js +22 -23
  34. package/lib/commands/system-bars.js +11 -10
  35. package/lib/commands/touch.js +3 -4
  36. package/lib/driver.js +35 -36
  37. package/package.json +2 -2
@@ -17,8 +17,6 @@ var _index = _interopRequireDefault(require("./commands/index"));
17
17
 
18
18
  var _androidHelpers = require("./android-helpers");
19
19
 
20
- var _logger = _interopRequireDefault(require("./logger"));
21
-
22
20
  var _lodash = _interopRequireDefault(require("lodash"));
23
21
 
24
22
  var _appiumAdb = require("appium-adb");
@@ -130,7 +128,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
130
128
  });
131
129
 
132
130
  if ((await this.adb.getApiLevel()) >= 23) {
133
- _logger.default.warn("Consider setting 'automationName' capability to " + "'uiautomator2' on Android >= 6, since UIAutomator framework " + 'is not maintained anymore by the OS vendor.');
131
+ this.log.warn("Consider setting 'automationName' capability to " + "'uiautomator2' on Android >= 6, since UIAutomator framework " + 'is not maintained anymore by the OS vendor.');
134
132
  }
135
133
 
136
134
  if (this.helpers.isPackageOrBundle(this.opts.app)) {
@@ -142,14 +140,13 @@ class AndroidDriver extends _baseDriver.BaseDriver {
142
140
  this.opts.app = await this.helpers.configureApp(this.opts.app, APP_EXTENSION);
143
141
  await this.checkAppPresent();
144
142
  } else if (this.appOnDevice) {
145
- _logger.default.info(`App file was not listed, instead we're going to run ` + `${this.opts.appPackage} directly on the device`);
146
-
143
+ this.log.info(`App file was not listed, instead we're going to run ` + `${this.opts.appPackage} directly on the device`);
147
144
  await this.checkPackagePresent();
148
145
  }
149
146
 
150
147
  if (_support.util.hasValue(this.opts.networkSpeed)) {
151
148
  if (!this.isEmulator()) {
152
- _logger.default.warn('Sorry, networkSpeed capability is only available for emulators');
149
+ this.log.warn('Sorry, networkSpeed capability is only available for emulators');
153
150
  } else {
154
151
  const networkSpeed = (0, _androidHelpers.ensureNetworkSpeed)(this.adb, this.opts.networkSpeed);
155
152
  await this.adb.networkSpeed(networkSpeed);
@@ -158,11 +155,10 @@ class AndroidDriver extends _baseDriver.BaseDriver {
158
155
 
159
156
  if (_support.util.hasValue(this.opts.gpsEnabled)) {
160
157
  if (this.isEmulator()) {
161
- _logger.default.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);
162
-
158
+ this.log.info(`Trying to ${this.opts.gpsEnabled ? 'enable' : 'disable'} gps location provider`);
163
159
  await this.adb.toggleGPSLocationProvider(this.opts.gpsEnabled);
164
160
  } else {
165
- _logger.default.warn('Sorry! gpsEnabled capability is only available for emulators');
161
+ this.log.warn('Sorry! gpsEnabled capability is only available for emulators');
166
162
  }
167
163
  }
168
164
 
@@ -183,14 +179,14 @@ class AndroidDriver extends _baseDriver.BaseDriver {
183
179
 
184
180
  setAvdFromCapabilities(caps) {
185
181
  if (this.opts.avd) {
186
- _logger.default.info('avd name defined, ignoring device name and platform version');
182
+ this.log.info('avd name defined, ignoring device name and platform version');
187
183
  } else {
188
184
  if (!caps.deviceName) {
189
- _logger.default.errorAndThrow('avd or deviceName should be specified when reboot option is enables');
185
+ this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');
190
186
  }
191
187
 
192
188
  if (!caps.platformVersion) {
193
- _logger.default.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');
189
+ this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');
194
190
  }
195
191
 
196
192
  let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');
@@ -213,8 +209,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
213
209
  }
214
210
 
215
211
  async startAndroidSession() {
216
- _logger.default.info(`Starting Android session`);
217
-
212
+ this.log.info(`Starting Android session`);
218
213
  this.defaultIME = await _androidHelpers.helpers.initDevice(this.adb, this.opts);
219
214
  this.caps.deviceName = this.adb.curDeviceId;
220
215
  this.caps.deviceUDID = this.opts.udid;
@@ -226,17 +221,15 @@ class AndroidDriver extends _baseDriver.BaseDriver {
226
221
  if (this.opts.disableWindowAnimation) {
227
222
  if (await this.adb.isAnimationOn()) {
228
223
  if ((await this.adb.getApiLevel()) >= 28) {
229
- _logger.default.warn('Relaxing hidden api policy to manage animation scale');
230
-
224
+ this.log.warn('Relaxing hidden api policy to manage animation scale');
231
225
  await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);
232
226
  }
233
227
 
234
- _logger.default.info('Disabling window animation as it is requested by "disableWindowAnimation" capability');
235
-
228
+ this.log.info('Disabling window animation as it is requested by "disableWindowAnimation" capability');
236
229
  await this.adb.setAnimationState(false);
237
230
  this._wasWindowAnimationDisabled = true;
238
231
  } else {
239
- _logger.default.info('Window animation is already disabled');
232
+ this.log.info('Window animation is already disabled');
240
233
  }
241
234
  }
242
235
 
@@ -268,8 +261,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
268
261
  }
269
262
 
270
263
  if (_support.util.hasValue(this.opts.orientation)) {
271
- _logger.default.debug(`Setting initial orientation to '${this.opts.orientation}'`);
272
-
264
+ this.addManagedDriverlog.debug(`Setting initial orientation to '${this.opts.orientation}'`);
273
265
  await this.setOrientation(this.opts.orientation);
274
266
  }
275
267
 
@@ -280,9 +272,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
280
272
  if (this.opts.autoWebview) {
281
273
  let viewName = this.defaultWebviewName();
282
274
  let timeout = this.opts.autoWebviewTimeout || 2000;
283
-
284
- _logger.default.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);
285
-
275
+ this.log.info(`Setting auto webview to context '${viewName}' with timeout ${timeout}ms`);
286
276
  await (0, _asyncbox.retryInterval)(timeout / 500, 500, async () => {
287
277
  await this.setContext(viewName);
288
278
  });
@@ -306,7 +296,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
306
296
  try {
307
297
  otherApps = _androidHelpers.helpers.parseArray(this.opts.otherApps);
308
298
  } catch (e) {
309
- _logger.default.errorAndThrow(`Could not parse "otherApps" capability: ${e.message}`);
299
+ this.log.errorAndThrow(`Could not parse "otherApps" capability: ${e.message}`);
310
300
  }
311
301
 
312
302
  otherApps = await _bluebird.default.all(otherApps.map(app => this.helpers.configureApp(app, APP_EXTENSION)));
@@ -315,10 +305,10 @@ class AndroidDriver extends _baseDriver.BaseDriver {
315
305
 
316
306
  if (!this.opts.app) {
317
307
  if (this.opts.fullReset) {
318
- _logger.default.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
308
+ this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
319
309
  }
320
310
 
321
- _logger.default.debug('No app capability. Assuming it is already on the device');
311
+ this.log.debug('No app capability. Assuming it is already on the device');
322
312
 
323
313
  if (this.opts.fastReset) {
324
314
  await _androidHelpers.helpers.resetApp(this.adb, this.opts);
@@ -344,18 +334,18 @@ class AndroidDriver extends _baseDriver.BaseDriver {
344
334
  }
345
335
 
346
336
  async checkAppPresent() {
347
- _logger.default.debug('Checking whether app is actually present');
337
+ this.log.debug('Checking whether app is actually present');
348
338
 
349
339
  if (!(await _support.fs.exists(this.opts.app))) {
350
- _logger.default.errorAndThrow(`Could not find app apk at ${this.opts.app}`);
340
+ this.log.errorAndThrow(`Could not find app apk at ${this.opts.app}`);
351
341
  }
352
342
  }
353
343
 
354
344
  async checkPackagePresent() {
355
- _logger.default.debug('Checking whether package is present on the device');
345
+ this.log.debug('Checking whether package is present on the device');
356
346
 
357
347
  if (!(await this.adb.shell(['pm', 'list', 'packages', this.opts.appPackage]))) {
358
- _logger.default.errorAndThrow(`Could not find package ${this.opts.appPackage} on the device`);
348
+ this.log.errorAndThrow(`Could not find package ${this.opts.appPackage} on the device`);
359
349
  }
360
350
  }
361
351
 
@@ -366,7 +356,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
366
356
  }
367
357
 
368
358
  async deleteSession() {
369
- _logger.default.debug('Shutting down Android driver');
359
+ this.log.debug('Shutting down Android driver');
370
360
 
371
361
  try {
372
362
  if (!_lodash.default.isEmpty(this._screenRecordingProperties)) {
@@ -382,8 +372,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
382
372
  await this.stopChromedriverProxies();
383
373
 
384
374
  if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {
385
- _logger.default.debug(`Resetting IME to ${this.defaultIME}`);
386
-
375
+ this.log.debug(`Resetting IME to ${this.defaultIME}`);
387
376
  await this.adb.setIME(this.defaultIME);
388
377
  }
389
378
 
@@ -400,7 +389,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
400
389
  await this.bootstrap.shutdown();
401
390
  this.bootstrap = null;
402
391
  } else {
403
- _logger.default.debug("Called deleteSession but bootstrap wasn't active");
392
+ this.log.debug("Called deleteSession but bootstrap wasn't active");
404
393
  }
405
394
 
406
395
  await this.adb.stopLogcat();
@@ -410,36 +399,29 @@ class AndroidDriver extends _baseDriver.BaseDriver {
410
399
  }
411
400
 
412
401
  if (this._wasWindowAnimationDisabled) {
413
- _logger.default.info('Restoring window animation state');
414
-
402
+ this.log.info('Restoring window animation state');
415
403
  await this.adb.setAnimationState(true);
416
404
 
417
405
  if ((await this.adb.getApiLevel()) >= 28) {
418
- _logger.default.info('Restoring hidden api policy to the device default configuration');
419
-
406
+ this.log.info('Restoring hidden api policy to the device default configuration');
420
407
  await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);
421
408
  }
422
409
  }
423
410
 
424
411
  if (this.opts.reboot) {
425
412
  let avdName = this.opts.avd.replace('@', '');
426
-
427
- _logger.default.debug(`closing emulator '${avdName}'`);
428
-
413
+ this.log.debug(`closing emulator '${avdName}'`);
429
414
  await this.adb.killEmulator(avdName);
430
415
  }
431
416
  }
432
417
 
433
418
  async setSharedPreferences() {
434
419
  let sharedPrefs = this.opts.sharedPreferences;
435
-
436
- _logger.default.info('Trying to set shared preferences');
437
-
420
+ this.log.info('Trying to set shared preferences');
438
421
  let name = sharedPrefs.name;
439
422
 
440
423
  if (_lodash.default.isUndefined(name)) {
441
- _logger.default.warn(`Skipping setting Shared preferences, name is undefined: ${JSON.stringify(sharedPrefs)}`);
442
-
424
+ this.log.warn(`Skipping setting Shared preferences, name is undefined: ${JSON.stringify(sharedPrefs)}`);
443
425
  return false;
444
426
  }
445
427
 
@@ -448,27 +430,21 @@ class AndroidDriver extends _baseDriver.BaseDriver {
448
430
  let localPath = `/tmp/${name}.xml`;
449
431
  let builder = this.getPrefsBuilder();
450
432
  builder.build(sharedPrefs.prefs);
451
-
452
- _logger.default.info(`Creating temporary shared preferences: ${localPath}`);
453
-
433
+ this.log.info(`Creating temporary shared preferences: ${localPath}`);
454
434
  builder.toFile(localPath);
455
-
456
- _logger.default.info(`Creating shared_prefs remote folder: ${remotePath}`);
457
-
435
+ this.log.info(`Creating shared_prefs remote folder: ${remotePath}`);
458
436
  await this.adb.shell(['mkdir', '-p', remotePath]);
459
-
460
- _logger.default.info(`Pushing shared_prefs to ${remoteFile}`);
461
-
437
+ this.log.info(`Pushing shared_prefs to ${remoteFile}`);
462
438
  await this.adb.push(localPath, remoteFile);
463
439
 
464
440
  try {
465
- _logger.default.info(`Trying to remove shared preferences temporary file`);
441
+ this.log.info(`Trying to remove shared preferences temporary file`);
466
442
 
467
443
  if (await _support.fs.exists(localPath)) {
468
444
  await _support.fs.unlink(localPath);
469
445
  }
470
446
  } catch (e) {
471
- _logger.default.warn(`Error trying to remove temporary file ${localPath}`);
447
+ this.log.warn(`Error trying to remove temporary file ${localPath}`);
472
448
  }
473
449
 
474
450
  return true;
@@ -484,7 +460,7 @@ class AndroidDriver extends _baseDriver.BaseDriver {
484
460
  }
485
461
 
486
462
  if ((!caps.browserName || !_androidHelpers.helpers.isChromeBrowser(caps.browserName)) && !caps.app && !caps.appPackage) {
487
- _logger.default.errorAndThrow('The desired capabilities must include either an app, appPackage or browserName');
463
+ this.log.errorAndThrow('The desired capabilities must include either an app, appPackage or browserName');
488
464
  }
489
465
 
490
466
  return _androidHelpers.helpers.validateDesiredCaps(caps);
@@ -512,4 +488,4 @@ var _default = AndroidDriver;
512
488
  exports.default = _default;require('source-map-support').install();
513
489
 
514
490
 
515
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiQVBQX0VYVEVOU0lPTiIsIkRFVklDRV9QT1JUIiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJBbmRyb2lkRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiZGVzaXJlZENvbnN0cmFpbnRzIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJqd3BQcm94eUFjdGl2ZSIsImp3cFByb3h5QXZvaWQiLCJfIiwiY2xvbmUiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwiYXBrU3RyaW5ncyIsInVubG9ja2VyIiwiaGVscGVycyIsImNtZCIsImZuIiwidG9QYWlycyIsImNvbW1hbmRzIiwicHJvdG90eXBlIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiT2JqZWN0IiwiYXNzaWduIiwiZGVmYXVsdE9wdHMiLCJhY3Rpb24iLCJjYXRlZ29yeSIsImZsYWdzIiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsInRtcERpciIsInRlbXBEaXIiLCJzdGF0aWNEaXIiLCJmdWxsUmVzZXQiLCJhdXRvTGF1bmNoIiwiYWRiUG9ydCIsIkRFRkFVTFRfQURCX1BPUlQiLCJib290c3RyYXBQb3J0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJ1c2VVbmxvY2tIZWxwZXJBcHAiLCJpc1VuZGVmaW5lZCIsInVubG9ja1R5cGUiLCJub1Jlc2V0IiwiZmFzdFJlc2V0Iiwic2tpcFVuaW5zdGFsbCIsImlzQ2hyb21lU2Vzc2lvbiIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJwdXNoIiwicmVib290Iiwic2V0QXZkRnJvbUNhcGFiaWxpdGllcyIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwiYWxsb3dPZmZsaW5lRGV2aWNlcyIsImdldEFwaUxldmVsIiwibG9nIiwid2FybiIsImlzUGFja2FnZU9yQnVuZGxlIiwiYXBwIiwiYXBwUGFja2FnZSIsImNvbmZpZ3VyZUFwcCIsImNoZWNrQXBwUHJlc2VudCIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImNoZWNrUGFja2FnZVByZXNlbnQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJuZXR3b3JrU3BlZWQiLCJpc0VtdWxhdG9yIiwiZ3BzRW5hYmxlZCIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzdGFydEFuZHJvaWRTZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJpZ24iLCJhdmQiLCJkZXZpY2VOYW1lIiwiZXJyb3JBbmRUaHJvdyIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsInJlcGxhY2UiLCJpc0Nocm9tZUJyb3dzZXIiLCJicm93c2VyTmFtZSIsImtleSIsInZhbHVlIiwic2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSIsImRlZmF1bHRJTUUiLCJpbml0RGV2aWNlIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlU2NyZWVuU2l6ZSIsImdldFNjcmVlblNpemUiLCJkZXZpY2VNb2RlbCIsImdldE1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwiZ2V0TWFudWZhY3R1cmVyIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsImlzQW5pbWF0aW9uT24iLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsImJvb3RzdHJhcCIsIndlYnNvY2tldCIsInN0YXJ0IiwiYWNjZXB0U3NsQ2VydHMiLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsImNhdGNoIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImRlYnVnIiwic2V0T3JpZW50YXRpb24iLCJpbml0QXV0b1dlYnZpZXciLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJsYXVuY2hJbmZvIiwiZ2V0TGF1bmNoSW5mbyIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJ2YWxpZGF0ZURlc2lyZWRDYXBzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJvdGhlckFwcHMiLCJtZXNzYWdlIiwiQiIsImFsbCIsIm1hcCIsImluc3RhbGxPdGhlckFwa3MiLCJyZXNldEFwcCIsInVuaW5zdGFsbEFwayIsImluc3RhbGxBcGsiLCJhcGtTdHJpbmdzRm9yTGFuZ3VhZ2UiLCJwdXNoU3RyaW5ncyIsImxhbmd1YWdlIiwic2hhcmVkUHJlZmVyZW5jZXMiLCJzZXRTaGFyZWRQcmVmZXJlbmNlcyIsImZzIiwiZXhpc3RzIiwic2hlbGwiLCJjb21wcmVzcyIsInNlbmRBY3Rpb24iLCJjb21wcmVzc0xheW91dCIsImlzRW1wdHkiLCJfc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJ1bmljb2RlS2V5Ym9hcmQiLCJyZXNldEtleWJvYXJkIiwic2V0SU1FIiwiZG9udFN0b3BBcHBPblJlc2V0IiwiZm9yY2VTdG9wIiwiZ29Ub0hvbWUiLCJzaHV0ZG93biIsInN0b3BMb2djYXQiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInNoYXJlZFByZWZzIiwibmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZW1vdGVQYXRoIiwicmVtb3RlRmlsZSIsImxvY2FsUGF0aCIsImJ1aWxkZXIiLCJnZXRQcmVmc0J1aWxkZXIiLCJidWlsZCIsInByZWZzIiwidG9GaWxlIiwidW5saW5rIiwiU2hhcmVkUHJlZnNCdWlsZGVyIiwicHJveHlBY3RpdmUiLCJnZXRQcm94eUF2b2lkTGlzdCIsImNhblByb3h5IiwiaXNGdW5jdGlvbiIsInByb3h5UmVxUmVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGFBQWEsR0FBRyxNQUF0QjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxJQUFwQjtBQUlBLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsTUFBRCxFQUFTLElBQUlDLE1BQUosQ0FBVyx5QkFBWCxDQUFULENBRGUsRUFFZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBUixDQUZlLEVBR2Ys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ZVNldHRpbmdzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgZGVzaXJlZENvbnN0cmFpbnRzIGZyb20gJy4vZGVzaXJlZC1jYXBzJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzL2luZGV4JztcbmltcG9ydCB7XG4gIGhlbHBlcnMsIGVuc3VyZU5ldHdvcmtTcGVlZCxcbiAgU0VUVElOR1NfSEVMUEVSX1BLR19JRCxcbn0gZnJvbSAnLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFNoYXJlZFByZWZzQnVpbGRlciB9IGZyb20gJ3NoYXJlZC1wcmVmZXJlbmNlcy1idWlsZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQVBQX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IERFVklDRV9QT1JUID0gNDcyNDtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG9cbi8vIENocm9tZWRyaXZlclxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbl07XG5cbmNsYXNzIEFuZHJvaWREcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG5cbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnLWFuZHJvaWQgdWlhdXRvbWF0b3InXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDb25zdHJhaW50cztcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IF8uY2xvbmUoTk9fUFJPWFkpO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXR0aW5nc1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307XG4gICAgdGhpcy51bmxvY2tlciA9IGhlbHBlcnMudW5sb2NrZXI7XG5cbiAgICBmb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICAgICAgQW5kcm9pZERyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xuICAgIH1cblxuICAgIC8vIG5lZWRzIHRvIGJlIGFmdGVyIHRoZSBsaW5lIHdoaWNoIGFzc2lnbnMgY29tbWFuZHMgdG8gQW5kcm9pZERyaXZlci5wcm90b3R5cGUsIHNvIHRoYXQgYHRoaXMuZGVmYXVsdENvbnRleHROYW1lYCBpcyBkZWZpbmVkLlxuICAgIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXNzaW9uICguLi5hcmdzKSB7XG4gICAgLy8gdGhlIHdob2xlIGNyZWF0ZVNlc3Npb24gZmxvdyBpcyBzdXJyb3VuZGVkIGluIGEgdHJ5LWNhdGNoIHN0YXRlbWVudFxuICAgIC8vIGlmIGNyZWF0aW5nIGEgc2Vzc2lvbiBmYWlscyBhdCBhbnkgcG9pbnQsIHdlIHRlYXJkb3duIGV2ZXJ5dGhpbmcgd2VcbiAgICAvLyBzZXQgdXAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci5cbiAgICB0cnkge1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogdGhpcy5jYXBzXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhcHMgPSBPYmplY3QuYXNzaWduKHNlcnZlckRldGFpbHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAgIC8vIGFzc2lnbmluZyBkZWZhdWx0c1xuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBhY3Rpb246ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgICAgIGNhdGVnb3J5OiAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgICBmbGFnczogJzB4MTAyMDAwMDAnLFxuICAgICAgICBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzOiBmYWxzZSxcbiAgICAgICAgdG1wRGlyOiBhd2FpdCB0ZW1wRGlyLnN0YXRpY0RpcigpLFxuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBib290c3RyYXBQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiA5MDAwMCxcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuICAgICAgdGhpcy51c2VVbmxvY2tIZWxwZXJBcHAgPSBfLmlzVW5kZWZpbmVkKHRoaXMuY2Fwcy51bmxvY2tUeXBlKTtcblxuICAgICAgLy8gbm90IHVzZXIgdmlzaWJsZSB2aWEgY2Fwc1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMub3B0cy5mdWxsUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMub3B0cy5ub1Jlc2V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdHMuZmFzdFJlc2V0ID0gIXRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5ub1Jlc2V0O1xuICAgICAgdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgPSB0aGlzLm9wdHMuZmFzdFJlc2V0IHx8IHRoaXMub3B0cy5ub1Jlc2V0O1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHModGhpcy5vcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICAgIHRoaXMuandwUHJveHlBdm9pZC5wdXNoKFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgICBsZXQge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgICAgLy8gc2V0IHVwIGFuIGluc3RhbmNlIG9mIEFEQlxuICAgICAgdGhpcy5hZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUFEQih7XG4gICAgICAgIHVkaWQ6IHRoaXMub3B0cy51ZGlkLFxuICAgICAgICBlbVBvcnQ6IHRoaXMub3B0cy5lbVBvcnQsXG4gICAgICAgIGFkYlBvcnQ6IHRoaXMub3B0cy5hZGJQb3J0LFxuICAgICAgICBzdXBwcmVzc0tpbGxTZXJ2ZXI6IHRoaXMub3B0cy5zdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgICAgIHJlbW90ZUFkYkhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0LFxuICAgICAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0OiB0aGlzLm9wdHMuY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICAgICAgYWRiRXhlY1RpbWVvdXQ6IHRoaXMub3B0cy5hZGJFeGVjVGltZW91dCxcbiAgICAgICAgYWxsb3dPZmZsaW5lRGV2aWNlczogdGhpcy5vcHRzLmFsbG93T2ZmbGluZURldmljZXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjMpIHtcbiAgICAgICAgbG9nLndhcm4oXCJDb25zaWRlciBzZXR0aW5nICdhdXRvbWF0aW9uTmFtZScgY2FwYWJpbGl0eSB0byBcIiArXG4gICAgICAgICAgXCIndWlhdXRvbWF0b3IyJyBvbiBBbmRyb2lkID49IDYsIHNpbmNlIFVJQXV0b21hdG9yIGZyYW1ld29yayBcIiArXG4gICAgICAgICAgJ2lzIG5vdCBtYWludGFpbmVkIGFueW1vcmUgYnkgdGhlIE9TIHZlbmRvci4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwKSkge1xuICAgICAgICAvLyB1c2VyIHByb3ZpZGVkIHBhY2thZ2UgaW5zdGVhZCBvZiBhcHAgZm9yICdhcHAnIGNhcGFiaWxpdHksIG1hc3NhZ2Ugb3B0aW9uc1xuICAgICAgICB0aGlzLm9wdHMuYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHA7XG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIEFQUF9FWFRFTlNJT04pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwUHJlc2VudCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICBsb2cuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlUHJlc2VudCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21lIGNsb3VkIHNlcnZpY2VzIHVzaW5nIGFwcGl1bSBsYXVuY2ggdGhlIGF2ZCB0aGVtc2VsdmVzLCBzbyB3ZSBlbnN1cmUgbmV0c3BlZWRcbiAgICAgIC8vIGlzIHNldCBmb3IgZW11bGF0b3JzIGJ5IGNhbGxpbmcgYWRiLm5ldHdvcmtTcGVlZCBiZWZvcmUgcnVubmluZyB0aGUgYXBwXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMubmV0d29ya1NwZWVkKSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgbG9nLndhcm4oJ1NvcnJ5LCBuZXR3b3JrU3BlZWQgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV0d29ya1NwZWVkID0gZW5zdXJlTmV0d29ya1NwZWVkKHRoaXMuYWRiLCB0aGlzLm9wdHMubmV0d29ya1NwZWVkKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5uZXR3b3JrU3BlZWQobmV0d29ya1NwZWVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBncHMgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRyeWluZyB0byAke3RoaXMub3B0cy5ncHNFbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSd9IGdwcyBsb2NhdGlvbiBwcm92aWRlcmApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIodGhpcy5vcHRzLmdwc0VuYWJsZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKCdTb3JyeSEgZ3BzRW5hYmxlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0QW5kcm9pZFNlc3Npb24odGhpcy5vcHRzKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yaW5nIGRlbGV0ZSBzZXNzaW9uIGV4Y2VwdGlvbiBpZiBhbnkgYW5kIHRocm93IHRoZSByZWFsIGVycm9yXG4gICAgICAvLyB0aGF0IGhhcHBlbmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBzZXNzaW9uLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIGxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIGRldmljZU5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlcycpO1xuICAgICAgfVxuICAgICAgaWYgKCFjYXBzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwKSB8fCAoIXRoaXMub3B0cy5hcHAgJiZcbiAgICAgICAgICAgdGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHBQYWNrYWdlKSk7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ID09PSAnaWdub3JlVW5pbXBvcnRhbnRWaWV3cycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBbmRyb2lkU2Vzc2lvbiAoKSB7XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nIEFuZHJvaWQgc2Vzc2lvbmApO1xuICAgIC8vIHNldCB1cCB0aGUgZGV2aWNlIHRvIHJ1biBvbiAocmVhbCBvciBlbXVsYXRvciwgZXRjKVxuICAgIHRoaXMuZGVmYXVsdElNRSA9IGF3YWl0IGhlbHBlcnMuaW5pdERldmljZSh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIHNldCBhY3R1YWwgZGV2aWNlIG5hbWUsIHVkaWQsIHBsYXRmb3JtIHZlcnNpb24sIHNjcmVlbiBzaXplLCBtb2RlbCBhbmQgbWFudWZhY3R1cmVyIGRldGFpbHMuXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IGF3YWl0IHRoaXMuYWRiLmdldFNjcmVlblNpemUoKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRNb2RlbCgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBhd2FpdCB0aGlzLmFkYi5nZXRNYW51ZmFjdHVyZXIoKTtcblxuICAgIGlmICh0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQW5pbWF0aW9uT24oKSkge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBUEkgbGV2ZWwgMjggaXMgQW5kcm9pZCBQXG4gICAgICAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHJlc2V0IHRoZSByZWxheGluZyBpbiBkZWxldGUgc2Vzc2lvblxuICAgICAgICAgIGxvZy53YXJuKCdSZWxheGluZyBoaWRkZW4gYXBpIHBvbGljeSB0byBtYW5hZ2UgYW5pbWF0aW9uIHNjYWxlJyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SGlkZGVuQXBpUG9saWN5KCcxJywgISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nLmluZm8oJ0Rpc2FibGluZyB3aW5kb3cgYW5pbWF0aW9uIGFzIGl0IGlzIHJlcXVlc3RlZCBieSBcImRpc2FibGVXaW5kb3dBbmltYXRpb25cIiBjYXBhYmlsaXR5Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmluZm8oJ1dpbmRvdyBhbmltYXRpb24gaXMgYWxyZWFkeSBkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCBhcHAgdW5kZXIgdGVzdFxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gc3RhcnQgVWlBdXRvbWF0b3JcbiAgICB0aGlzLmJvb3RzdHJhcCA9IG5ldyBoZWxwZXJzLmJvb3RzdHJhcCh0aGlzLmFkYiwgdGhpcy5vcHRzLmJvb3RzdHJhcFBvcnQsIHRoaXMub3B0cy53ZWJzb2NrZXQpO1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnN0YXJ0KHRoaXMub3B0cy5hcHBQYWNrYWdlLCB0aGlzLm9wdHMuZGlzYWJsZUFuZHJvaWRXYXRjaGVycywgdGhpcy5vcHRzLmFjY2VwdFNzbENlcnRzKTtcbiAgICAvLyBoYW5kbGluZyB1bmV4cGVjdGVkIHNodXRkb3duXG4gICAgdGhpcy5ib290c3RyYXAub25VbmV4cGVjdGVkU2h1dGRvd24uY2F0Y2goYXN5bmMgKGVycikgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICAgICAgaWYgKCF0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gTGV0J3MgdHJ5IHRvIHVubG9jayB0aGUgZGV2aWNlXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgQ29tcHJlc3NlZExheW91dEhpZXJhcmNoeSBvbiB0aGUgZGV2aWNlIGJhc2VkIG9uIGN1cnJlbnQgc2V0dGluZ3Mgb2JqZWN0XG4gICAgLy8gdGhpcyBoYXMgdG8gaGFwcGVuIF9hZnRlcl8gYm9vdHN0cmFwIGlzIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMub3B0cy5pZ25vcmVVbmltcG9ydGFudFZpZXdzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnVwZGF0ZSh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogdGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3N9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgIC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb24gYW5kIHByb3h5IHRvIGl0XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2gpIHtcbiAgICAgICAgLy8gc3RhcnQgYXBwXG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnRBVVQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICBsb2cuZGVidWcoYFNldHRpbmcgaW5pdGlhbCBvcmllbnRhdGlvbiB0byAnJHt0aGlzLm9wdHMub3JpZW50YXRpb259J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zZXRPcmllbnRhdGlvbih0aGlzLm9wdHMub3JpZW50YXRpb24pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5pdEF1dG9XZWJ2aWV3KCk7XG4gIH1cblxuICBhc3luYyBpbml0QXV0b1dlYnZpZXcgKCkge1xuICAgIGlmICh0aGlzLm9wdHMuYXV0b1dlYnZpZXcpIHtcbiAgICAgIGxldCB2aWV3TmFtZSA9IHRoaXMuZGVmYXVsdFdlYnZpZXdOYW1lKCk7XG4gICAgICBsZXQgdGltZW91dCA9ICh0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0KSB8fCAyMDAwO1xuXG4gICAgICBsb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcblxuICAgICAgLy8gdHJ5IGV2ZXJ5IDUwMG1zIHVudGlsIHRpbWVvdXQgaXMgb3ZlclxuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KHZpZXdOYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHBvcHVsYXRlIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LFxuICAgIC8vIGFuZCB0aGUgZGV2aWNlIGJlaW5nIHVzZWRcbiAgICAvLyBpbiB0aGUgb3B0cyBhbmQgY2FwcyAoc28gaXQgZ2V0cyBiYWNrIHRvIHRoZSB1c2VyIG9uIHNlc3Npb24gY3JlYXRpb24pXG4gICAgbGV0IGxhdW5jaEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGxhdW5jaEluZm8pO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jYXBzLCBsYXVuY2hJbmZvKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHModGhpcy5vcHRzKTtcbiAgICAgIC8vIE9ubHkgU0VUVElOR1NfSEVMUEVSX1BLR19JRCBwYWNrYWdlIGlzIHVzZWQgYnkgVUlBMVxuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgcGFyc2UgXCJvdGhlckFwcHNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIG90aGVyQXBwcyA9IGF3YWl0IEIuYWxsKG90aGVyQXBwcy5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIEFQUF9FWFRFTlNJT04pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICAvLyBpbnN0YWxsIGFwcFxuICAgIGlmICghdGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgIH1cbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgY29uc3QgYXBrU3RyaW5nc0Zvckxhbmd1YWdlID0gYXdhaXQgaGVscGVycy5wdXNoU3RyaW5ncyh0aGlzLm9wdHMubGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGlmICh0aGlzLm9wdHMubGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXBrU3RyaW5nc0Zvckxhbmd1YWdlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbXVzdCBydW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBrLCBvdGhlcndpc2UgaXQgd291bGQgY2F1c2UgdGhlXG4gICAgLy8gaW5zdGFsbCB0byBmYWlsLiBBbmQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcC5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzLm9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgbG9nLmRlYnVnKCdDaGVja2luZyB3aGV0aGVyIGFwcCBpcyBhY3R1YWxseSBwcmVzZW50Jyk7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMub3B0cy5hcHApKSkge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIGFwcCBhcGsgYXQgJHt0aGlzLm9wdHMuYXBwfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrUGFja2FnZVByZXNlbnQgKCkge1xuICAgIGxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZScpO1xuICAgIGlmICghKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsIHRoaXMub3B0cy5hcHBQYWNrYWdlXSkpKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgcGFja2FnZSAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgb24gdGhlIGRldmljZVxuICBhc3luYyBzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IChjb21wcmVzcykge1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHknLCB7Y29tcHJlc3NMYXlvdXQ6IGNvbXByZXNzfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2cuZGVidWcoJ1NodXR0aW5nIGRvd24gQW5kcm9pZCBkcml2ZXInKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBoZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyh0aGlzLnNlcnZlciwgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgYXdhaXQgdGhpcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nKCk7XG5cbiAgICBhd2FpdCBzdXBlci5kZWxldGVTZXNzaW9uKCk7XG5cbiAgICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAgIC8vIGNlcnRhaW4gY2xlYW51cCB3ZSBvbmx5IGNhcmUgdG8gZG8gaWYgdGhlIGJvb3RzdHJhcCB3YXMgZXZlciBydW5cbiAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkICYmIHRoaXMub3B0cy5yZXNldEtleWJvYXJkICYmIHRoaXMuZGVmYXVsdElNRSkge1xuICAgICAgICBsb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJHt0aGlzLmRlZmF1bHRJTUV9YCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldElNRSh0aGlzLmRlZmF1bHRJTUUpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2h1dGRvd24oKTtcbiAgICAgIHRoaXMuYm9vdHN0cmFwID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFwiQ2FsbGVkIGRlbGV0ZVNlc3Npb24gYnV0IGJvb3RzdHJhcCB3YXNuJ3QgYWN0aXZlXCIpO1xuICAgIH1cbiAgICAvLyBzb21lIGNsZWFudXAgd2Ugd2FudCB0byBkbyByZWdhcmRsZXNzLCBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duXG4gICAgLy8gbWlkLXN0YXJ0dXBcbiAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgaWYgKHRoaXMudXNlVW5sb2NrSGVscGVyQXBwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoJ2lvLmFwcGl1bS51bmxvY2snKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkKSB7XG4gICAgICBsb2cuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuXG4gICAgICAvLyBUaGlzIHdhcyBuZWNlc3NhcnkgdG8gY2hhbmdlIGFuaW1hdGlvbiBzY2FsZSBvdmVyIEFuZHJvaWQgUC4gV2UgbXVzdCByZXNldCB0aGUgcG9saWN5IGZvciB0aGUgc2VjdXJpdHkuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkge1xuICAgICAgICBsb2cuaW5mbygnUmVzdG9yaW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIHRoZSBkZXZpY2UgZGVmYXVsdCBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgIGxvZy5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWRQcmVmZXJlbmNlcyAoKSB7XG4gICAgbGV0IHNoYXJlZFByZWZzID0gdGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzO1xuICAgIGxvZy5pbmZvKCdUcnlpbmcgdG8gc2V0IHNoYXJlZCBwcmVmZXJlbmNlcycpO1xuICAgIGxldCBuYW1lID0gc2hhcmVkUHJlZnMubmFtZTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChuYW1lKSkge1xuICAgICAgbG9nLndhcm4oYFNraXBwaW5nIHNldHRpbmcgU2hhcmVkIHByZWZlcmVuY2VzLCBuYW1lIGlzIHVuZGVmaW5lZDogJHtKU09OLnN0cmluZ2lmeShzaGFyZWRQcmVmcyl9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCByZW1vdGVQYXRoID0gYC9kYXRhL2RhdGEvJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0vc2hhcmVkX3ByZWZzYDtcbiAgICBsZXQgcmVtb3RlRmlsZSA9IGAke3JlbW90ZVBhdGh9LyR7bmFtZX0ueG1sYDtcbiAgICBsZXQgbG9jYWxQYXRoID0gYC90bXAvJHtuYW1lfS54bWxgO1xuICAgIGxldCBidWlsZGVyID0gdGhpcy5nZXRQcmVmc0J1aWxkZXIoKTtcbiAgICBidWlsZGVyLmJ1aWxkKHNoYXJlZFByZWZzLnByZWZzKTtcbiAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgdGVtcG9yYXJ5IHNoYXJlZCBwcmVmZXJlbmNlczogJHtsb2NhbFBhdGh9YCk7XG4gICAgYnVpbGRlci50b0ZpbGUobG9jYWxQYXRoKTtcbiAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgc2hhcmVkX3ByZWZzIHJlbW90ZSBmb2xkZXI6ICR7cmVtb3RlUGF0aH1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xuICAgIGxvZy5pbmZvKGBQdXNoaW5nIHNoYXJlZF9wcmVmcyB0byAke3JlbW90ZUZpbGV9YCk7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVzaChsb2NhbFBhdGgsIHJlbW90ZUZpbGUpO1xuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZWQgcHJlZmVyZW5jZXMgdGVtcG9yYXJ5IGZpbGVgKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cud2FybihgRXJyb3IgdHJ5aW5nIHRvIHJlbW92ZSB0ZW1wb3JhcnkgZmlsZSAke2xvY2FsUGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcmVmc0J1aWxkZXIgKCkge1xuICAgIC8qIEFkZCB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyIGluc3RlYWQgb2ZcbiAgICAgKiBkaXJlY3RseSBjcmVhdGluZyB0aGUgb2JqZWN0IG9uIHNldFNoYXJlZFByZWZlcmVuY2VzIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gICAgKi9cbiAgICByZXR1cm4gbmV3IFNoYXJlZFByZWZzQnVpbGRlcigpO1xuICB9XG5cbiAgdmFsaWRhdGVEZXNpcmVkQ2FwcyAoY2Fwcykge1xuICAgIGlmICghc3VwZXIudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKCFjYXBzLmJyb3dzZXJOYW1lIHx8ICFoZWxwZXJzLmlzQ2hyb21lQnJvd3NlcihjYXBzLmJyb3dzZXJOYW1lKSkgJiYgIWNhcHMuYXBwICYmICFjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KCdUaGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMgbXVzdCBpbmNsdWRlIGVpdGhlciBhbiBhcHAsIGFwcFBhY2thZ2Ugb3IgYnJvd3Nlck5hbWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBY3RpdmU7XG4gIH1cblxuICBnZXRQcm94eUF2b2lkTGlzdCAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuZ2V0UHJveHlBdm9pZExpc3Qoc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHRoaXMgd2lsbCBjaGFuZ2UgZGVwZW5kaW5nIG9uIENocm9tZURyaXZlciBzdGF0dXNcbiAgICByZXR1cm4gXy5pc0Z1bmN0aW9uKHRoaXMucHJveHlSZXFSZXMpO1xuICB9XG59XG5cbmV4cG9ydCB7IEFuZHJvaWREcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWREcml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
491
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiQVBQX0VYVEVOU0lPTiIsIkRFVklDRV9QT1JUIiwiTk9fUFJPWFkiLCJSZWdFeHAiLCJBbmRyb2lkRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiZGVzaXJlZENvbnN0cmFpbnRzIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJqd3BQcm94eUFjdGl2ZSIsImp3cFByb3h5QXZvaWQiLCJfIiwiY2xvbmUiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwiYXBrU3RyaW5ncyIsInVubG9ja2VyIiwiaGVscGVycyIsImNtZCIsImZuIiwidG9QYWlycyIsImNvbW1hbmRzIiwicHJvdG90eXBlIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiT2JqZWN0IiwiYXNzaWduIiwiZGVmYXVsdE9wdHMiLCJhY3Rpb24iLCJjYXRlZ29yeSIsImZsYWdzIiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsInRtcERpciIsInRlbXBEaXIiLCJzdGF0aWNEaXIiLCJmdWxsUmVzZXQiLCJhdXRvTGF1bmNoIiwiYWRiUG9ydCIsIkRFRkFVTFRfQURCX1BPUlQiLCJib290c3RyYXBQb3J0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGVmYXVsdHMiLCJ1c2VVbmxvY2tIZWxwZXJBcHAiLCJpc1VuZGVmaW5lZCIsInVubG9ja1R5cGUiLCJub1Jlc2V0IiwiZmFzdFJlc2V0Iiwic2tpcFVuaW5zdGFsbCIsImlzQ2hyb21lU2Vzc2lvbiIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJwdXNoIiwicmVib290Iiwic2V0QXZkRnJvbUNhcGFiaWxpdGllcyIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwiYWxsb3dPZmZsaW5lRGV2aWNlcyIsImdldEFwaUxldmVsIiwibG9nIiwid2FybiIsImlzUGFja2FnZU9yQnVuZGxlIiwiYXBwIiwiYXBwUGFja2FnZSIsImNvbmZpZ3VyZUFwcCIsImNoZWNrQXBwUHJlc2VudCIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImNoZWNrUGFja2FnZVByZXNlbnQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJuZXR3b3JrU3BlZWQiLCJpc0VtdWxhdG9yIiwiZ3BzRW5hYmxlZCIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzdGFydEFuZHJvaWRTZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJpZ24iLCJhdmQiLCJkZXZpY2VOYW1lIiwiZXJyb3JBbmRUaHJvdyIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsInJlcGxhY2UiLCJpc0Nocm9tZUJyb3dzZXIiLCJicm93c2VyTmFtZSIsImtleSIsInZhbHVlIiwic2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSIsImRlZmF1bHRJTUUiLCJpbml0RGV2aWNlIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlU2NyZWVuU2l6ZSIsImdldFNjcmVlblNpemUiLCJkZXZpY2VNb2RlbCIsImdldE1vZGVsIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwiZ2V0TWFudWZhY3R1cmVyIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsImlzQW5pbWF0aW9uT24iLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsInNldEFuaW1hdGlvblN0YXRlIiwiX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkIiwiaW5pdEFVVCIsImJvb3RzdHJhcCIsIndlYnNvY2tldCIsInN0YXJ0IiwiYWNjZXB0U3NsQ2VydHMiLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsImNhdGNoIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImFkZE1hbmFnZWREcml2ZXJsb2ciLCJkZWJ1ZyIsInNldE9yaWVudGF0aW9uIiwiaW5pdEF1dG9XZWJ2aWV3IiwiYXV0b1dlYnZpZXciLCJ2aWV3TmFtZSIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsInRpbWVvdXQiLCJhdXRvV2Vidmlld1RpbWVvdXQiLCJzZXRDb250ZXh0IiwibGF1bmNoSW5mbyIsImdldExhdW5jaEluZm8iLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwib3RoZXJBcHBzIiwibWVzc2FnZSIsIkIiLCJhbGwiLCJtYXAiLCJpbnN0YWxsT3RoZXJBcGtzIiwicmVzZXRBcHAiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiYXBrU3RyaW5nc0Zvckxhbmd1YWdlIiwicHVzaFN0cmluZ3MiLCJsYW5ndWFnZSIsInNoYXJlZFByZWZlcmVuY2VzIiwic2V0U2hhcmVkUHJlZmVyZW5jZXMiLCJmcyIsImV4aXN0cyIsInNoZWxsIiwiY29tcHJlc3MiLCJzZW5kQWN0aW9uIiwiY29tcHJlc3NMYXlvdXQiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsImdvVG9Ib21lIiwic2h1dGRvd24iLCJzdG9wTG9nY2F0Iiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzaGFyZWRQcmVmcyIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwicmVtb3RlUGF0aCIsInJlbW90ZUZpbGUiLCJsb2NhbFBhdGgiLCJidWlsZGVyIiwiZ2V0UHJlZnNCdWlsZGVyIiwiYnVpbGQiLCJwcmVmcyIsInRvRmlsZSIsInVubGluayIsIlNoYXJlZFByZWZzQnVpbGRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImlzRnVuY3Rpb24iLCJwcm94eVJlcVJlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxhQUFhLEdBQUcsTUFBdEI7QUFDQSxNQUFNQyxXQUFXLEdBQUcsSUFBcEI7QUFJQSxNQUFNQyxRQUFRLEdBQUcsQ0FDZixDQUFDLE1BQUQsRUFBUyxJQUFJQyxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQURlLEVBRWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLHlCQUFY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bEI7QUFFQSxXQUFPLEtBQUt0QixjQUFaO0FBQ0Q7O0FBRUQrTSxFQUFBQSxpQkFBaUIsQ0FBRXpMLFNBQUYsRUFBYTtBQUM1QixVQUFNeUwsaUJBQU4sQ0FBd0J6TCxTQUF4QjtBQUVBLFdBQU8sS0FBS3JCLGFBQVo7QUFDRDs7QUFFRCtNLEVBQUFBLFFBQVEsQ0FBRTFMLFNBQUYsRUFBYTtBQUNuQixVQUFNMEwsUUFBTixDQUFlMUwsU0FBZjtBQUdBLFdBQU9wQixnQkFBRStNLFVBQUYsQ0FBYSxLQUFLQyxXQUFsQixDQUFQO0FBQ0Q7O0FBL2RvQzs7O2VBbWV4QjNOLGEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRHJpdmVyLCBEZXZpY2VTZXR0aW5ncyB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQge1xuICBoZWxwZXJzLCBlbnN1cmVOZXR3b3JrU3BlZWQsXG4gIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsXG59IGZyb20gJy4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBERUZBVUxUX0FEQl9QT1JUIH0gZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQgeyBmcywgdGVtcERpciwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgU2hhcmVkUHJlZnNCdWlsZGVyIH0gZnJvbSAnc2hhcmVkLXByZWZlcmVuY2VzLWJ1aWxkZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OID0gJy5hcGsnO1xuY29uc3QgREVWSUNFX1BPUlQgPSA0NzI0O1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0b1xuLy8gQ2hyb21lZHJpdmVyXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuXTtcblxuY2xhc3MgQW5kcm9pZERyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAneHBhdGgnLFxuICAgICAgJ2lkJyxcbiAgICAgICdjbGFzcyBuYW1lJyxcbiAgICAgICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENvbnN0cmFpbnRzO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5jbG9uZShOT19QUk9YWSk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2V9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTtcbiAgICB0aGlzLnVubG9ja2VyID0gaGVscGVycy51bmxvY2tlcjtcblxuICAgIGZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gICAgICBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gICAgfVxuXG4gICAgLy8gbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIGxpbmUgd2hpY2ggYXNzaWducyBjb21tYW5kcyB0byBBbmRyb2lkRHJpdmVyLnByb3RvdHlwZSwgc28gdGhhdCBgdGhpcy5kZWZhdWx0Q29udGV4dE5hbWVgIGlzIGRlZmluZWQuXG4gICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICAvLyB0aGUgd2hvbGUgY3JlYXRlU2Vzc2lvbiBmbG93IGlzIHN1cnJvdW5kZWQgaW4gYSB0cnktY2F0Y2ggc3RhdGVtZW50XG4gICAgLy8gaWYgY3JlYXRpbmcgYSBzZXNzaW9uIGZhaWxzIGF0IGFueSBwb2ludCwgd2UgdGVhcmRvd24gZXZlcnl0aGluZyB3ZVxuICAgIC8vIHNldCB1cCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLlxuICAgIHRyeSB7XG4gICAgICBsZXQgW3Nlc3Npb25JZCwgY2Fwc10gPSBhd2FpdCBzdXBlci5jcmVhdGVTZXNzaW9uKC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc2VydmVyRGV0YWlscyA9IHtcbiAgICAgICAgcGxhdGZvcm06ICdMSU5VWCcsXG4gICAgICAgIHdlYlN0b3JhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGFrZXNTY3JlZW5zaG90OiB0cnVlLFxuICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZGF0YWJhc2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NhdGlvbkNvbnRleHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgd2FybmluZ3M6IHt9LFxuICAgICAgICBkZXNpcmVkOiB0aGlzLmNhcHNcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgLy8gYXNzaWduaW5nIGRlZmF1bHRzXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGFjdGlvbjogJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAgICAgY2F0ZWdvcnk6ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAgIGZsYWdzOiAnMHgxMDIwMDAwMCcsXG4gICAgICAgIGRpc2FibGVBbmRyb2lkV2F0Y2hlcnM6IGZhbHNlLFxuICAgICAgICB0bXBEaXI6IGF3YWl0IHRlbXBEaXIuc3RhdGljRGlyKCksXG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGJvb3RzdHJhcFBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwLFxuICAgICAgfTtcbiAgICAgIF8uZGVmYXVsdHModGhpcy5vcHRzLCBkZWZhdWx0T3B0cyk7XG4gICAgICB0aGlzLnVzZVVubG9ja0hlbHBlckFwcCA9IF8uaXNVbmRlZmluZWQodGhpcy5jYXBzLnVubG9ja1R5cGUpO1xuXG4gICAgICAvLyBub3QgdXNlciB2aXNpYmxlIHZpYSBjYXBzXG4gICAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5mYXN0UmVzZXQgPSAhdGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQ7XG4gICAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgICBoZWxwZXJzLmFkanVzdEJyb3dzZXJTZXNzaW9uQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgICAgdGhpcy5qd3BQcm94eUF2b2lkLnB1c2goWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2NyZWVuc2hvdCcpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgICB0aGlzLm9wdHMuZW1Qb3J0ID0gZW1Qb3J0O1xuXG4gICAgICAvLyBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgQURCXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQURCKHtcbiAgICAgICAgdWRpZDogdGhpcy5vcHRzLnVkaWQsXG4gICAgICAgIGVtUG9ydDogdGhpcy5vcHRzLmVtUG9ydCxcbiAgICAgICAgYWRiUG9ydDogdGhpcy5vcHRzLmFkYlBvcnQsXG4gICAgICAgIHN1cHByZXNzS2lsbFNlcnZlcjogdGhpcy5vcHRzLnN1cHByZXNzS2lsbFNlcnZlcixcbiAgICAgICAgcmVtb3RlQWRiSG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QsXG4gICAgICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6IHRoaXMub3B0cy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgICAgICBhZGJFeGVjVGltZW91dDogdGhpcy5vcHRzLmFkYkV4ZWNUaW1lb3V0LFxuICAgICAgICBhbGxvd09mZmxpbmVEZXZpY2VzOiB0aGlzLm9wdHMuYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiQ29uc2lkZXIgc2V0dGluZyAnYXV0b21hdGlvbk5hbWUnIGNhcGFiaWxpdHkgdG8gXCIgK1xuICAgICAgICAgIFwiJ3VpYXV0b21hdG9yMicgb24gQW5kcm9pZCA+PSA2LCBzaW5jZSBVSUF1dG9tYXRvciBmcmFtZXdvcmsgXCIgK1xuICAgICAgICAgICdpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlIGJ5IHRoZSBPUyB2ZW5kb3IuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcCkpIHtcbiAgICAgICAgLy8gdXNlciBwcm92aWRlZCBwYWNrYWdlIGluc3RlYWQgb2YgYXBwIGZvciAnYXBwJyBjYXBhYmlsaXR5LCBtYXNzYWdlIG9wdGlvbnNcbiAgICAgICAgdGhpcy5vcHRzLmFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwO1xuICAgICAgICB0aGlzLm9wdHMuYXBwID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBBUFBfRVhURU5TSU9OKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlUHJlc2VudCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21lIGNsb3VkIHNlcnZpY2VzIHVzaW5nIGFwcGl1bSBsYXVuY2ggdGhlIGF2ZCB0aGVtc2VsdmVzLCBzbyB3ZSBlbnN1cmUgbmV0c3BlZWRcbiAgICAgIC8vIGlzIHNldCBmb3IgZW11bGF0b3JzIGJ5IGNhbGxpbmcgYWRiLm5ldHdvcmtTcGVlZCBiZWZvcmUgcnVubmluZyB0aGUgYXBwXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMubmV0d29ya1NwZWVkKSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignU29ycnksIG5ldHdvcmtTcGVlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXR3b3JrU3BlZWQgPSBlbnN1cmVOZXR3b3JrU3BlZWQodGhpcy5hZGIsIHRoaXMub3B0cy5uZXR3b3JrU3BlZWQpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5ncHNFbmFibGVkKSkge1xuICAgICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBUcnlpbmcgdG8gJHt0aGlzLm9wdHMuZ3BzRW5hYmxlZCA/ICdlbmFibGUnIDogJ2Rpc2FibGUnfSBncHMgbG9jYXRpb24gcHJvdmlkZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKCdTb3JyeSEgZ3BzRW5hYmxlZCBjYXBhYmlsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0QW5kcm9pZFNlc3Npb24odGhpcy5vcHRzKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yaW5nIGRlbGV0ZSBzZXNzaW9uIGV4Y2VwdGlvbiBpZiBhbnkgYW5kIHRocm93IHRoZSByZWFsIGVycm9yXG4gICAgICAvLyB0aGF0IGhhcHBlbmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBzZXNzaW9uLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwKSB8fCAoIXRoaXMub3B0cy5hcHAgJiZcbiAgICAgICAgICAgdGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHBQYWNrYWdlKSk7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ID09PSAnaWdub3JlVW5pbXBvcnRhbnRWaWV3cycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29tcHJlc3NlZExheW91dEhpZXJhcmNoeSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBbmRyb2lkU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgQW5kcm9pZCBzZXNzaW9uYCk7XG4gICAgLy8gc2V0IHVwIHRoZSBkZXZpY2UgdG8gcnVuIG9uIChyZWFsIG9yIGVtdWxhdG9yLCBldGMpXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlscy5cbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IGF3YWl0IHRoaXMuYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuU2l6ZSgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IGF3YWl0IHRoaXMuYWRiLmdldE1vZGVsKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IGF3YWl0IHRoaXMuYWRiLmdldE1hbnVmYWN0dXJlcigpO1xuXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFQSSBsZXZlbCAyOCBpcyBBbmRyb2lkIFBcbiAgICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gcmVzZXQgdGhlIHJlbGF4aW5nIGluIGRlbGV0ZSBzZXNzaW9uXG4gICAgICAgICAgdGhpcy5sb2cud2FybignUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFuaW1hdGlvbiBzY2FsZScpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Rpc2FibGluZyB3aW5kb3cgYW5pbWF0aW9uIGFzIGl0IGlzIHJlcXVlc3RlZCBieSBcImRpc2FibGVXaW5kb3dBbmltYXRpb25cIiBjYXBhYmlsaXR5Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBzdGFydCBVaUF1dG9tYXRvclxuICAgIHRoaXMuYm9vdHN0cmFwID0gbmV3IGhlbHBlcnMuYm9vdHN0cmFwKHRoaXMuYWRiLCB0aGlzLm9wdHMuYm9vdHN0cmFwUG9ydCwgdGhpcy5vcHRzLndlYnNvY2tldCk7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc3RhcnQodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRoaXMub3B0cy5kaXNhYmxlQW5kcm9pZFdhdGNoZXJzLCB0aGlzLm9wdHMuYWNjZXB0U3NsQ2VydHMpO1xuICAgIC8vIGhhbmRsaW5nIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICB0aGlzLmJvb3RzdHJhcC5vblVuZXhwZWN0ZWRTaHV0ZG93bi5jYXRjaChhc3luYyAoZXJyKSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzXG4gICAgICBpZiAoIXRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93bikge1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyBMZXQncyB0cnkgdG8gdW5sb2NrIHRoZSBkZXZpY2VcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IG9uIHRoZSBkZXZpY2UgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncyBvYmplY3RcbiAgICAvLyB0aGlzIGhhcyB0byBoYXBwZW4gX2FmdGVyXyBib290c3RyYXAgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MudXBkYXRlKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiB0aGlzLm9wdHMuaWdub3JlVW5pbXBvcnRhbnRWaWV3c30pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvbiBhbmQgcHJveHkgdG8gaXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCkge1xuICAgICAgICAvLyBzdGFydCBhcHBcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMuYWRkTWFuYWdlZERyaXZlcmxvZy5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbml0QXV0b1dlYnZpZXcoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRBdXRvV2VidmlldyAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgbGV0IHZpZXdOYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgICAgIGxldCB0aW1lb3V0ID0gKHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQpIHx8IDIwMDA7XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYFNldHRpbmcgYXV0byB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG5cbiAgICAgIC8vIHRyeSBldmVyeSA1MDBtcyB1bnRpbCB0aW1lb3V0IGlzIG92ZXJcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q29udGV4dCh2aWV3TmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBwb3B1bGF0ZSBhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSxcbiAgICAvLyBhbmQgdGhlIGRldmljZSBiZWluZyB1c2VkXG4gICAgLy8gaW4gdGhlIG9wdHMgYW5kIGNhcHMgKHNvIGl0IGdldHMgYmFjayB0byB0aGUgdXNlciBvbiBzZXNzaW9uIGNyZWF0aW9uKVxuICAgIGxldCBsYXVuY2hJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCBsYXVuY2hJbmZvKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuY2FwcywgbGF1bmNoSW5mbyk7XG5cbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgaGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzKHRoaXMub3B0cyk7XG4gICAgICAvLyBPbmx5IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgcGFja2FnZSBpcyB1c2VkIGJ5IFVJQTFcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lEXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGFueSBcIm90aGVyQXBwc1wiIHRoYXQgd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMub3RoZXJBcHBzKSB7XG4gICAgICBsZXQgb3RoZXJBcHBzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3RoZXJBcHBzID0gaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy5vdGhlckFwcHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgcGFyc2UgXCJvdGhlckFwcHNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIG90aGVyQXBwcyA9IGF3YWl0IEIuYWxsKG90aGVyQXBwcy5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIEFQUF9FWFRFTlNJT04pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICAvLyBpbnN0YWxsIGFwcFxuICAgIGlmICghdGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gYXBwIGNhcGFiaWxpdHkuIEFzc3VtaW5nIGl0IGlzIGFscmVhZHkgb24gdGhlIGRldmljZScpO1xuICAgICAgaWYgKHRoaXMub3B0cy5mYXN0UmVzZXQpIHtcbiAgICAgICAgYXdhaXQgaGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGNvbnN0IGFwa1N0cmluZ3NGb3JMYW5ndWFnZSA9IGF3YWl0IGhlbHBlcnMucHVzaFN0cmluZ3ModGhpcy5vcHRzLmxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAodGhpcy5vcHRzLmxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmFwa1N0cmluZ3NbdGhpcy5vcHRzLmxhbmd1YWdlXSA9IGFwa1N0cmluZ3NGb3JMYW5ndWFnZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG11c3QgcnVuIGFmdGVyIGluc3RhbGxpbmcgdGhlIGFwaywgb3RoZXJ3aXNlIGl0IHdvdWxkIGNhdXNlIHRoZVxuICAgIC8vIGluc3RhbGwgdG8gZmFpbC4gQW5kIGJlZm9yZSBydW5uaW5nIHRoZSBhcHAuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMub3B0cy5zaGFyZWRQcmVmZXJlbmNlcykpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0U2hhcmVkUHJlZmVyZW5jZXModGhpcy5vcHRzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjaGVja0FwcFByZXNlbnQgKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdDaGVja2luZyB3aGV0aGVyIGFwcCBpcyBhY3R1YWxseSBwcmVzZW50Jyk7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMub3B0cy5hcHApKSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgYXBwIGFwayBhdCAke3RoaXMub3B0cy5hcHB9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2hlY2tQYWNrYWdlUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgcGFja2FnZSBpcyBwcmVzZW50IG9uIHRoZSBkZXZpY2UnKTtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3BtJywgJ2xpc3QnLCAncGFja2FnZXMnLCB0aGlzLm9wdHMuYXBwUGFja2FnZV0pKSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgcGFja2FnZSAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgb24gdGhlIGRldmljZVxuICBhc3luYyBzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IChjb21wcmVzcykge1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHknLCB7Y29tcHJlc3NMYXlvdXQ6IGNvbXByZXNzfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnU2h1dHRpbmcgZG93biBBbmRyb2lkIGRyaXZlcicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cblxuICAgIGF3YWl0IGhlbHBlcnMucmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzKHRoaXMuc2VydmVyLCB0aGlzLnNlc3Npb25JZCk7XG5cbiAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcblxuICAgIGlmICh0aGlzLmJvb3RzdHJhcCkge1xuICAgICAgLy8gY2VydGFpbiBjbGVhbnVwIHdlIG9ubHkgY2FyZSB0byBkbyBpZiB0aGUgYm9vdHN0cmFwIHdhcyBldmVyIHJ1blxuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiYgdGhpcy5kZWZhdWx0SU1FKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICR7dGhpcy5kZWZhdWx0SU1FfWApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgJiYgIXRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNodXRkb3duKCk7XG4gICAgICB0aGlzLmJvb3RzdHJhcCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FsbGVkIGRlbGV0ZVNlc3Npb24gYnV0IGJvb3RzdHJhcCB3YXNuJ3QgYWN0aXZlXCIpO1xuICAgIH1cbiAgICAvLyBzb21lIGNsZWFudXAgd2Ugd2FudCB0byBkbyByZWdhcmRsZXNzLCBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duXG4gICAgLy8gbWlkLXN0YXJ0dXBcbiAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgaWYgKHRoaXMudXNlVW5sb2NrSGVscGVyQXBwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoJ2lvLmFwcGl1bS51bmxvY2snKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3Jpbmcgd2luZG93IGFuaW1hdGlvbiBzdGF0ZScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG5cbiAgICAgIC8vIFRoaXMgd2FzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgYW5pbWF0aW9uIHNjYWxlIG92ZXIgQW5kcm9pZCBQLiBXZSBtdXN0IHJlc2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzZWN1cml0eS5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWRQcmVmZXJlbmNlcyAoKSB7XG4gICAgbGV0IHNoYXJlZFByZWZzID0gdGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzO1xuICAgIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBzZXQgc2hhcmVkIHByZWZlcmVuY2VzJyk7XG4gICAgbGV0IG5hbWUgPSBzaGFyZWRQcmVmcy5uYW1lO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBTa2lwcGluZyBzZXR0aW5nIFNoYXJlZCBwcmVmZXJlbmNlcywgbmFtZSBpcyB1bmRlZmluZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2hhcmVkUHJlZnMpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgcmVtb3RlUGF0aCA9IGAvZGF0YS9kYXRhLyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9L3NoYXJlZF9wcmVmc2A7XG4gICAgbGV0IHJlbW90ZUZpbGUgPSBgJHtyZW1vdGVQYXRofS8ke25hbWV9LnhtbGA7XG4gICAgbGV0IGxvY2FsUGF0aCA9IGAvdG1wLyR7bmFtZX0ueG1sYDtcbiAgICBsZXQgYnVpbGRlciA9IHRoaXMuZ2V0UHJlZnNCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5idWlsZChzaGFyZWRQcmVmcy5wcmVmcyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdGVtcG9yYXJ5IHNoYXJlZCBwcmVmZXJlbmNlczogJHtsb2NhbFBhdGh9YCk7XG4gICAgYnVpbGRlci50b0ZpbGUobG9jYWxQYXRoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBDcmVhdGluZyBzaGFyZWRfcHJlZnMgcmVtb3RlIGZvbGRlcjogJHtyZW1vdGVQYXRofWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG4gICAgdGhpcy5sb2cuaW5mbyhgUHVzaGluZyBzaGFyZWRfcHJlZnMgdG8gJHtyZW1vdGVGaWxlfWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVGaWxlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZWQgcHJlZmVyZW5jZXMgdGVtcG9yYXJ5IGZpbGVgKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlICR7bG9jYWxQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByZWZzQnVpbGRlciAoKSB7XG4gICAgLyogQWRkIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTaGFyZWRQcmVmc0J1aWxkZXIgaW5zdGVhZCBvZlxuICAgICAqIGRpcmVjdGx5IGNyZWF0aW5nIHRoZSBvYmplY3Qgb24gc2V0U2hhcmVkUHJlZmVyZW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAqL1xuICAgIHJldHVybiBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyKCk7XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgaWYgKCFzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoIWNhcHMuYnJvd3Nlck5hbWUgfHwgIWhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKGNhcHMuYnJvd3Nlck5hbWUpKSAmJiAhY2Fwcy5hcHAgJiYgIWNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIG11c3QgaW5jbHVkZSBlaXRoZXIgYW4gYXBwLCBhcHBQYWNrYWdlIG9yIGJyb3dzZXJOYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB0aGlzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiBDaHJvbWVEcml2ZXIgc3RhdHVzXG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbih0aGlzLnByb3h5UmVxUmVzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkRHJpdmVyO1xuIl0sImZpbGUiOiJsaWIvZHJpdmVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -1,7 +1,6 @@
1
1
  import androidHelpers from '../android-helpers';
2
2
  import { fs, util, tempDir} from '@appium/support';
3
3
  import path from 'path';
4
- import log from '../logger';
5
4
  import B from 'bluebird';
6
5
  import jimp from 'jimp';
7
6
  import { exec } from 'teen_process';
@@ -13,7 +12,7 @@ let commands = {}, helpers = {}, extensions = {};
13
12
 
14
13
  commands.keyevent = async function keyevent (keycode, metastate = null) {
15
14
  // TODO deprecate keyevent; currently wd only implements keyevent
16
- log.warn('keyevent will be deprecated use pressKeyCode');
15
+ this.log.warn('keyevent will be deprecated use pressKeyCode');
17
16
  return await this.pressKeyCode(keycode, metastate);
18
17
  };
19
18
 
@@ -148,56 +147,56 @@ commands.setLocation = async function setLocation (latitude, longitude) {
148
147
 
149
148
  commands.fingerprint = async function fingerprint (fingerprintId) {
150
149
  if (!this.isEmulator()) {
151
- log.errorAndThrow('fingerprint method is only available for emulators');
150
+ this.log.errorAndThrow('fingerprint method is only available for emulators');
152
151
  }
153
152
  await this.adb.fingerprint(fingerprintId);
154
153
  };
155
154
 
156
155
  commands.sendSMS = async function sendSMS (phoneNumber, message) {
157
156
  if (!this.isEmulator()) {
158
- log.errorAndThrow('sendSMS method is only available for emulators');
157
+ this.log.errorAndThrow('sendSMS method is only available for emulators');
159
158
  }
160
159
  await this.adb.sendSMS(phoneNumber, message);
161
160
  };
162
161
 
163
162
  commands.gsmCall = async function gsmCall (phoneNumber, action) {
164
163
  if (!this.isEmulator()) {
165
- log.errorAndThrow('gsmCall method is only available for emulators');
164
+ this.log.errorAndThrow('gsmCall method is only available for emulators');
166
165
  }
167
166
  await this.adb.gsmCall(phoneNumber, action);
168
167
  };
169
168
 
170
169
  commands.gsmSignal = async function gsmSignal (signalStrengh) {
171
170
  if (!this.isEmulator()) {
172
- log.errorAndThrow('gsmSignal method is only available for emulators');
171
+ this.log.errorAndThrow('gsmSignal method is only available for emulators');
173
172
  }
174
173
  await this.adb.gsmSignal(signalStrengh);
175
174
  };
176
175
 
177
176
  commands.gsmVoice = async function gsmVoice (state) {
178
177
  if (!this.isEmulator()) {
179
- log.errorAndThrow('gsmVoice method is only available for emulators');
178
+ this.log.errorAndThrow('gsmVoice method is only available for emulators');
180
179
  }
181
180
  await this.adb.gsmVoice(state);
182
181
  };
183
182
 
184
183
  commands.powerAC = async function powerAC (state) {
185
184
  if (!this.isEmulator()) {
186
- log.errorAndThrow('powerAC method is only available for emulators');
185
+ this.log.errorAndThrow('powerAC method is only available for emulators');
187
186
  }
188
187
  await this.adb.powerAC(state);
189
188
  };
190
189
 
191
190
  commands.powerCapacity = async function powerCapacity (batteryPercent) {
192
191
  if (!this.isEmulator()) {
193
- log.errorAndThrow('powerCapacity method is only available for emulators');
192
+ this.log.errorAndThrow('powerCapacity method is only available for emulators');
194
193
  }
195
194
  await this.adb.powerCapacity(batteryPercent);
196
195
  };
197
196
 
198
197
  commands.networkSpeed = async function networkSpeed (networkSpeed) {
199
198
  if (!this.isEmulator()) {
200
- log.errorAndThrow('networkSpeed method is only available for emulators');
199
+ this.log.errorAndThrow('networkSpeed method is only available for emulators');
201
200
  }
202
201
  await this.adb.networkSpeed(networkSpeed);
203
202
  };
@@ -217,13 +216,13 @@ commands.networkSpeed = async function networkSpeed (networkSpeed) {
217
216
  commands.sensorSet = async function sensorSet (sensor = {}) {
218
217
  const {sensorType, value} = sensor;
219
218
  if (!util.hasValue(sensorType)) {
220
- log.errorAndThrow(`'sensorType' argument is required`);
219
+ this.log.errorAndThrow(`'sensorType' argument is required`);
221
220
  }
222
221
  if (!util.hasValue(value)) {
223
- log.errorAndThrow(`'value' argument is required`);
222
+ this.log.errorAndThrow(`'value' argument is required`);
224
223
  }
225
224
  if (!this.isEmulator()) {
226
- log.errorAndThrow('sensorSet method is only available for emulators');
225
+ this.log.errorAndThrow('sensorSet method is only available for emulators');
227
226
  }
228
227
  await this.adb.sensorSet(sensorType, value);
229
228
  };
@@ -276,8 +275,8 @@ commands.getScreenshot = async function getScreenshot () {
276
275
  // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)
277
276
  image = await this.getScreenshotDataWithAdbExecOut(this.adb);
278
277
  } catch (e) {
279
- log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +
280
- `Defaulting to 'adb shell' call`);
278
+ this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +
279
+ `Defaulting to 'adb shell' call`);
281
280
  }
282
281
  }
283
282
  if (!image) {
@@ -285,9 +284,9 @@ commands.getScreenshot = async function getScreenshot () {
285
284
  image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);
286
285
  } catch (e) {
287
286
  const err = `Cannot get screenshot data because of '${e.message}'. ` +
288
- `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +
289
- `the current view`;
290
- log.errorAndThrow(err);
287
+ `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +
288
+ `the current view`;
289
+ this.log.errorAndThrow(err);
291
290
  }
292
291
  }
293
292
  if (apiLevel < 23) {
@@ -296,7 +295,7 @@ commands.getScreenshot = async function getScreenshot () {
296
295
  try {
297
296
  image = await image.rotate(-90 * screenOrientation);
298
297
  } catch (err) {
299
- log.warn(`Could not rotate screenshot due to error: ${err}`);
298
+ this.log.warn(`Could not rotate screenshot due to error: ${err}`);
300
299
  }
301
300
  }
302
301
  const getBuffer = B.promisify(image.getBuffer, {context: image});