appium-espresso-driver 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/commands/general.js +9 -15
- package/build/lib/driver.js +32 -47
- package/build/lib/espresso-runner.js +41 -66
- package/build/lib/server-builder.js +11 -20
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/lib/commands/general.js +6 -9
- package/lib/driver.js +31 -32
- package/lib/espresso-runner.js +40 -39
- package/lib/server-builder.js +10 -12
- package/npm-shrinkwrap.json +1111 -1383
- package/package.json +2 -2
package/build/lib/driver.js
CHANGED
|
@@ -19,8 +19,6 @@ var _espressoRunner = require("./espresso-runner");
|
|
|
19
19
|
|
|
20
20
|
var _support = require("@appium/support");
|
|
21
21
|
|
|
22
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
23
|
-
|
|
24
22
|
var _commands = _interopRequireDefault(require("./commands"));
|
|
25
23
|
|
|
26
24
|
var _appiumAdb = require("appium-adb");
|
|
@@ -89,11 +87,10 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
89
87
|
|
|
90
88
|
if (this.isChromeSession) {
|
|
91
89
|
if (this.opts.app) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
_logger.default.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` + `have permission to access Chrome`);
|
|
90
|
+
this.log.warn(`'browserName' capability will be ignored`);
|
|
91
|
+
this.log.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` + `have permission to access Chrome`);
|
|
95
92
|
} else {
|
|
96
|
-
|
|
93
|
+
this.log.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` + `automation doesn't have permission to access Chrome`);
|
|
97
94
|
}
|
|
98
95
|
}
|
|
99
96
|
|
|
@@ -118,10 +115,10 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
118
115
|
supportedExtensions: SUPPORTED_EXTENSIONS
|
|
119
116
|
});
|
|
120
117
|
} else if (this.appOnDevice) {
|
|
121
|
-
|
|
118
|
+
this.log.info(`App file was not listed, instead we're going to run ` + `${this.opts.appPackage} directly on the device`);
|
|
122
119
|
|
|
123
120
|
if (!(await this.adb.isAppInstalled(this.opts.appPackage))) {
|
|
124
|
-
|
|
121
|
+
this.log.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` + `installed on the device`);
|
|
125
122
|
}
|
|
126
123
|
}
|
|
127
124
|
|
|
@@ -155,13 +152,12 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
155
152
|
})).sort((a, b) => a.split(_path.default.sep).length - b.split(_path.default.sep).length);
|
|
156
153
|
|
|
157
154
|
if (sortedBundleItems.length === 0) {
|
|
158
|
-
|
|
155
|
+
this.log.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` + `extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);
|
|
159
156
|
}
|
|
160
157
|
|
|
161
158
|
const unzippedAppPath = _path.default.join(tmpRoot, _lodash.default.first(sortedBundleItems));
|
|
162
159
|
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
this.log.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);
|
|
165
161
|
return unzippedAppPath;
|
|
166
162
|
}
|
|
167
163
|
|
|
@@ -172,7 +168,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
172
168
|
}) {
|
|
173
169
|
const presignApp = async appLocation => {
|
|
174
170
|
if (this.opts.noSign) {
|
|
175
|
-
|
|
171
|
+
this.log.info('Skipping application signing because noSign capability is set to true. ' + 'Having the application under test with improper signature/non-signed will cause ' + 'Espresso automation startup failure.');
|
|
176
172
|
} else if (!(await this.adb.checkApkCert(appLocation, this.opts.appPackage))) {
|
|
177
173
|
await this.adb.sign(appLocation, this.opts.appPackage);
|
|
178
174
|
}
|
|
@@ -191,8 +187,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
191
187
|
const packageHash = await _support.fs.hash(appPath);
|
|
192
188
|
|
|
193
189
|
if (packageHash === cachedAppInfo.packageHash && (await _support.fs.exists(cachedAppInfo.fullPath))) {
|
|
194
|
-
|
|
195
|
-
|
|
190
|
+
this.log.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);
|
|
196
191
|
isResultAppPathAlreadyCached = true;
|
|
197
192
|
pathInCache = cachedAppInfo.fullPath;
|
|
198
193
|
}
|
|
@@ -242,14 +237,14 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
242
237
|
|
|
243
238
|
setAvdFromCapabilities(caps) {
|
|
244
239
|
if (this.opts.avd) {
|
|
245
|
-
|
|
240
|
+
this.log.info('avd name defined, ignoring device name and platform version');
|
|
246
241
|
} else {
|
|
247
242
|
if (!caps.deviceName) {
|
|
248
|
-
|
|
243
|
+
this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');
|
|
249
244
|
}
|
|
250
245
|
|
|
251
246
|
if (!caps.platformVersion) {
|
|
252
|
-
|
|
247
|
+
this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');
|
|
253
248
|
}
|
|
254
249
|
|
|
255
250
|
let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');
|
|
@@ -266,11 +261,10 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
266
261
|
}
|
|
267
262
|
|
|
268
263
|
async startEspressoSession() {
|
|
269
|
-
|
|
264
|
+
this.log.info(`EspressoDriver version: ${_package.version}`);
|
|
270
265
|
|
|
271
266
|
if ((await this.adb.getApiLevel()) >= 28) {
|
|
272
|
-
|
|
273
|
-
|
|
267
|
+
this.log.warn('Relaxing hidden api policy');
|
|
274
268
|
await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);
|
|
275
269
|
}
|
|
276
270
|
|
|
@@ -289,22 +283,20 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
289
283
|
await this.adb.setAnimationState(false);
|
|
290
284
|
this.wasAnimationEnabled = true;
|
|
291
285
|
} catch (err) {
|
|
292
|
-
|
|
286
|
+
this.log.warn(`Unable to turn off animations: ${err.message}`);
|
|
293
287
|
}
|
|
294
288
|
}
|
|
295
289
|
|
|
296
290
|
this.caps.deviceName = this.adb.curDeviceId;
|
|
297
291
|
this.caps.deviceUDID = this.opts.udid;
|
|
298
292
|
this.initEspressoServer();
|
|
299
|
-
|
|
300
|
-
_logger.default.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);
|
|
301
|
-
|
|
293
|
+
this.log.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);
|
|
302
294
|
await this.adb.forwardPort(this.opts.systemPort, DEVICE_PORT);
|
|
303
295
|
|
|
304
296
|
if (!this.opts.skipUnlock) {
|
|
305
297
|
await helpers.unlock(this, this.adb, this.caps);
|
|
306
298
|
} else {
|
|
307
|
-
|
|
299
|
+
this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);
|
|
308
300
|
}
|
|
309
301
|
|
|
310
302
|
await this.initAUT();
|
|
@@ -332,7 +324,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
332
324
|
await this.espresso.startSession(this.caps);
|
|
333
325
|
|
|
334
326
|
if (this.caps.autoLaunch === false) {
|
|
335
|
-
|
|
327
|
+
this.log.info(`Not waiting for the application activity to start because 'autoLaunch' is disabled`);
|
|
336
328
|
} else {
|
|
337
329
|
await this.adb.waitForActivity(this.caps.appWaitPackage, this.caps.appWaitActivity, this.opts.appWaitDuration);
|
|
338
330
|
}
|
|
@@ -349,9 +341,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
349
341
|
const viewName = _appiumAndroidDriver.androidCommands.defaultWebviewName.call(this);
|
|
350
342
|
|
|
351
343
|
const timeout = this.opts.autoWebviewTimeout || 2000;
|
|
352
|
-
|
|
353
|
-
_logger.default.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);
|
|
354
|
-
|
|
344
|
+
this.log.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);
|
|
355
345
|
await (0, _asyncbox.retryInterval)(timeout / 500, 500, this.setContext.bind(this), viewName);
|
|
356
346
|
}
|
|
357
347
|
|
|
@@ -373,7 +363,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
373
363
|
}
|
|
374
364
|
|
|
375
365
|
initEspressoServer() {
|
|
376
|
-
this.espresso = new _espressoRunner.EspressoRunner({
|
|
366
|
+
this.espresso = new _espressoRunner.EspressoRunner(this.log, {
|
|
377
367
|
host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',
|
|
378
368
|
systemPort: this.opts.systemPort,
|
|
379
369
|
devicePort: DEVICE_PORT,
|
|
@@ -406,10 +396,10 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
406
396
|
|
|
407
397
|
if (!this.opts.app) {
|
|
408
398
|
if (this.opts.fullReset) {
|
|
409
|
-
|
|
399
|
+
this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
|
|
410
400
|
}
|
|
411
401
|
|
|
412
|
-
|
|
402
|
+
this.log.debug('No app capability. Assuming it is already on the device');
|
|
413
403
|
|
|
414
404
|
if (this.opts.fastReset) {
|
|
415
405
|
await helpers.resetApp(this.adb, this.opts);
|
|
@@ -425,20 +415,20 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
425
415
|
}
|
|
426
416
|
|
|
427
417
|
if (this.opts.skipServerInstallation) {
|
|
428
|
-
|
|
418
|
+
this.log.debug('skipServerInstallation capability is set. Not installig espresso-server ');
|
|
429
419
|
} else {
|
|
430
420
|
await this.espresso.installTestApk();
|
|
431
421
|
|
|
432
422
|
try {
|
|
433
423
|
await this.adb.addToDeviceIdleWhitelist(_appiumAndroidDriver.SETTINGS_HELPER_PKG_ID, _espressoRunner.TEST_APK_PKG);
|
|
434
424
|
} catch (e) {
|
|
435
|
-
|
|
425
|
+
this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` + (e.stderr || e.message));
|
|
436
426
|
}
|
|
437
427
|
}
|
|
438
428
|
}
|
|
439
429
|
|
|
440
430
|
async deleteSession() {
|
|
441
|
-
|
|
431
|
+
this.log.debug('Deleting espresso session');
|
|
442
432
|
|
|
443
433
|
try {
|
|
444
434
|
if (!_lodash.default.isEmpty(this._screenRecordingProperties)) {
|
|
@@ -464,13 +454,12 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
464
454
|
try {
|
|
465
455
|
await this.adb.setAnimationState(true);
|
|
466
456
|
} catch (err) {
|
|
467
|
-
|
|
457
|
+
this.log.warn(`Unable to reset animation: ${err.message}`);
|
|
468
458
|
}
|
|
469
459
|
}
|
|
470
460
|
|
|
471
461
|
if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {
|
|
472
|
-
|
|
473
|
-
|
|
462
|
+
this.log.debug(`Resetting IME to '${this.defaultIME}'`);
|
|
474
463
|
await this.adb.setIME(this.defaultIME);
|
|
475
464
|
}
|
|
476
465
|
|
|
@@ -479,8 +468,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
479
468
|
}
|
|
480
469
|
|
|
481
470
|
if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {
|
|
482
|
-
|
|
483
|
-
|
|
471
|
+
this.log.debug(`FULL_RESET set to 'true', Uninstalling '${this.opts.appPackage}'`);
|
|
484
472
|
await this.adb.uninstallApk(this.opts.appPackage);
|
|
485
473
|
}
|
|
486
474
|
|
|
@@ -488,15 +476,12 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
488
476
|
|
|
489
477
|
if (this.opts.reboot) {
|
|
490
478
|
let avdName = this.opts.avd.replace('@', '');
|
|
491
|
-
|
|
492
|
-
_logger.default.debug(`closing emulator '${avdName}'`);
|
|
493
|
-
|
|
479
|
+
this.log.debug(`closing emulator '${avdName}'`);
|
|
494
480
|
await this.adb.killEmulator(avdName);
|
|
495
481
|
}
|
|
496
482
|
|
|
497
483
|
if ((await this.adb.getApiLevel()) >= 28) {
|
|
498
|
-
|
|
499
|
-
|
|
484
|
+
this.log.info('Restoring hidden api policy to the device default configuration');
|
|
500
485
|
await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);
|
|
501
486
|
}
|
|
502
487
|
}
|
|
@@ -507,7 +492,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
507
492
|
try {
|
|
508
493
|
await this.adb.removePortForward(this.opts.systemPort);
|
|
509
494
|
} catch (error) {
|
|
510
|
-
|
|
495
|
+
this.log.warn(`Unable to remove port forward '${error.message}'`);
|
|
511
496
|
}
|
|
512
497
|
}
|
|
513
498
|
}
|
|
@@ -561,4 +546,4 @@ var _default = EspressoDriver;
|
|
|
561
546
|
exports.default = _default;require('source-map-support').install();
|
|
562
547
|
|
|
563
548
|
|
|
564
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiU1lTVEVNX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiQVBLX0VYVCIsIkFBQl9FWFQiLCJTVVBQT1JURURfRVhURU5TSU9OUyIsIkVzcHJlc3NvRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJlc3ByZXNzbyIsImp3cFByb3h5QWN0aXZlIiwiZGVmYXVsdElNRSIsImp3cFByb3h5QXZvaWQiLCJhcGtTdHJpbmdzIiwic2V0dGluZ3MiLCJEZXZpY2VTZXR0aW5ncyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsImNhcHMiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsIk9iamVjdCIsImFzc2lnbiIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsIl8iLCJkZWZhdWx0cyIsImlzQ2hyb21lU2Vzc2lvbiIsImFwcCIsImxvZ2dlciIsIndhcm4iLCJlcnJvckFuZFRocm93IiwicmVib290Iiwic2V0QXZkRnJvbUNhcGFiaWxpdGllcyIsImFkZFdpcGVEYXRhVG9BdmRBcmdzIiwic3lzdGVtUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJjb25maWd1cmVBcHAiLCJvblBvc3RQcm9jZXNzIiwib25Qb3N0Q29uZmlndXJlQXBwIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImFwcFBhY2thZ2UiLCJpc0FwcEluc3RhbGxlZCIsInN0YXJ0RXNwcmVzc29TZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJtZXNzYWdlIiwiZW5kc1dpdGgiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZXJyIiwic3RhY2siLCJ1bnppcEFwcCIsImFwcFBhdGgiLCJ1c2VTeXN0ZW1VbnppcEVudiIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwidG9Mb3dlciIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInppcCIsImV4dHJhY3RBbGxUbyIsImdsb2JQYXR0ZXJuIiwibWFwIiwiZXh0IiwicmVwbGFjZSIsImpvaW4iLCJzb3J0ZWRCdW5kbGVJdGVtcyIsImZzIiwiZ2xvYiIsImN3ZCIsInN0cmljdCIsInNvcnQiLCJhIiwiYiIsInNwbGl0IiwicGF0aCIsInNlcCIsImxlbmd0aCIsInVuemlwcGVkQXBwUGF0aCIsImZpcnN0IiwiZGVidWciLCJjYWNoZWRBcHBJbmZvIiwiaXNVcmwiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaGFzQXBrRXh0IiwiaGFzQWFiRXh0IiwiZXh0cmFjdFVuaXZlcnNhbEFwayIsInNob3VsZEV4dHJhY3QiLCJwYXRoSW5DYWNoZSIsImlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQiLCJpc1BsYWluT2JqZWN0IiwicGFja2FnZUhhc2giLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJpc0FwayIsInNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCIsImlzVW56aXBwZWRBcGsiLCJyaW1yYWYiLCJkcml2ZXJEYXRhIiwiaXNFbXVsYXRvciIsImF2ZCIsImRldmljZU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJhdmREZXZpY2UiLCJhdmRBcmdzIiwidG9Mb3dlckNhc2UiLCJ2ZXJzaW9uIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiaW5pdERldmljZSIsImlzQW5pbWF0aW9uT24iLCJzZXRBbmltYXRpb25TdGF0ZSIsIndhc0FuaW1hdGlvbkVuYWJsZWQiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RXNwcmVzc29TZXJ2ZXIiLCJmb3J3YXJkUG9ydCIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJpbml0QVVUIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsIkVzcHJlc3NvUnVubmVyIiwiaG9zdCIsInJlbW90ZUFkYkhvc3QiLCJkZXZpY2VQb3J0IiwiYXBrIiwidG1wRGlyIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2hvd0dyYWRsZUxvZyIsInNlcnZlckxhdW5jaFRpbWVvdXQiLCJlc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlSZXFSZXMiLCJwcm94eUNvbW1hbmQiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJURVNUX0FQS19QS0ciLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsInNraXBVbmluc3RhbGwiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiaW5zdGFsbFRlc3RBcGsiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJzdGRlcnIiLCJfc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJpZ24iLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsInN0b3BMb2djYXQiLCJhdmROYW1lIiwia2lsbEVtdWxhdG9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsInVuZGVmaW5lZCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZXJyb3IiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJpc05pbCIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJpc0Nocm9tZUJyb3dzZXIiLCJicm93c2VyTmFtZSIsImlzUGFja2FnZU9yQnVuZGxlIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwicHJvdG90eXBlIiwiY29tbWFuZHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUEsTUFBTUEsT0FBTyxHQUFHQyxtQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQTFCO0FBSUEsTUFBTUMsV0FBVyxHQUFHLElBQXBCO0FBTUEsTUFBTUMsUUFBUSxHQUFHLENBQ2YsQ0FBQyxLQUFELEVBQVEsSUFBSUMsTUFBSixDQUFXLG1CQUFYLENBQVIsQ0FEZSxFQUVmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxnREFBWCxDQUFSLENBRmUsRUFHZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBUixDQUhlLEVBSWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLCtDQUFYLENBQVIsQ0FKZSxFQUtmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpREFBWCxDQUFSLENBTGUsRUFNZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBUixDQU5lLEVBT2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLDJDQUFYLENBQVIsQ0FQZSxFQVFmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpQ0FBWCxDQUFSLENBUmUsRUFTZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBUixDQVRlLEVBVWYsQ0FBQyxLQUFELEVBQVEs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QWZrQyxlQUFlLEdBQUk7QUFDckIsV0FBT3ZELE9BQU8sQ0FBQzJQLGVBQVIsQ0FBd0IsS0FBSzlPLElBQUwsQ0FBVStPLFdBQWxDLENBQVA7QUFDRDs7QUFFYyxNQUFYbkwsV0FBVyxHQUFJO0FBQ2pCLFdBQU8sQ0FBQyxLQUFLNUQsSUFBTCxDQUFVMkMsR0FBWCxJQUFrQixLQUFLeEQsT0FBTCxDQUFhNlAsaUJBQWIsQ0FBK0IsS0FBS2hQLElBQUwsQ0FBVThELFVBQXpDLENBQXpCO0FBQ0Q7O0FBeGhCcUM7Ozs7QUE0aEJ4QyxLQUFLLElBQUksQ0FBQ21MLEdBQUQsRUFBTUMsRUFBTixDQUFULElBQXNCMU0sZ0JBQUUyTSxPQUFGLENBQVU5RSxvQ0FBVixDQUF0QixFQUFrRDtBQUVoRCxNQUFJLENBQUM3SCxnQkFBRXlDLFFBQUYsQ0FBVyxDQUFDLG9CQUFELENBQVgsRUFBbUNnSyxHQUFuQyxDQUFMLEVBQThDO0FBQzVDcFAsSUFBQUEsY0FBYyxDQUFDdVAsU0FBZixDQUF5QkgsR0FBekIsSUFBZ0NDLEVBQWhDO0FBQ0Q7QUFDRjs7QUFHRCxLQUFLLElBQUksQ0FBQ0QsR0FBRCxFQUFNQyxFQUFOLENBQVQsSUFBc0IxTSxnQkFBRTJNLE9BQUYsQ0FBVUUsaUJBQVYsQ0FBdEIsRUFBMkM7QUFDekN4UCxFQUFBQSxjQUFjLENBQUN1UCxTQUFmLENBQXlCSCxHQUF6QixJQUFnQ0MsRUFBaEM7QUFDRDs7ZUFHY3JQLGMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCYXNlRHJpdmVyLCBlcnJvcnMsIGlzRXJyb3JUeXBlLCBEZXZpY2VTZXR0aW5nc30gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBFc3ByZXNzb1J1bm5lciwgVEVTVF9BUEtfUEtHIH0gZnJvbSAnLi9lc3ByZXNzby1ydW5uZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHppcCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgfSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgcXVhbGlmeUFjdGl2aXR5TmFtZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5cbi8vIFRPRE8gbWVyZ2Ugb3VyIG93biBoZWxwZXJzIG9udG8gdGhpcyBsYXRlclxuY29uc3QgaGVscGVycyA9IGFuZHJvaWRIZWxwZXJzO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gRXNwcmVzc28gSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgU1lTVEVNX1BPUlRfUkFOR0UgPSBbODMwMCwgODM5OV07XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgZXNwcmVzc28gc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS4gV2Ugd2lsbFxuLy8gZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZSBkZXZpY2UuXG5jb25zdCBERVZJQ0VfUE9SVCA9IDY3OTE7XG5cbi8vIE5PX1BST1hZIGNvbnRhaW5zIHRoZSBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2N1cnJlbnRfYWN0aXZpdHknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19rZXlib2FyZF9zaG93bicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fYmFycycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fdGltZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2JhY2tncm91bmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2Nsb3NlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9sYXVuY2gnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3Jlc2V0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9zdHJpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9hY3RpdmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9pbnN0YWxsZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9zdGF0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZmluZ2VyX3ByaW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9nZXRfY2xpcGJvYXJkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pbnN0YWxsX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvaXNfbG9ja2VkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9sb2NrJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdWxsX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZm9sZGVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdXNoX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3JlbW92ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS90ZXJtaW5hdGVfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS91bmxvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGVfYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuXG5jb25zdCBBUEtfRVhUID0gJy5hcGsnO1xuY29uc3QgQUFCX0VYVCA9ICcuYWFiJztcbmNvbnN0IFNVUFBPUlRFRF9FWFRFTlNJT05TID0gW0FQS19FWFQsIEFBQl9FWFRdO1xuXG5jbGFzcyBFc3ByZXNzb0RyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG5cbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7fSwgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2FwcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYCdicm93c2VyTmFtZScgY2FwYWJpbGl0eSB3aWxsIGJlIGlnbm9yZWRgKTtcbiAgICAgICAgICBsb2dnZXIud2FybihgQ2hyb21lIGJyb3dzZXIgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBzZXNzaW9ucyBiZWNhdXNlIEVzcHJlc3NvIGF1dG9tYXRpb24gZG9lc24ndCBgICtcbiAgICAgICAgICAgICAgYGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgQ2hyb21lYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENocm9tZSBicm93c2VyIHNlc3Npb25zIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gYmVjYXVzZSBFc3ByZXNzbyBgICtcbiAgICAgICAgICAgIGBhdXRvbWF0aW9uIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICAgIHRoaXMuYWRkV2lwZURhdGFUb0F2ZEFyZ3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSB0aGlzLm9wdHMuc3lzdGVtUG9ydFxuICAgICAgICB8fCBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShTWVNURU1fUE9SVF9SQU5HRVswXSwgU1lTVEVNX1BPUlRfUkFOR0VbMV0pO1xuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG4gICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgICAgLy8gQURCIGluc3RhbmNlXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIHtcbiAgICAgICAgICBvblBvc3RQcm9jZXNzOiB0aGlzLm9uUG9zdENvbmZpZ3VyZUFwcC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IFNVUFBPUlRFRF9FWFRFTlNJT05TXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIC8vIHRoZSBhcHAgaXNuJ3QgYW4gYWN0dWFsIGFwcCBmaWxlIGJ1dCByYXRoZXIgc29tZXRoaW5nIHdlIHdhbnQgdG9cbiAgICAgICAgLy8gYXNzdW1lIGlzIG9uIHRoZSBkZXZpY2UgYW5kIGp1c3QgbGF1bmNoIHZpYSB0aGUgYXBwUGFja2FnZVxuICAgICAgICBsb2dnZXIuaW5mbyhgQXBwIGZpbGUgd2FzIG5vdCBsaXN0ZWQsIGluc3RlYWQgd2UncmUgZ29pbmcgdG8gcnVuIGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZCh0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgdGhlIHBhY2thZ2UgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgIGBpbnN0YWxsZWQgb24gdGhlIGRldmljZWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRFc3ByZXNzb1Nlc3Npb24oKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCBjYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIGUubWVzc2FnZSArPSBgJHtfLmVuZHNXaXRoKGUubWVzc2FnZSwgJy4nKSA/ICcnIDogJy4nfSBDaGVjayBgICtcbiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWVzcHJlc3NvLWRyaXZlciN0cm91Ymxlc2hvb3RpbmcgJyArXG4gICAgICAgICdyZWdhcmRpbmcgYWR2YW5jZWQgc2Vzc2lvbiBzdGFydHVwIHRyb3VibGVzaG9vdGluZy4nO1xuICAgICAgaWYgKGlzRXJyb3JUeXBlKGUsIGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyID0gbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKGUubWVzc2FnZSk7XG4gICAgICBlcnIuc3RhY2sgPSBlLnN0YWNrO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnppcCB0aGUgZ2l2ZW4gYXBwIHBhdGggYW5kIHJldHVybiB0aGUgZmlyc3QgcGFja2FnZSB0aGF0IGhhcyBTVVBQT1JURURfRVhURU5TSU9OU1xuICAgKiBpbiB0aGUgYXJjaGl2ZWQgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggVGhlIHBhdGggdG8gYXBwIGZpbGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVucyB0aGUgcGF0aCB0byBhbiB1bnppcHBlZCBhcHAgZmlsZSBwYXRoLlxuICAgKiBAdGhyb3dzIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgemlwIGRpZCBub3QgaGF2ZSBhbnkgU1VQUE9SVEVEX0VYVEVOU0lPTlMgcGFja2FnZXMuXG4gICAqL1xuICBhc3luYyB1bnppcEFwcCAoYXBwUGF0aCkge1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwRW52ID0gcHJvY2Vzcy5lbnYuQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVA7XG4gICAgY29uc3QgdXNlU3lzdGVtVW56aXAgPSBfLmlzRW1wdHkodXNlU3lzdGVtVW56aXBFbnYpXG4gICAgICB8fCAhWycwJywgJ2ZhbHNlJ10uaW5jbHVkZXMoXy50b0xvd2VyKHVzZVN5c3RlbVVuemlwRW52KSk7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oYXBwUGF0aCwgdG1wUm9vdCwge3VzZVN5c3RlbVVuemlwfSk7XG5cbiAgICBjb25zdCBnbG9iUGF0dGVybiA9IGAqKi8qLisoJHtTVVBQT1JURURfRVhURU5TSU9OUy5tYXAoKGV4dCkgPT4gZXh0LnJlcGxhY2UoL15cXC4vLCAnJykpLmpvaW4oJ3wnKX0pYDtcbiAgICBjb25zdCBzb3J0ZWRCdW5kbGVJdGVtcyA9IChhd2FpdCBmcy5nbG9iKGdsb2JQYXR0ZXJuLCB7XG4gICAgICBjd2Q6IHRtcFJvb3QsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgIH0pKS5zb3J0KChhLCBiKSA9PiBhLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggLSBiLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpO1xuICAgIGlmIChzb3J0ZWRCdW5kbGVJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIG5vIGV4cGVjdGVkIHBhY2thZ2VzIGluIHRoZSB6aXBcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGAke3RoaXMub3B0cy5hcHB9IGRpZCBub3QgaGF2ZSBhbnkgb2YgJyR7U1VQUE9SVEVEX0VYVEVOU0lPTlMuam9pbignLCAnKX0nIGAgK1xuICAgICAgICBgZXh0ZW5zaW9uIHBhY2thZ2VzLiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBwcm92aWRlZCAuemlwIGFyY2hpdmUgY29udGFpbnMgYXQgbGVhc3Qgb25lIHZhbGlkIGFwcGxpY2F0aW9uIHBhY2thZ2UuYCk7XG4gICAgfVxuICAgIGNvbnN0IHVuemlwcGVkQXBwUGF0aCA9IHBhdGguam9pbih0bXBSb290LCBfLmZpcnN0KHNvcnRlZEJ1bmRsZUl0ZW1zKSk7XG4gICAgbG9nZ2VyLmRlYnVnKGAnJHt1bnppcHBlZEFwcFBhdGh9JyBpcyB0aGUgdW56aXBwZWQgZmlsZSBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgIHJldHVybiB1bnppcHBlZEFwcFBhdGg7XG4gIH1cblxuICBhc3luYyBvblBvc3RDb25maWd1cmVBcHAgKHtjYWNoZWRBcHBJbmZvLCBpc1VybCwgYXBwUGF0aH0pIHtcbiAgICBjb25zdCBwcmVzaWduQXBwID0gYXN5bmMgKGFwcExvY2F0aW9uKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRzLm5vU2lnbikge1xuICAgICAgICBsb2dnZXIuaW5mbygnU2tpcHBpbmcgYXBwbGljYXRpb24gc2lnbmluZyBiZWNhdXNlIG5vU2lnbiBjYXBhYmlsaXR5IGlzIHNldCB0byB0cnVlLiAnICtcbiAgICAgICAgICAnSGF2aW5nIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHdpdGggaW1wcm9wZXIgc2lnbmF0dXJlL25vbi1zaWduZWQgd2lsbCBjYXVzZSAnICtcbiAgICAgICAgICAnRXNwcmVzc28gYXV0b21hdGlvbiBzdGFydHVwIGZhaWx1cmUuJyk7XG4gICAgICB9IGVsc2UgaWYgKCFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwTG9jYXRpb24sIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaWduKGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhc0Fwa0V4dCA9IChhcHBQYXRoKSA9PiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQVBLX0VYVCk7XG4gICAgY29uc3QgaGFzQWFiRXh0ID0gKGFwcFBhdGgpID0+IF8uZW5kc1dpdGgoXy50b0xvd2VyKGFwcFBhdGgpLCBBQUJfRVhUKTtcbiAgICBjb25zdCBleHRyYWN0VW5pdmVyc2FsQXBrID0gYXN5bmMgKHNob3VsZEV4dHJhY3QsIGFwcFBhdGgpID0+XG4gICAgICBzaG91bGRFeHRyYWN0ID8gYXBwUGF0aCA6IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RVbml2ZXJzYWxBcGsoYXBwUGF0aCk7XG5cbiAgICBsZXQgcGF0aEluQ2FjaGUgPSBudWxsO1xuICAgIGxldCBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gZmFsc2U7XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChjYWNoZWRBcHBJbmZvKSkge1xuICAgICAgY29uc3QgcGFja2FnZUhhc2ggPSBhd2FpdCBmcy5oYXNoKGFwcFBhdGgpO1xuICAgICAgaWYgKHBhY2thZ2VIYXNoID09PSBjYWNoZWRBcHBJbmZvLnBhY2thZ2VIYXNoICYmIGF3YWl0IGZzLmV4aXN0cyhjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVXNpbmcgJyR7Y2FjaGVkQXBwSW5mby5mdWxsUGF0aH0nIHdoaWNoIGlzIGNhY2hlZCBmcm9tICcke2FwcFBhdGh9J2ApO1xuICAgICAgICBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gdHJ1ZTtcbiAgICAgICAgcGF0aEluQ2FjaGUgPSBjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFwcFBhdGggY2FuIGJlIC56aXAsIC5hcGsgb3IgLmFhYlxuICAgIGNvbnN0IGlzQXBrID0gaGFzQXBrRXh0KGFwcFBhdGgpO1xuICAgIC8vIE9ubHkgbG9jYWwgLmFwayBmaWxlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4tcGxhY2Ugc2hvdWxkIG5vdCBiZSBjYWNoZWRcbiAgICBjb25zdCBzaG91bGRSZXN1bHRBcHBQYXRoQmVDYWNoZWQgPSAhaXNBcGsgfHwgKGlzQXBrICYmIGlzVXJsKTtcblxuICAgIGlmICghaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCkge1xuICAgICAgaWYgKHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCkge1xuICAgICAgICAvLyAuemlwLCAuYWFiIG9yIGRvd25sb2FkZWQgLmFwa1xuXG4gICAgICAgIGxldCB1bnppcHBlZEFwcFBhdGg7XG4gICAgICAgIGxldCBpc1VuemlwcGVkQXBrID0gZmFsc2U7XG4gICAgICAgIGlmICghKGhhc0Fwa0V4dChhcHBQYXRoKSB8fCBoYXNBYWJFeHQoYXBwUGF0aCkpKSB7XG4gICAgICAgICAgdW56aXBwZWRBcHBQYXRoID0gYXdhaXQgdGhpcy51bnppcEFwcChhcHBQYXRoKTtcbiAgICAgICAgICBpc1VuemlwcGVkQXBrID0gaGFzQXBrRXh0KHVuemlwcGVkQXBwUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bnppcHBlZEFwcFBhdGggb3IgYXBwUGF0aCBoYXMgU1VQUE9SVEVEX0VYVEVOU0lPTlMuXG4gICAgICAgIHBhdGhJbkNhY2hlID0gdW56aXBwZWRBcHBQYXRoXG4gICAgICAgICAgPyBhd2FpdCBleHRyYWN0VW5pdmVyc2FsQXBrKGlzVW56aXBwZWRBcGssIHVuemlwcGVkQXBwUGF0aClcbiAgICAgICAgICA6IGF3YWl0IGV4dHJhY3RVbml2ZXJzYWxBcGsoaXNBcGssIGFwcFBhdGgpO1xuXG4gICAgICAgIGlmICghaXNBcGsgJiYgaXNVcmwpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgdGVtcG9yYXJpbHkgZG93bmxvYWRlZCAuYWFiIG9yIC56aXAgcGFja2FnZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQWFiRXh0KHVuemlwcGVkQXBwUGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBsb2NhbCB1bnppcHBlZCAuYWFiIGZpbGVcbiAgICAgICAgICBhd2FpdCBmcy5yaW1yYWYodW56aXBwZWRBcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKHBhdGhJbkNhY2hlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcGspIHtcbiAgICAgICAgLy8gSXQgaXMgcHJvYmFibHkgbm90IHRoZSBiZXN0IGlkZWEgdG8gbW9kaWZ5IHRoZSBwcm92aWRlZCBhcHAgaW4tcGxhY2UsXG4gICAgICAgIC8vIGJ1dCB0aGlzIGlzIGhvdyBpdCB3YXMgYWx3YXlzIHdvcmtpbmdcbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChhcHBQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA/IHthcHBQYXRoOiBwYXRoSW5DYWNoZX0gOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGxlIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICBsb2dnZXIuaW5mbygnYXZkIG5hbWUgZGVmaW5lZCwgaWdub3JpbmcgZGV2aWNlIG5hbWUgYW5kIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjYXBzLmRldmljZU5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBhZGRXaXBlRGF0YVRvQXZkQXJncyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuYXZkQXJncykge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgPSAnLXdpcGUtZGF0YSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyArPSAnIC13aXBlLWRhdGEnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gbXVjaCBvZiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgc3RhcnRFc3ByZXNzb1Nlc3Npb24gKCkge1xuICAgIGxvZ2dlci5pbmZvKGBFc3ByZXNzb0RyaXZlciB2ZXJzaW9uOiAke3ZlcnNpb259YCk7XG5cbiAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWFuZHJvaWQtZHJpdmVyL3B1bGwvNDYxIHdoYXQgaGFwcGVucyBpZiB0aGVyIGlzIG5vIHNldEhpZGRlbkFwaVBvbGljeSBmb3IgQW5kcm9pZCBQK1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgbG9nZ2VyLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHR1cm4gb2ZmIGFuaW1hdGlvbnM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZFxuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgZXNwcmVzc28gc2VydmVyIGV0Y1xuICAgIHRoaXMuaW5pdEVzcHJlc3NvU2VydmVyKCk7XG4gICAgLy8gRnVydGhlciBwcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgZXNwcmVzc28gcG9ydFxuICAgIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyBFc3ByZXNzbyBTZXJ2ZXIgcG9ydCAke0RFVklDRV9QT1JUfSB0byAke3RoaXMub3B0cy5zeXN0ZW1Qb3J0fWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0LCBERVZJQ0VfUE9SVCk7XG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYE5vdCB3YWl0aW5nIGZvciB0aGUgYXBwbGljYXRpb24gYWN0aXZpdHkgdG8gc3RhcnQgYmVjYXVzZSAnYXV0b0xhdW5jaCcgaXMgZGlzYWJsZWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGIud2FpdEZvckFjdGl2aXR5KHRoaXMuY2Fwcy5hcHBXYWl0UGFja2FnZSwgdGhpcy5jYXBzLmFwcFdhaXRBY3Rpdml0eSwgdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbik7XG4gICAgfVxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgYXdhaXQgdGhpcy5pbml0V2VidmlldygpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIGVzcHJlc3NvXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRXZWJ2aWV3ICgpIHtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGFuZHJvaWRDb21tYW5kcy5kZWZhdWx0V2Vidmlld05hbWUuY2FsbCh0aGlzKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgIGxvZ2dlci5pbmZvKGBTZXR0aW5nIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBpbml0RXNwcmVzc29TZXJ2ZXIgKCkge1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyBlc3ByZXNzbyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhXG4gICAgdGhpcy5lc3ByZXNzbyA9IG5ldyBFc3ByZXNzb1J1bm5lcih7XG4gICAgICBob3N0OiB0aGlzLm9wdHMucmVtb3RlQWRiSG9zdCB8fCB0aGlzLm9wdHMuaG9zdCB8fCAnMTI3LjAuMC4xJyxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZm9yY2VFc3ByZXNzb1JlYnVpbGQ6ICEhdGhpcy5vcHRzLmZvcmNlRXNwcmVzc29SZWJ1aWxkLFxuICAgICAgZXNwcmVzc29CdWlsZENvbmZpZzogdGhpcy5vcHRzLmVzcHJlc3NvQnVpbGRDb25maWcsXG4gICAgICBzaG93R3JhZGxlTG9nOiAhIXRoaXMub3B0cy5zaG93R3JhZGxlTG9nLFxuICAgICAgc2VydmVyTGF1bmNoVGltZW91dDogdGhpcy5vcHRzLmVzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCxcbiAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogdGhpcy5vcHRzLmFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIHNraXBTZXJ2ZXJJbnN0YWxsYXRpb246IHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uLFxuICAgICAgdXNlS2V5c3RvcmU6IHRoaXMub3B0cy51c2VLZXlzdG9yZSxcbiAgICAgIGtleXN0b3JlUGF0aDogdGhpcy5vcHRzLmtleXN0b3JlUGF0aCxcbiAgICAgIGtleXN0b3JlUGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgICAga2V5QWxpYXM6IHRoaXMub3B0cy5rZXlBbGlhcyxcbiAgICAgIGtleVBhc3N3b3JkOiB0aGlzLm9wdHMua2V5UGFzc3dvcmQsXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmVzcHJlc3NvLnByb3h5UmVxUmVzLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gICAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmVzcHJlc3NvLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMuZXNwcmVzc28pO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBzZXQgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSBmcm9tIHRoZSBhcGtcbiAgICAvLyBUT0RPOiBpbmNvcnBvcmF0ZSBjaGFuZ2VzIGZyb20gYXBwaXVtIzUzMDggd2hpY2ggZml4IGEgcmFjZSBjb25kLVxuICAgIC8vIGl0aW9uIGJ1ZyBpbiBvbGQgYXBwaXVtIGFuZCBuZWVkIHRvIGJlIHJlcGxpY2F0ZWQgaGVyZVxuICAgIC8vIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MoXG4gICAgLy8gICAgIHRoaXMub3B0cy5sYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFRFU1RfQVBLX1BLR11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24gY2FwYWJpbGl0eSBpcyBzZXQuIE5vdCBpbnN0YWxsaWcgZXNwcmVzc28tc2VydmVyICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmVzcHJlc3NvLmluc3RhbGxUZXN0QXBrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbm5vdCBhZGQgc2VydmVyIHBhY2thZ2VzIHRvIHRoZSBEb3plIHdoaXRlbGlzdC4gT3JpZ2luYWwgZXJyb3I6IGAgK1xuICAgICAgICAgIChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMuZXNwcmVzc28pIHtcbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRPRE8gYmVsb3cgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgaWYgKHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlc2V0IGFuaW1hdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiZcbiAgICAgICAgICB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldElNRSh0aGlzLmRlZmF1bHRJTUUpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsICYmICF0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRlVMTF9SRVNFVCBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuc3RvcExvZ2NhdCgpO1xuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSghIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRzLnN5c3RlbVBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZW1vdmUgcG9ydCBmb3J3YXJkICcke2Vycm9yLm1lc3NhZ2V9J2ApO1xuICAgICAgICAvL0lnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIGVzcHJlc3NvIHNlcnZlciBhbHJlYWR5XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgZXNwcmVzc28gc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG4gICAgLy8gd2UgYXJlIG1haW50YWluaW5nIHR3byBzZXRzIG9mIE5PX1BST1hZIGxpc3RzLCBvbmUgZm9yIGNocm9tZWRyaXZlcihDSFJPTUVfTk9fUFJPWFkpXG4gICAgLy8gYW5kIG9uZSBmb3IgRXNwcmVzc28oTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5pc05pbCh0aGlzLmNocm9tZWRyaXZlcikgPyBOT19QUk9YWSA6IENIUk9NRV9OT19QUk9YWTtcbiAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IFsuLi50aGlzLmp3cFByb3h5QXZvaWQsIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuICF0aGlzLm9wdHMuYXBwICYmIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIC8vIHdlIGRvIHNvbWUgZGlmZmVyZW50L3NwZWNpYWwgdGhpbmdzIHdpdGggdGhlc2UgbWV0aG9kc1xuICBpZiAoIV8uaW5jbHVkZXMoWydkZWZhdWx0V2Vidmlld05hbWUnXSwgY21kKSkge1xuICAgIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gIH1cbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgZXNwcmVzc28tc3BlY2lmaWMgY29tbWFuZHNcbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBFc3ByZXNzb0RyaXZlcjtcbiJdLCJmaWxlIjoibGliL2RyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
549
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiU1lTVEVNX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiQVBLX0VYVCIsIkFBQl9FWFQiLCJTVVBQT1JURURfRVhURU5TSU9OUyIsIkVzcHJlc3NvRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJlc3ByZXNzbyIsImp3cFByb3h5QWN0aXZlIiwiZGVmYXVsdElNRSIsImp3cFByb3h5QXZvaWQiLCJhcGtTdHJpbmdzIiwic2V0dGluZ3MiLCJEZXZpY2VTZXR0aW5ncyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsImNhcHMiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsIk9iamVjdCIsImFzc2lnbiIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsIl8iLCJkZWZhdWx0cyIsImlzQ2hyb21lU2Vzc2lvbiIsImFwcCIsImxvZyIsIndhcm4iLCJlcnJvckFuZFRocm93IiwicmVib290Iiwic2V0QXZkRnJvbUNhcGFiaWxpdGllcyIsImFkZFdpcGVEYXRhVG9BdmRBcmdzIiwic3lzdGVtUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJjb25maWd1cmVBcHAiLCJvblBvc3RQcm9jZXNzIiwib25Qb3N0Q29uZmlndXJlQXBwIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImFwcFBhY2thZ2UiLCJpc0FwcEluc3RhbGxlZCIsInN0YXJ0RXNwcmVzc29TZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJtZXNzYWdlIiwiZW5kc1dpdGgiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZXJyIiwic3RhY2siLCJ1bnppcEFwcCIsImFwcFBhdGgiLCJ1c2VTeXN0ZW1VbnppcEVudiIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwidG9Mb3dlciIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInppcCIsImV4dHJhY3RBbGxUbyIsImdsb2JQYXR0ZXJuIiwibWFwIiwiZXh0IiwicmVwbGFjZSIsImpvaW4iLCJzb3J0ZWRCdW5kbGVJdGVtcyIsImZzIiwiZ2xvYiIsImN3ZCIsInN0cmljdCIsInNvcnQiLCJhIiwiYiIsInNwbGl0IiwicGF0aCIsInNlcCIsImxlbmd0aCIsInVuemlwcGVkQXBwUGF0aCIsImZpcnN0IiwiZGVidWciLCJjYWNoZWRBcHBJbmZvIiwiaXNVcmwiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaGFzQXBrRXh0IiwiaGFzQWFiRXh0IiwiZXh0cmFjdFVuaXZlcnNhbEFwayIsInNob3VsZEV4dHJhY3QiLCJwYXRoSW5DYWNoZSIsImlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQiLCJpc1BsYWluT2JqZWN0IiwicGFja2FnZUhhc2giLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJpc0FwayIsInNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCIsImlzVW56aXBwZWRBcGsiLCJyaW1yYWYiLCJkcml2ZXJEYXRhIiwiaXNFbXVsYXRvciIsImF2ZCIsImRldmljZU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJhdmREZXZpY2UiLCJhdmRBcmdzIiwidG9Mb3dlckNhc2UiLCJ2ZXJzaW9uIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiaW5pdERldmljZSIsImlzQW5pbWF0aW9uT24iLCJzZXRBbmltYXRpb25TdGF0ZSIsIndhc0FuaW1hdGlvbkVuYWJsZWQiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RXNwcmVzc29TZXJ2ZXIiLCJmb3J3YXJkUG9ydCIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJpbml0QVVUIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsIkVzcHJlc3NvUnVubmVyIiwiaG9zdCIsInJlbW90ZUFkYkhvc3QiLCJkZXZpY2VQb3J0IiwiYXBrIiwidG1wRGlyIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2hvd0dyYWRsZUxvZyIsInNlcnZlckxhdW5jaFRpbWVvdXQiLCJlc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlSZXFSZXMiLCJwcm94eUNvbW1hbmQiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJURVNUX0FQS19QS0ciLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsInNraXBVbmluc3RhbGwiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiaW5zdGFsbFRlc3RBcGsiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJzdGRlcnIiLCJfc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJpZ24iLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsInN0b3BMb2djYXQiLCJhdmROYW1lIiwia2lsbEVtdWxhdG9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsInVuZGVmaW5lZCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZXJyb3IiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJpc05pbCIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJpc0Nocm9tZUJyb3dzZXIiLCJicm93c2VyTmFtZSIsImlzUGFja2FnZU9yQnVuZGxlIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwicHJvdG90eXBlIiwiY29tbWFuZHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUEsTUFBTUEsT0FBTyxHQUFHQyxtQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQTFCO0FBSUEsTUFBTUMsV0FBVyxHQUFHLElBQXBCO0FBTUEsTUFBTUMsUUFBUSxHQUFHLENBQ2YsQ0FBQyxLQUFELEVBQVEsSUFBSUMsTUFBSixDQUFXLG1CQUFYLENBQVIsQ0FEZSxFQUVmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxnREFBWCxDQUFSLENBRmUsRUFHZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBUixDQUhlLEVBSWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLCtDQUFYLENBQVIsQ0FKZSxFQUtmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpREFBWCxDQUFSLENBTGUsRUFNZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBUixDQU5lLEVBT2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLDJDQUFYLENBQVIsQ0FQZSxFQVFmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpQ0FBWCxDQUFSLENBUmUsRUFTZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBUixDQVRlLEVBVWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFB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Q0Q7O2VBR2NyUCxjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgZXJyb3JzLCBpc0Vycm9yVHlwZSwgRGV2aWNlU2V0dGluZ3N9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgRXNwcmVzc29SdW5uZXIsIFRFU1RfQVBLX1BLRyB9IGZyb20gJy4vZXNwcmVzc28tcnVubmVyJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCB6aXAgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCB9IGZyb20gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcic7XG5pbXBvcnQgZGVzaXJlZENhcENvbnN0cmFpbnRzIGZyb20gJy4vZGVzaXJlZC1jYXBzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby11bnJlc29sdmVkXG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBxdWFsaWZ5QWN0aXZpdHlOYW1lIH0gZnJvbSAnLi91dGlscyc7XG5cblxuLy8gVE9ETyBtZXJnZSBvdXIgb3duIGhlbHBlcnMgb250byB0aGlzIGxhdGVyXG5jb25zdCBoZWxwZXJzID0gYW5kcm9pZEhlbHBlcnM7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBFc3ByZXNzbyBIVFRQIHNlcnZlciBvbiB0aGUgZGV2aWNlXG5jb25zdCBTWVNURU1fUE9SVF9SQU5HRSA9IFs4MzAwLCA4Mzk5XTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBlc3ByZXNzbyBzZXJ2ZXIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsXG4vLyBmb3J3YXJkIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MTtcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiBOZWVkIHRvIHNlZ3JlZ2F0ZSB0aGUgcGF0aHMgYmV0dGVyIHdheSB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zIHdoZXJldmVyIGFwcGxpY2FibGUuXG4vLyAoTm90IHNlZ3JlZ2F0aW5nIHJpZ2h0IGF3YXkgYmVjYXVzZSBtb3JlIHBhdGhzIHRvIGJlIGFkZGVkIGluIHRoZSBOT19QUk9YWSBsaXN0KVxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uLyg/IS4qLyknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9jdXJyZW50X3BhY2thZ2UnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZGlzcGxheV9kZW5zaXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2lzX2tleWJvYXJkX3Nob3duJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV9iYXJzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV90aW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvYmFja2dyb3VuZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvY2xvc2UnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2xhdW5jaCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvcmVzZXQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3N0cmluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vY29tcGFyZV9pbWFnZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FjdGl2YXRlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX2luc3RhbGxlZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX3N0YXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9maW5nZXJfcHJpbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2luc3RhbGxfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19sb2NrZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2xvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcHVsbF9mb2xkZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1c2hfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcmVtb3ZlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2Uvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3Rlcm1pbmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3VubG9jaycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBDaHJvbWVkcml2ZXIuXG5jb25zdCBDSFJPTUVfTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9yZWN0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIG1vYmlsZTogY29tbWFuZHMgd29ya2luZyBpbiB3ZWIgY29udGV4dFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZSQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG5cbmNvbnN0IEFQS19FWFQgPSAnLmFwayc7XG5jb25zdCBBQUJfRVhUID0gJy5hYWInO1xuY29uc3QgU1VQUE9SVEVEX0VYVEVOU0lPTlMgPSBbQVBLX0VYVCwgQUFCX0VYVF07XG5cbmNsYXNzIEVzcHJlc3NvRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30sIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgICAvLyBgc2hlbGxgIG92ZXJ3cml0ZXMgYWRiLnNoZWxsLCBzbyByZW1vdmVcbiAgICBkZWxldGUgb3B0cy5zaGVsbDtcblxuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLmVzcHJlc3NvID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0SU1FID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcblxuICAgIHRoaXMuYXBrU3RyaW5ncyA9IHt9OyAvLyBtYXAgb2YgbGFuZ3VhZ2UgLT4gc3RyaW5ncyBvYmpcbiAgICB0aGlzLnNldHRpbmdzID0gbmV3IERldmljZVNldHRpbmdzKHt9LCB0aGlzLm9uU2V0dGluZ3NVcGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoLi4uYXJncykge1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBvdGhlclNlc3Npb25EYXRhIGZvciBtdWx0aXBsZSBzZXNzaW9uc1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jYXBzKVxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYXBzID0gT2JqZWN0LmFzc2lnbihzZXJ2ZXJEZXRhaWxzLCB0aGlzLmNhcHMpO1xuXG4gICAgICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogOTAwMDBcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGAnYnJvd3Nlck5hbWUnIGNhcGFiaWxpdHkgd2lsbCBiZSBpZ25vcmVkYCk7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgQ2hyb21lIGJyb3dzZXIgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBzZXNzaW9ucyBiZWNhdXNlIEVzcHJlc3NvIGF1dG9tYXRpb24gZG9lc24ndCBgICtcbiAgICAgICAgICAgICAgYGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgQ2hyb21lYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2hyb21lIGJyb3dzZXIgc2Vzc2lvbnMgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBiZWNhdXNlIEVzcHJlc3NvIGAgK1xuICAgICAgICAgICAgYGF1dG9tYXRpb24gZG9lc24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIENocm9tZWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgICAgdGhpcy5hZGRXaXBlRGF0YVRvQXZkQXJncygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdHMuc3lzdGVtUG9ydCA9IHRoaXMub3B0cy5zeXN0ZW1Qb3J0XG4gICAgICAgIHx8IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKFNZU1RFTV9QT1JUX1JBTkdFWzBdLCBTWVNURU1fUE9SVF9SQU5HRVsxXSk7XG4gICAgICB0aGlzLm9wdHMuYWRiUG9ydCA9IHRoaXMub3B0cy5hZGJQb3J0IHx8IERFRkFVTFRfQURCX1BPUlQ7XG4gICAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgICAgY29uc3Qge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcbiAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgb3VyIGphdmEgdmVyc2lvbiBhbmQgZGV2aWNlIGluZm8sIHdlIGNhbiBjcmVhdGUgb3VyXG4gICAgICAvLyBBREIgaW5zdGFuY2VcbiAgICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwge1xuICAgICAgICAgIG9uUG9zdFByb2Nlc3M6IHRoaXMub25Qb3N0Q29uZmlndXJlQXBwLmJpbmQodGhpcyksXG4gICAgICAgICAgc3VwcG9ydGVkRXh0ZW5zaW9uczogU1VQUE9SVEVEX0VYVEVOU0lPTlNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIHRoaXMubG9nLmluZm8oYEFwcCBmaWxlIHdhcyBub3QgbGlzdGVkLCBpbnN0ZWFkIHdlJ3JlIGdvaW5nIHRvIHJ1biBgICtcbiAgICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQodGhpcy5vcHRzLmFwcFBhY2thZ2UpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgdGhlIHBhY2thZ2UgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgIGBpbnN0YWxsZWQgb24gdGhlIGRldmljZWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRFc3ByZXNzb1Nlc3Npb24oKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCBjYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIGUubWVzc2FnZSArPSBgJHtfLmVuZHNXaXRoKGUubWVzc2FnZSwgJy4nKSA/ICcnIDogJy4nfSBDaGVjayBgICtcbiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWVzcHJlc3NvLWRyaXZlciN0cm91Ymxlc2hvb3RpbmcgJyArXG4gICAgICAgICdyZWdhcmRpbmcgYWR2YW5jZWQgc2Vzc2lvbiBzdGFydHVwIHRyb3VibGVzaG9vdGluZy4nO1xuICAgICAgaWYgKGlzRXJyb3JUeXBlKGUsIGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyID0gbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKGUubWVzc2FnZSk7XG4gICAgICBlcnIuc3RhY2sgPSBlLnN0YWNrO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnppcCB0aGUgZ2l2ZW4gYXBwIHBhdGggYW5kIHJldHVybiB0aGUgZmlyc3QgcGFja2FnZSB0aGF0IGhhcyBTVVBQT1JURURfRVhURU5TSU9OU1xuICAgKiBpbiB0aGUgYXJjaGl2ZWQgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggVGhlIHBhdGggdG8gYXBwIGZpbGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVucyB0aGUgcGF0aCB0byBhbiB1bnppcHBlZCBhcHAgZmlsZSBwYXRoLlxuICAgKiBAdGhyb3dzIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgemlwIGRpZCBub3QgaGF2ZSBhbnkgU1VQUE9SVEVEX0VYVEVOU0lPTlMgcGFja2FnZXMuXG4gICAqL1xuICBhc3luYyB1bnppcEFwcCAoYXBwUGF0aCkge1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwRW52ID0gcHJvY2Vzcy5lbnYuQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVA7XG4gICAgY29uc3QgdXNlU3lzdGVtVW56aXAgPSBfLmlzRW1wdHkodXNlU3lzdGVtVW56aXBFbnYpXG4gICAgICB8fCAhWycwJywgJ2ZhbHNlJ10uaW5jbHVkZXMoXy50b0xvd2VyKHVzZVN5c3RlbVVuemlwRW52KSk7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oYXBwUGF0aCwgdG1wUm9vdCwge3VzZVN5c3RlbVVuemlwfSk7XG5cbiAgICBjb25zdCBnbG9iUGF0dGVybiA9IGAqKi8qLisoJHtTVVBQT1JURURfRVhURU5TSU9OUy5tYXAoKGV4dCkgPT4gZXh0LnJlcGxhY2UoL15cXC4vLCAnJykpLmpvaW4oJ3wnKX0pYDtcbiAgICBjb25zdCBzb3J0ZWRCdW5kbGVJdGVtcyA9IChhd2FpdCBmcy5nbG9iKGdsb2JQYXR0ZXJuLCB7XG4gICAgICBjd2Q6IHRtcFJvb3QsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgIH0pKS5zb3J0KChhLCBiKSA9PiBhLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggLSBiLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpO1xuICAgIGlmIChzb3J0ZWRCdW5kbGVJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIG5vIGV4cGVjdGVkIHBhY2thZ2VzIGluIHRoZSB6aXBcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYCR7dGhpcy5vcHRzLmFwcH0gZGlkIG5vdCBoYXZlIGFueSBvZiAnJHtTVVBQT1JURURfRVhURU5TSU9OUy5qb2luKCcsICcpfScgYCArXG4gICAgICAgIGBleHRlbnNpb24gcGFja2FnZXMuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIHByb3ZpZGVkIC56aXAgYXJjaGl2ZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdmFsaWQgYXBwbGljYXRpb24gcGFja2FnZS5gKTtcbiAgICB9XG4gICAgY29uc3QgdW56aXBwZWRBcHBQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsIF8uZmlyc3Qoc29ydGVkQnVuZGxlSXRlbXMpKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgJyR7dW56aXBwZWRBcHBQYXRofScgaXMgdGhlIHVuemlwcGVkIGZpbGUgZnJvbSAnJHthcHBQYXRofSdgKTtcbiAgICByZXR1cm4gdW56aXBwZWRBcHBQYXRoO1xuICB9XG5cbiAgYXN5bmMgb25Qb3N0Q29uZmlndXJlQXBwICh7Y2FjaGVkQXBwSW5mbywgaXNVcmwsIGFwcFBhdGh9KSB7XG4gICAgY29uc3QgcHJlc2lnbkFwcCA9IGFzeW5jIChhcHBMb2NhdGlvbikgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1NpZ24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU2tpcHBpbmcgYXBwbGljYXRpb24gc2lnbmluZyBiZWNhdXNlIG5vU2lnbiBjYXBhYmlsaXR5IGlzIHNldCB0byB0cnVlLiAnICtcbiAgICAgICAgICAnSGF2aW5nIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHdpdGggaW1wcm9wZXIgc2lnbmF0dXJlL25vbi1zaWduZWQgd2lsbCBjYXVzZSAnICtcbiAgICAgICAgICAnRXNwcmVzc28gYXV0b21hdGlvbiBzdGFydHVwIGZhaWx1cmUuJyk7XG4gICAgICB9IGVsc2UgaWYgKCFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwTG9jYXRpb24sIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaWduKGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhc0Fwa0V4dCA9IChhcHBQYXRoKSA9PiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQVBLX0VYVCk7XG4gICAgY29uc3QgaGFzQWFiRXh0ID0gKGFwcFBhdGgpID0+IF8uZW5kc1dpdGgoXy50b0xvd2VyKGFwcFBhdGgpLCBBQUJfRVhUKTtcbiAgICBjb25zdCBleHRyYWN0VW5pdmVyc2FsQXBrID0gYXN5bmMgKHNob3VsZEV4dHJhY3QsIGFwcFBhdGgpID0+XG4gICAgICBzaG91bGRFeHRyYWN0ID8gYXBwUGF0aCA6IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RVbml2ZXJzYWxBcGsoYXBwUGF0aCk7XG5cbiAgICBsZXQgcGF0aEluQ2FjaGUgPSBudWxsO1xuICAgIGxldCBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gZmFsc2U7XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChjYWNoZWRBcHBJbmZvKSkge1xuICAgICAgY29uc3QgcGFja2FnZUhhc2ggPSBhd2FpdCBmcy5oYXNoKGFwcFBhdGgpO1xuICAgICAgaWYgKHBhY2thZ2VIYXNoID09PSBjYWNoZWRBcHBJbmZvLnBhY2thZ2VIYXNoICYmIGF3YWl0IGZzLmV4aXN0cyhjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyAnJHtjYWNoZWRBcHBJbmZvLmZ1bGxQYXRofScgd2hpY2ggaXMgY2FjaGVkIGZyb20gJyR7YXBwUGF0aH0nYCk7XG4gICAgICAgIGlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQgPSB0cnVlO1xuICAgICAgICBwYXRoSW5DYWNoZSA9IGNhY2hlZEFwcEluZm8uZnVsbFBhdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwUGF0aCBjYW4gYmUgLnppcCwgLmFwayBvciAuYWFiXG4gICAgY29uc3QgaXNBcGsgPSBoYXNBcGtFeHQoYXBwUGF0aCk7XG4gICAgLy8gT25seSBsb2NhbCAuYXBrIGZpbGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbi1wbGFjZSBzaG91bGQgbm90IGJlIGNhY2hlZFxuICAgIGNvbnN0IHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA9ICFpc0FwayB8fCAoaXNBcGsgJiYgaXNVcmwpO1xuXG4gICAgaWYgKCFpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkKSB7XG4gICAgICBpZiAoc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkKSB7XG4gICAgICAgIC8vIC56aXAsIC5hYWIgb3IgZG93bmxvYWRlZCAuYXBrXG5cbiAgICAgICAgbGV0IHVuemlwcGVkQXBwUGF0aDtcbiAgICAgICAgbGV0IGlzVW56aXBwZWRBcGsgPSBmYWxzZTtcbiAgICAgICAgaWYgKCEoaGFzQXBrRXh0KGFwcFBhdGgpIHx8IGhhc0FhYkV4dChhcHBQYXRoKSkpIHtcbiAgICAgICAgICB1bnppcHBlZEFwcFBhdGggPSBhd2FpdCB0aGlzLnVuemlwQXBwKGFwcFBhdGgpO1xuICAgICAgICAgIGlzVW56aXBwZWRBcGsgPSBoYXNBcGtFeHQodW56aXBwZWRBcHBQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVuemlwcGVkQXBwUGF0aCBvciBhcHBQYXRoIGhhcyBTVVBQT1JURURfRVhURU5TSU9OUy5cbiAgICAgICAgcGF0aEluQ2FjaGUgPSB1bnppcHBlZEFwcFBhdGhcbiAgICAgICAgICA/IGF3YWl0IGV4dHJhY3RVbml2ZXJzYWxBcGsoaXNVbnppcHBlZEFwaywgdW56aXBwZWRBcHBQYXRoKVxuICAgICAgICAgIDogYXdhaXQgZXh0cmFjdFVuaXZlcnNhbEFwayhpc0FwaywgYXBwUGF0aCk7XG5cbiAgICAgICAgaWYgKCFpc0FwayAmJiBpc1VybCkge1xuICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSB0ZW1wb3JhcmlseSBkb3dubG9hZGVkIC5hYWIgb3IgLnppcCBwYWNrYWdlXG4gICAgICAgICAgYXdhaXQgZnMucmltcmFmKGFwcFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNBYWJFeHQodW56aXBwZWRBcHBQYXRoKSkge1xuICAgICAgICAgIC8vIENsZWFudXAgdGhlIGxvY2FsIHVuemlwcGVkIC5hYWIgZmlsZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZih1bnppcHBlZEFwcFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHByZXNpZ25BcHAocGF0aEluQ2FjaGUpO1xuICAgICAgfSBlbHNlIGlmIChpc0Fwaykge1xuICAgICAgICAvLyBJdCBpcyBwcm9iYWJseSBub3QgdGhlIGJlc3QgaWRlYSB0byBtb2RpZnkgdGhlIHByb3ZpZGVkIGFwcCBpbi1wbGFjZSxcbiAgICAgICAgLy8gYnV0IHRoaXMgaXMgaG93IGl0IHdhcyBhbHdheXMgd29ya2luZ1xuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKGFwcFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkID8ge2FwcFBhdGg6IHBhdGhJbkNhY2hlfSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGRyaXZlckRhdGEgKCkge1xuICAgIC8vIFRPRE8gZmlsbGUgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gdGhpcyBtZXRob2QgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMi1kcml2ZXI7IGNvbnNvbGlkYXRlXG4gIGFkZFdpcGVEYXRhVG9BdmRBcmdzICgpIHtcbiAgICBpZiAoIXRoaXMub3B0cy5hdmRBcmdzKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyA9ICctd2lwZS1kYXRhJztcbiAgICB9IGVsc2UgaWYgKCF0aGlzLm9wdHMuYXZkQXJncy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCctd2lwZS1kYXRhJykpIHtcbiAgICAgIHRoaXMub3B0cy5hdmRBcmdzICs9ICcgLXdpcGUtZGF0YSc7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyBtdWNoIG9mIHRoaXMgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICBhc3luYyBzdGFydEVzcHJlc3NvU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgRXNwcmVzc29Ecml2ZXIgdmVyc2lvbjogJHt2ZXJzaW9ufWApO1xuXG4gICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1hbmRyb2lkLWRyaXZlci9wdWxsLzQ2MSB3aGF0IGhhcHBlbnMgaWYgdGhlciBpcyBubyBzZXRIaWRkZW5BcGlQb2xpY3kgZm9yIEFuZHJvaWQgUCtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIHRoaXMubG9nLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdHVybiBvZmYgYW5pbWF0aW9uczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBlc3ByZXNzbyBzZXJ2ZXIgZXRjXG4gICAgdGhpcy5pbml0RXNwcmVzc29TZXJ2ZXIoKTtcbiAgICAvLyBGdXJ0aGVyIHByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBlc3ByZXNzbyBwb3J0XG4gICAgdGhpcy5sb2cuZGVidWcoYEZvcndhcmRpbmcgRXNwcmVzc28gU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gJHt0aGlzLm9wdHMuc3lzdGVtUG9ydH1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCwgREVWSUNFX1BPUlQpO1xuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IHdhaXRpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbiBhY3Rpdml0eSB0byBzdGFydCBiZWNhdXNlICdhdXRvTGF1bmNoJyBpcyBkaXNhYmxlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkodGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlLCB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRXZWJ2aWV3KCk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gZXNwcmVzc29cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdFdlYnZpZXcgKCkge1xuICAgIGNvbnN0IHZpZXdOYW1lID0gYW5kcm9pZENvbW1hbmRzLmRlZmF1bHRXZWJ2aWV3TmFtZS5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgaW5pdEVzcHJlc3NvU2VydmVyICgpIHtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHBhY2thZ2UgYW5kIGFjdGl2aXR5LCB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gICAgLy8gZXNwcmVzc28gd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGF0YVxuICAgIHRoaXMuZXNwcmVzc28gPSBuZXcgRXNwcmVzc29SdW5uZXIodGhpcy5sb2csIHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8ICcxMjcuMC4wLjEnLFxuICAgICAgc3lzdGVtUG9ydDogdGhpcy5vcHRzLnN5c3RlbVBvcnQsXG4gICAgICBkZXZpY2VQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgIGFkYjogdGhpcy5hZGIsXG4gICAgICBhcGs6IHRoaXMub3B0cy5hcHAsXG4gICAgICB0bXBEaXI6IHRoaXMub3B0cy50bXBEaXIsXG4gICAgICBhcHBQYWNrYWdlOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgIGFwcEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICBmb3JjZUVzcHJlc3NvUmVidWlsZDogISF0aGlzLm9wdHMuZm9yY2VFc3ByZXNzb1JlYnVpbGQsXG4gICAgICBlc3ByZXNzb0J1aWxkQ29uZmlnOiB0aGlzLm9wdHMuZXNwcmVzc29CdWlsZENvbmZpZyxcbiAgICAgIHNob3dHcmFkbGVMb2c6ICEhdGhpcy5vcHRzLnNob3dHcmFkbGVMb2csXG4gICAgICBzZXJ2ZXJMYXVuY2hUaW1lb3V0OiB0aGlzLm9wdHMuZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0LFxuICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiB0aGlzLm9wdHMuYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgc2tpcFNlcnZlckluc3RhbGxhdGlvbjogdGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24sXG4gICAgICB1c2VLZXlzdG9yZTogdGhpcy5vcHRzLnVzZUtleXN0b3JlLFxuICAgICAga2V5c3RvcmVQYXRoOiB0aGlzLm9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAga2V5c3RvcmVQYXNzd29yZDogdGhpcy5vcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICBrZXlBbGlhczogdGhpcy5vcHRzLmtleUFsaWFzLFxuICAgICAga2V5UGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlQYXNzd29yZCxcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgfSk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZXNwcmVzc28ucHJveHlSZXFSZXMuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuZXNwcmVzc28ucHJveHlDb21tYW5kLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHNldCB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIGZyb20gdGhlIGFwa1xuICAgIC8vIFRPRE86IGluY29ycG9yYXRlIGNoYW5nZXMgZnJvbSBhcHBpdW0jNTMwOCB3aGljaCBmaXggYSByYWNlIGNvbmQtXG4gICAgLy8gaXRpb24gYnVnIGluIG9sZCBhcHBpdW0gYW5kIG5lZWQgdG8gYmUgcmVwbGljYXRlZCBoZXJlXG4gICAgLy8gdGhpcy5hcGtTdHJpbmdzW3RoaXMub3B0cy5sYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhcbiAgICAvLyAgICAgdGhpcy5vcHRzLmxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1Zygnc2tpcFNlcnZlckluc3RhbGxhdGlvbiBjYXBhYmlsaXR5IGlzIHNldC4gTm90IGluc3RhbGxpZyBlc3ByZXNzby1zZXJ2ZXIgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uaW5zdGFsbFRlc3RBcGsoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdChTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMuZXNwcmVzc28pIHtcbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRPRE8gYmVsb3cgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgaWYgKHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVzZXQgYW5pbWF0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJlxuICAgICAgICAgIHRoaXMuZGVmYXVsdElNRSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgUmVzZXR0aW5nIElNRSB0byAnJHt0aGlzLmRlZmF1bHRJTUV9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UgJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgRlVMTF9SRVNFVCBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuc3RvcExvZ2NhdCgpO1xuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBjbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIHRoZSBkZXZpY2UgZGVmYXVsdCBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBzdXBlci5kZWxldGVTZXNzaW9uKCk7XG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgcG9ydCBmb3J3YXJkICcke2Vycm9yLm1lc3NhZ2V9J2ApO1xuICAgICAgICAvL0lnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIGVzcHJlc3NvIHNlcnZlciBhbHJlYWR5XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgZXNwcmVzc28gc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG4gICAgLy8gd2UgYXJlIG1haW50YWluaW5nIHR3byBzZXRzIG9mIE5PX1BST1hZIGxpc3RzLCBvbmUgZm9yIGNocm9tZWRyaXZlcihDSFJPTUVfTk9fUFJPWFkpXG4gICAgLy8gYW5kIG9uZSBmb3IgRXNwcmVzc28oTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5pc05pbCh0aGlzLmNocm9tZWRyaXZlcikgPyBOT19QUk9YWSA6IENIUk9NRV9OT19QUk9YWTtcbiAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IFsuLi50aGlzLmp3cFByb3h5QXZvaWQsIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuICF0aGlzLm9wdHMuYXBwICYmIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIC8vIHdlIGRvIHNvbWUgZGlmZmVyZW50L3NwZWNpYWwgdGhpbmdzIHdpdGggdGhlc2UgbWV0aG9kc1xuICBpZiAoIV8uaW5jbHVkZXMoWydkZWZhdWx0V2Vidmlld05hbWUnXSwgY21kKSkge1xuICAgIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gIH1cbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgZXNwcmVzc28tc3BlY2lmaWMgY29tbWFuZHNcbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBFc3ByZXNzb0RyaXZlcjtcbiJdLCJmaWxlIjoibGliL2RyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|