appium-espresso-driver 2.1.1 → 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 +80 -46
- package/build/lib/espresso-runner.js +41 -66
- package/build/lib/server-builder.js +12 -21
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/espresso-server/app/build.gradle.kts +12 -10
- package/espresso-server/build.gradle.kts +9 -8
- package/lib/commands/general.js +6 -9
- package/lib/driver.js +96 -36
- package/lib/espresso-runner.js +40 -39
- package/lib/server-builder.js +12 -13
- package/npm-shrinkwrap.json +1221 -1533
- package/package.json +2 -2
package/build/lib/driver.js
CHANGED
|
@@ -11,14 +11,14 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
+
var _path = _interopRequireDefault(require("path"));
|
|
15
|
+
|
|
14
16
|
var _baseDriver = require("@appium/base-driver");
|
|
15
17
|
|
|
16
18
|
var _espressoRunner = require("./espresso-runner");
|
|
17
19
|
|
|
18
20
|
var _support = require("@appium/support");
|
|
19
21
|
|
|
20
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
21
|
-
|
|
22
22
|
var _commands = _interopRequireDefault(require("./commands"));
|
|
23
23
|
|
|
24
24
|
var _appiumAdb = require("appium-adb");
|
|
@@ -40,6 +40,9 @@ const SYSTEM_PORT_RANGE = [8300, 8399];
|
|
|
40
40
|
const DEVICE_PORT = 6791;
|
|
41
41
|
const NO_PROXY = [['GET', new RegExp('^/session/(?!.*/)')], ['GET', new RegExp('^/session/[^/]+/appium/device/current_activity')], ['GET', new RegExp('^/session/[^/]+/appium/device/current_package')], ['GET', new RegExp('^/session/[^/]+/appium/device/display_density')], ['GET', new RegExp('^/session/[^/]+/appium/device/is_keyboard_shown')], ['GET', new RegExp('^/session/[^/]+/appium/device/system_bars')], ['GET', new RegExp('^/session/[^/]+/appium/device/system_time')], ['GET', new RegExp('^/session/[^/]+/appium/settings')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/contexts')], ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['GET', new RegExp('^/session/[^/]+/timeouts')], ['GET', new RegExp('^/session/[^/]+/url')], ['POST', new RegExp('^/session/[^/]+/appium/app/background')], ['POST', new RegExp('^/session/[^/]+/appium/app/close')], ['POST', new RegExp('^/session/[^/]+/appium/app/launch')], ['POST', new RegExp('^/session/[^/]+/appium/app/reset')], ['POST', new RegExp('^/session/[^/]+/appium/app/strings')], ['POST', new RegExp('^/session/[^/]+/appium/compare_images')], ['POST', new RegExp('^/session/[^/]+/appium/device/activate_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/app_installed')], ['POST', new RegExp('^/session/[^/]+/appium/device/app_state')], ['POST', new RegExp('^/session/[^/]+/appium/device/finger_print')], ['POST', new RegExp('^/session/[^/]+/appium/device/get_clipboard')], ['POST', new RegExp('^/session/[^/]+/appium/device/install_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/is_locked')], ['POST', new RegExp('^/session/[^/]+/appium/device/lock')], ['POST', new RegExp('^/session/[^/]+/appium/device/pull_file')], ['POST', new RegExp('^/session/[^/]+/appium/device/pull_folder')], ['POST', new RegExp('^/session/[^/]+/appium/device/push_file')], ['POST', new RegExp('^/session/[^/]+/appium/device/remove_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/start_activity')], ['POST', new RegExp('^/session/[^/]+/appium/device/terminate_app')], ['POST', new RegExp('^/session/[^/]+/appium/device/unlock')], ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')], ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')], ['POST', new RegExp('^/session/[^/]+/appium/settings')], ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')], ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')], ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute/async')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['POST', new RegExp('^/session/[^/]+/execute_async')], ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')], ['POST', new RegExp('^/session/[^/]+/location')], ['POST', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/timeouts')], ['POST', new RegExp('^/session/[^/]+/url')], ['GET', new RegExp('^/session/[^/]+/log/types')], ['POST', new RegExp('^/session/[^/]+/log')], ['GET', new RegExp('^/session/[^/]+/se/log/types')], ['POST', new RegExp('^/session/[^/]+/se/log')]];
|
|
42
42
|
const CHROME_NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/execute$')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/log/types')], ['POST', new RegExp('^/session/[^/]+/log')], ['GET', new RegExp('^/session/[^/]+/se/log/types')], ['POST', new RegExp('^/session/[^/]+/se/log')]];
|
|
43
|
+
const APK_EXT = '.apk';
|
|
44
|
+
const AAB_EXT = '.aab';
|
|
45
|
+
const SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];
|
|
43
46
|
|
|
44
47
|
class EspressoDriver extends _baseDriver.BaseDriver {
|
|
45
48
|
constructor(opts = {}, shouldValidateCaps = true) {
|
|
@@ -84,11 +87,10 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
84
87
|
|
|
85
88
|
if (this.isChromeSession) {
|
|
86
89
|
if (this.opts.app) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
_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`);
|
|
90
92
|
} else {
|
|
91
|
-
|
|
93
|
+
this.log.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` + `automation doesn't have permission to access Chrome`);
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
|
|
@@ -110,13 +112,13 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
110
112
|
if (this.opts.app) {
|
|
111
113
|
this.opts.app = await this.helpers.configureApp(this.opts.app, {
|
|
112
114
|
onPostProcess: this.onPostConfigureApp.bind(this),
|
|
113
|
-
supportedExtensions:
|
|
115
|
+
supportedExtensions: SUPPORTED_EXTENSIONS
|
|
114
116
|
});
|
|
115
117
|
} else if (this.appOnDevice) {
|
|
116
|
-
|
|
118
|
+
this.log.info(`App file was not listed, instead we're going to run ` + `${this.opts.appPackage} directly on the device`);
|
|
117
119
|
|
|
118
120
|
if (!(await this.adb.isAppInstalled(this.opts.appPackage))) {
|
|
119
|
-
|
|
121
|
+
this.log.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` + `installed on the device`);
|
|
120
122
|
}
|
|
121
123
|
}
|
|
122
124
|
|
|
@@ -136,6 +138,29 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
136
138
|
}
|
|
137
139
|
}
|
|
138
140
|
|
|
141
|
+
async unzipApp(appPath) {
|
|
142
|
+
const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
|
|
143
|
+
const useSystemUnzip = _lodash.default.isEmpty(useSystemUnzipEnv) || !['0', 'false'].includes(_lodash.default.toLower(useSystemUnzipEnv));
|
|
144
|
+
const tmpRoot = await _support.tempDir.openDir();
|
|
145
|
+
await _support.zip.extractAllTo(appPath, tmpRoot, {
|
|
146
|
+
useSystemUnzip
|
|
147
|
+
});
|
|
148
|
+
const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map(ext => ext.replace(/^\./, '')).join('|')})`;
|
|
149
|
+
const sortedBundleItems = (await _support.fs.glob(globPattern, {
|
|
150
|
+
cwd: tmpRoot,
|
|
151
|
+
strict: false
|
|
152
|
+
})).sort((a, b) => a.split(_path.default.sep).length - b.split(_path.default.sep).length);
|
|
153
|
+
|
|
154
|
+
if (sortedBundleItems.length === 0) {
|
|
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.`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const unzippedAppPath = _path.default.join(tmpRoot, _lodash.default.first(sortedBundleItems));
|
|
159
|
+
|
|
160
|
+
this.log.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);
|
|
161
|
+
return unzippedAppPath;
|
|
162
|
+
}
|
|
163
|
+
|
|
139
164
|
async onPostConfigureApp({
|
|
140
165
|
cachedAppInfo,
|
|
141
166
|
isUrl,
|
|
@@ -143,15 +168,18 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
143
168
|
}) {
|
|
144
169
|
const presignApp = async appLocation => {
|
|
145
170
|
if (this.opts.noSign) {
|
|
146
|
-
|
|
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.');
|
|
147
172
|
} else if (!(await this.adb.checkApkCert(appLocation, this.opts.appPackage))) {
|
|
148
173
|
await this.adb.sign(appLocation, this.opts.appPackage);
|
|
149
174
|
}
|
|
150
175
|
};
|
|
151
176
|
|
|
152
|
-
const
|
|
177
|
+
const hasApkExt = appPath => _lodash.default.endsWith(_lodash.default.toLower(appPath), APK_EXT);
|
|
178
|
+
|
|
179
|
+
const hasAabExt = appPath => _lodash.default.endsWith(_lodash.default.toLower(appPath), AAB_EXT);
|
|
180
|
+
|
|
181
|
+
const extractUniversalApk = async (shouldExtract, appPath) => shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);
|
|
153
182
|
|
|
154
|
-
const shouldResultAppPathBeCached = !isApk || isApk && isUrl;
|
|
155
183
|
let pathInCache = null;
|
|
156
184
|
let isResultAppPathAlreadyCached = false;
|
|
157
185
|
|
|
@@ -159,19 +187,35 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
159
187
|
const packageHash = await _support.fs.hash(appPath);
|
|
160
188
|
|
|
161
189
|
if (packageHash === cachedAppInfo.packageHash && (await _support.fs.exists(cachedAppInfo.fullPath))) {
|
|
190
|
+
this.log.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);
|
|
162
191
|
isResultAppPathAlreadyCached = true;
|
|
163
192
|
pathInCache = cachedAppInfo.fullPath;
|
|
164
193
|
}
|
|
165
194
|
}
|
|
166
195
|
|
|
196
|
+
const isApk = hasApkExt(appPath);
|
|
197
|
+
const shouldResultAppPathBeCached = !isApk || isApk && isUrl;
|
|
198
|
+
|
|
167
199
|
if (!isResultAppPathAlreadyCached) {
|
|
168
200
|
if (shouldResultAppPathBeCached) {
|
|
169
|
-
|
|
201
|
+
let unzippedAppPath;
|
|
202
|
+
let isUnzippedApk = false;
|
|
203
|
+
|
|
204
|
+
if (!(hasApkExt(appPath) || hasAabExt(appPath))) {
|
|
205
|
+
unzippedAppPath = await this.unzipApp(appPath);
|
|
206
|
+
isUnzippedApk = hasApkExt(unzippedAppPath);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
pathInCache = unzippedAppPath ? await extractUniversalApk(isUnzippedApk, unzippedAppPath) : await extractUniversalApk(isApk, appPath);
|
|
170
210
|
|
|
171
211
|
if (!isApk && isUrl) {
|
|
172
212
|
await _support.fs.rimraf(appPath);
|
|
173
213
|
}
|
|
174
214
|
|
|
215
|
+
if (hasAabExt(unzippedAppPath)) {
|
|
216
|
+
await _support.fs.rimraf(unzippedAppPath);
|
|
217
|
+
}
|
|
218
|
+
|
|
175
219
|
await presignApp(pathInCache);
|
|
176
220
|
} else if (isApk) {
|
|
177
221
|
await presignApp(appPath);
|
|
@@ -193,14 +237,14 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
193
237
|
|
|
194
238
|
setAvdFromCapabilities(caps) {
|
|
195
239
|
if (this.opts.avd) {
|
|
196
|
-
|
|
240
|
+
this.log.info('avd name defined, ignoring device name and platform version');
|
|
197
241
|
} else {
|
|
198
242
|
if (!caps.deviceName) {
|
|
199
|
-
|
|
243
|
+
this.log.errorAndThrow('avd or deviceName should be specified when reboot option is enables');
|
|
200
244
|
}
|
|
201
245
|
|
|
202
246
|
if (!caps.platformVersion) {
|
|
203
|
-
|
|
247
|
+
this.log.errorAndThrow('avd or platformVersion should be specified when reboot option is enabled');
|
|
204
248
|
}
|
|
205
249
|
|
|
206
250
|
let avdDevice = caps.deviceName.replace(/[^a-zA-Z0-9_.]/g, '-');
|
|
@@ -217,11 +261,10 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
217
261
|
}
|
|
218
262
|
|
|
219
263
|
async startEspressoSession() {
|
|
220
|
-
|
|
264
|
+
this.log.info(`EspressoDriver version: ${_package.version}`);
|
|
221
265
|
|
|
222
266
|
if ((await this.adb.getApiLevel()) >= 28) {
|
|
223
|
-
|
|
224
|
-
|
|
267
|
+
this.log.warn('Relaxing hidden api policy');
|
|
225
268
|
await this.adb.setHiddenApiPolicy('1', !!this.opts.ignoreHiddenApiPolicyError);
|
|
226
269
|
}
|
|
227
270
|
|
|
@@ -240,22 +283,20 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
240
283
|
await this.adb.setAnimationState(false);
|
|
241
284
|
this.wasAnimationEnabled = true;
|
|
242
285
|
} catch (err) {
|
|
243
|
-
|
|
286
|
+
this.log.warn(`Unable to turn off animations: ${err.message}`);
|
|
244
287
|
}
|
|
245
288
|
}
|
|
246
289
|
|
|
247
290
|
this.caps.deviceName = this.adb.curDeviceId;
|
|
248
291
|
this.caps.deviceUDID = this.opts.udid;
|
|
249
292
|
this.initEspressoServer();
|
|
250
|
-
|
|
251
|
-
_logger.default.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);
|
|
252
|
-
|
|
293
|
+
this.log.debug(`Forwarding Espresso Server port ${DEVICE_PORT} to ${this.opts.systemPort}`);
|
|
253
294
|
await this.adb.forwardPort(this.opts.systemPort, DEVICE_PORT);
|
|
254
295
|
|
|
255
296
|
if (!this.opts.skipUnlock) {
|
|
256
297
|
await helpers.unlock(this, this.adb, this.caps);
|
|
257
298
|
} else {
|
|
258
|
-
|
|
299
|
+
this.log.debug(`'skipUnlock' capability set, so skipping device unlock`);
|
|
259
300
|
}
|
|
260
301
|
|
|
261
302
|
await this.initAUT();
|
|
@@ -283,7 +324,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
283
324
|
await this.espresso.startSession(this.caps);
|
|
284
325
|
|
|
285
326
|
if (this.caps.autoLaunch === false) {
|
|
286
|
-
|
|
327
|
+
this.log.info(`Not waiting for the application activity to start because 'autoLaunch' is disabled`);
|
|
287
328
|
} else {
|
|
288
329
|
await this.adb.waitForActivity(this.caps.appWaitPackage, this.caps.appWaitActivity, this.opts.appWaitDuration);
|
|
289
330
|
}
|
|
@@ -300,9 +341,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
300
341
|
const viewName = _appiumAndroidDriver.androidCommands.defaultWebviewName.call(this);
|
|
301
342
|
|
|
302
343
|
const timeout = this.opts.autoWebviewTimeout || 2000;
|
|
303
|
-
|
|
304
|
-
_logger.default.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);
|
|
305
|
-
|
|
344
|
+
this.log.info(`Setting webview to context '${viewName}' with timeout ${timeout}ms`);
|
|
306
345
|
await (0, _asyncbox.retryInterval)(timeout / 500, 500, this.setContext.bind(this), viewName);
|
|
307
346
|
}
|
|
308
347
|
|
|
@@ -324,7 +363,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
324
363
|
}
|
|
325
364
|
|
|
326
365
|
initEspressoServer() {
|
|
327
|
-
this.espresso = new _espressoRunner.EspressoRunner({
|
|
366
|
+
this.espresso = new _espressoRunner.EspressoRunner(this.log, {
|
|
328
367
|
host: this.opts.remoteAdbHost || this.opts.host || '127.0.0.1',
|
|
329
368
|
systemPort: this.opts.systemPort,
|
|
330
369
|
devicePort: DEVICE_PORT,
|
|
@@ -357,10 +396,10 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
357
396
|
|
|
358
397
|
if (!this.opts.app) {
|
|
359
398
|
if (this.opts.fullReset) {
|
|
360
|
-
|
|
399
|
+
this.log.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
|
|
361
400
|
}
|
|
362
401
|
|
|
363
|
-
|
|
402
|
+
this.log.debug('No app capability. Assuming it is already on the device');
|
|
364
403
|
|
|
365
404
|
if (this.opts.fastReset) {
|
|
366
405
|
await helpers.resetApp(this.adb, this.opts);
|
|
@@ -376,20 +415,20 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
376
415
|
}
|
|
377
416
|
|
|
378
417
|
if (this.opts.skipServerInstallation) {
|
|
379
|
-
|
|
418
|
+
this.log.debug('skipServerInstallation capability is set. Not installig espresso-server ');
|
|
380
419
|
} else {
|
|
381
420
|
await this.espresso.installTestApk();
|
|
382
421
|
|
|
383
422
|
try {
|
|
384
423
|
await this.adb.addToDeviceIdleWhitelist(_appiumAndroidDriver.SETTINGS_HELPER_PKG_ID, _espressoRunner.TEST_APK_PKG);
|
|
385
424
|
} catch (e) {
|
|
386
|
-
|
|
425
|
+
this.log.warn(`Cannot add server packages to the Doze whitelist. Original error: ` + (e.stderr || e.message));
|
|
387
426
|
}
|
|
388
427
|
}
|
|
389
428
|
}
|
|
390
429
|
|
|
391
430
|
async deleteSession() {
|
|
392
|
-
|
|
431
|
+
this.log.debug('Deleting espresso session');
|
|
393
432
|
|
|
394
433
|
try {
|
|
395
434
|
if (!_lodash.default.isEmpty(this._screenRecordingProperties)) {
|
|
@@ -415,13 +454,12 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
415
454
|
try {
|
|
416
455
|
await this.adb.setAnimationState(true);
|
|
417
456
|
} catch (err) {
|
|
418
|
-
|
|
457
|
+
this.log.warn(`Unable to reset animation: ${err.message}`);
|
|
419
458
|
}
|
|
420
459
|
}
|
|
421
460
|
|
|
422
461
|
if (this.opts.unicodeKeyboard && this.opts.resetKeyboard && this.defaultIME) {
|
|
423
|
-
|
|
424
|
-
|
|
462
|
+
this.log.debug(`Resetting IME to '${this.defaultIME}'`);
|
|
425
463
|
await this.adb.setIME(this.defaultIME);
|
|
426
464
|
}
|
|
427
465
|
|
|
@@ -430,8 +468,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
430
468
|
}
|
|
431
469
|
|
|
432
470
|
if (this.opts.fullReset && !this.opts.skipUninstall && !this.appOnDevice) {
|
|
433
|
-
|
|
434
|
-
|
|
471
|
+
this.log.debug(`FULL_RESET set to 'true', Uninstalling '${this.opts.appPackage}'`);
|
|
435
472
|
await this.adb.uninstallApk(this.opts.appPackage);
|
|
436
473
|
}
|
|
437
474
|
|
|
@@ -439,15 +476,12 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
439
476
|
|
|
440
477
|
if (this.opts.reboot) {
|
|
441
478
|
let avdName = this.opts.avd.replace('@', '');
|
|
442
|
-
|
|
443
|
-
_logger.default.debug(`closing emulator '${avdName}'`);
|
|
444
|
-
|
|
479
|
+
this.log.debug(`closing emulator '${avdName}'`);
|
|
445
480
|
await this.adb.killEmulator(avdName);
|
|
446
481
|
}
|
|
447
482
|
|
|
448
483
|
if ((await this.adb.getApiLevel()) >= 28) {
|
|
449
|
-
|
|
450
|
-
|
|
484
|
+
this.log.info('Restoring hidden api policy to the device default configuration');
|
|
451
485
|
await this.adb.setDefaultHiddenApiPolicy(!!this.opts.ignoreHiddenApiPolicyError);
|
|
452
486
|
}
|
|
453
487
|
}
|
|
@@ -458,7 +492,7 @@ class EspressoDriver extends _baseDriver.BaseDriver {
|
|
|
458
492
|
try {
|
|
459
493
|
await this.adb.removePortForward(this.opts.systemPort);
|
|
460
494
|
} catch (error) {
|
|
461
|
-
|
|
495
|
+
this.log.warn(`Unable to remove port forward '${error.message}'`);
|
|
462
496
|
}
|
|
463
497
|
}
|
|
464
498
|
}
|
|
@@ -512,4 +546,4 @@ var _default = EspressoDriver;
|
|
|
512
546
|
exports.default = _default;require('source-map-support').install();
|
|
513
547
|
|
|
514
548
|
|
|
515
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiU1lTVEVNX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiRXNwcmVzc29Ecml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwic2hlbGwiLCJsb2NhdG9yU3RyYXRlZ2llcyIsImRlc2lyZWRDYXBDb25zdHJhaW50cyIsImVzcHJlc3NvIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsInNlcnZlckRldGFpbHMiLCJwbGF0Zm9ybSIsIndlYlN0b3JhZ2VFbmFibGVkIiwidGFrZXNTY3JlZW5zaG90IiwiamF2YXNjcmlwdEVuYWJsZWQiLCJkYXRhYmFzZUVuYWJsZWQiLCJuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQiLCJsb2NhdGlvbkNvbnRleHRFbmFibGVkIiwid2FybmluZ3MiLCJkZXNpcmVkIiwiT2JqZWN0IiwiYXNzaWduIiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImRlZmF1bHRPcHRzIiwiZnVsbFJlc2V0IiwiYXV0b0xhdW5jaCIsImFkYlBvcnQiLCJERUZBVUxUX0FEQl9QT1JUIiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiXyIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwiYXBwIiwibG9nZ2VyIiwid2FybiIsImVycm9yQW5kVGhyb3ciLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYWRkV2lwZURhdGFUb0F2ZEFyZ3MiLCJzeXN0ZW1Qb3J0IiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsImNvbmZpZ3VyZUFwcCIsIm9uUG9zdFByb2Nlc3MiLCJvblBvc3RDb25maWd1cmVBcHAiLCJzdXBwb3J0ZWRFeHRlbnNpb25zIiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiYXBwUGFja2FnZSIsImlzQXBwSW5zdGFsbGVkIiwic3RhcnRFc3ByZXNzb1Nlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsIm1lc3NhZ2UiLCJlbmRzV2l0aCIsImVycm9ycyIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJlcnIiLCJzdGFjayIsImNhY2hlZEFwcEluZm8iLCJpc1VybCIsImFwcFBhdGgiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaXNBcGsiLCJ0b0xvd2VyIiwic2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkIiwicGF0aEluQ2FjaGUiLCJpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkIiwiaXNQbGFpbk9iamVjdCIsInBhY2thZ2VIYXNoIiwiZnMiLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJleHRyYWN0VW5pdmVyc2FsQXBrIiwicmltcmFmIiwiZHJpdmVyRGF0YSIsImlzRW11bGF0b3IiLCJhdmQiLCJkZXZpY2VOYW1lIiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImF2ZEFyZ3MiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwidmVyc2lvbiIsImdldEFwaUxldmVsIiwic2V0SGlkZGVuQXBpUG9saWN5IiwiaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IiLCJhcHBJbmZvIiwiZ2V0TGF1bmNoSW5mbyIsImluaXREZXZpY2UiLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJ3YXNBbmltYXRpb25FbmFibGVkIiwiY3VyRGV2aWNlSWQiLCJkZXZpY2VVRElEIiwiaW5pdEVzcHJlc3NvU2VydmVyIiwiZGVidWciLCJmb3J3YXJkUG9ydCIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJpbml0QVVUIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsIkVzcHJlc3NvUnVubmVyIiwiaG9zdCIsInJlbW90ZUFkYkhvc3QiLCJkZXZpY2VQb3J0IiwiYXBrIiwidG1wRGlyIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2hvd0dyYWRsZUxvZyIsInNlcnZlckxhdW5jaFRpbWVvdXQiLCJlc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlSZXFSZXMiLCJwcm94eUNvbW1hbmQiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJURVNUX0FQS19QS0ciLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsInNraXBVbmluc3RhbGwiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiaW5zdGFsbFRlc3RBcGsiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJzdGRlcnIiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwiaWduIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJ1bmRlZmluZWQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImVycm9yIiwicHJveHlBY3RpdmUiLCJjYW5Qcm94eSIsImdldFByb3h5QXZvaWRMaXN0IiwiaXNOaWwiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJpc1BhY2thZ2VPckJ1bmRsZSIsImNtZCIsImZuIiwidG9QYWlycyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBLE1BQU1BLE9BQU8sR0FBR0MsbUNBQWhCO0FBSUEsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUExQjtBQUlBLE1BQU1DLFdBQVcsR0FBRyxJQUFwQjtBQU1BLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBRCxFQUFRLElBQUlDLE1BQUosQ0FBVyxtQkFBWCxDQUFSLENBRGUsRUFFZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsZ0RBQVgsQ0FBUixDQUZlLEVBR2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLCtDQUFYLENBQVIsQ0FIZSxFQUlmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywrQ0FBWCxDQUFSLENBSmUsRUFLZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsaURBQVgsQ0FBUixDQUxlLEVBTWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLDJDQUFYLENBQVIsQ0FOZSxFQU9mLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywyQ0FBWCxDQUFSLENBUGUsRUFRZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsaUNBQVgsQ0FBUixDQVJlLEVBU2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLHlCQUFYLENBQVIsQ0FUZSxFQVVmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywwQkFBWCxDQUFSLENBVmUsRUFXZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsMkJBQVgsQ0FBUixDQVhlLEVBWWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLG9DQUFYLENBQVIsQ0FaZSxFQWFmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVywwQkFBWCxDQUFSLENBYmUsRUFjZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcscUJBQVgsQ0FBUixDQWRlLEVBZWYsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLHVDQUFYLENBQVQsQ0FmZSxFQWdCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsa0NBQVgsQ0FBVCxDQWhCZSxFQWlCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsbUNBQVgsQ0FBVCxDQWpCZSxFQWtCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsa0NBQVgsQ0FBVCxDQWxCZSxFQW1CZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0NBQVgsQ0FBVCxDQW5CZSxFQW9CZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQXBCZSxFQXFCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNENBQVgsQ0FBVCxDQXJCZSxFQXNCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNkNBQVgsQ0FBVCxDQXRCZSxFQXVCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQXZCZSxFQXdCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNENBQVgsQ0FBVCxDQXhCZSxFQXlCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNkNBQVgsQ0FBVCxDQXpCZSxFQTBCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQTFCZSxFQTJCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQTNCZSxFQTRCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0NBQVgsQ0FBVCxDQTVCZSxFQTZCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQTdCZSxFQThCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQTlCZSxFQStCZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUNBQVgsQ0FBVCxDQS9CZSxFQWdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMENBQVgsQ0FBVCxDQWhDZSxFQWlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQWpDZSxFQWtDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsNkNBQVgsQ0FBVCxDQWxDZSxFQW1DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsc0NBQVgsQ0FBVCxDQW5DZSxFQW9DZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBVCxDQXBDZSxFQXFDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXJDZSxFQXNDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsaUNBQVgsQ0FBVCxDQXRDZSxFQXVDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsdUNBQVgsQ0FBVCxDQXZDZSxFQXdDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBVCxDQXhDZSxFQXlDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOENBQVgsQ0FBVCxDQXpDZSxFQTBDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTFDZSxFQTJDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBVCxDQTNDZSxFQTRDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0JBQVgsQ0FBVCxDQTVDZSxFQTZDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsOEJBQVgsQ0FBVCxDQTdDZSxFQThDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsK0JBQVgsQ0FBVCxDQTlDZSxFQStDZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMkJBQVgsQ0FBVCxDQS9DZSxFQWdEZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMEJBQVgsQ0FBVCxDQWhEZSxFQWlEZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsb0NBQVgsQ0FBVCxDQWpEZSxFQWtEZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsMEJBQVgsQ0FBVCxDQWxEZSxFQW1EZixDQUFDLE1B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Q3pDeE4sRUFBQUEsY0FBYyxDQUFDdU4sU0FBZixDQUF5QkgsR0FBekIsSUFBZ0NDLEVBQWhDO0FBQ0Q7O2VBR2NyTixjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIsIGVycm9ycywgaXNFcnJvclR5cGUsIERldmljZVNldHRpbmdzfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IEVzcHJlc3NvUnVubmVyLCBURVNUX0FQS19QS0cgfSBmcm9tICcuL2VzcHJlc3NvLXJ1bm5lcic7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBjb21tYW5kcyBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IERFRkFVTFRfQURCX1BPUlQgfSBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7IGFuZHJvaWRIZWxwZXJzLCBhbmRyb2lkQ29tbWFuZHMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgfSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgcXVhbGlmeUFjdGl2aXR5TmFtZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5cbi8vIFRPRE8gbWVyZ2Ugb3VyIG93biBoZWxwZXJzIG9udG8gdGhpcyBsYXRlclxuY29uc3QgaGVscGVycyA9IGFuZHJvaWRIZWxwZXJzO1xuXG4vLyBUaGUgcmFuZ2Ugb2YgcG9ydHMgd2UgY2FuIHVzZSBvbiB0aGUgc3lzdGVtIGZvciBjb21tdW5pY2F0aW5nIHRvIHRoZVxuLy8gRXNwcmVzc28gSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgU1lTVEVNX1BPUlRfUkFOR0UgPSBbODMwMCwgODM5OV07XG5cbi8vIFRoaXMgaXMgdGhlIHBvcnQgdGhhdCB0aGUgZXNwcmVzc28gc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS4gV2Ugd2lsbFxuLy8gZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZSBkZXZpY2UuXG5jb25zdCBERVZJQ0VfUE9SVCA9IDY3OTE7XG5cbi8vIE5PX1BST1hZIGNvbnRhaW5zIHRoZSBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogIEFkZCB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gZXNwcmVzc28gc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2N1cnJlbnRfYWN0aXZpdHknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2Rpc3BsYXlfZGVuc2l0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19rZXlib2FyZF9zaG93bicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fYmFycycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9zeXN0ZW1fdGltZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2JhY2tncm91bmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2Nsb3NlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9sYXVuY2gnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3Jlc2V0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2FwcC9zdHJpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9hY3RpdmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9pbnN0YWxsZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FwcF9zdGF0ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZmluZ2VyX3ByaW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9nZXRfY2xpcGJvYXJkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pbnN0YWxsX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvaXNfbG9ja2VkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9sb2NrJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdWxsX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZm9sZGVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9wdXNoX2ZpbGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3JlbW92ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N0YXJ0X2FjdGl2aXR5JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS90ZXJtaW5hdGVfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS91bmxvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGVfYXN5bmMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuXG5jbGFzcyBFc3ByZXNzb0RyaXZlciBleHRlbmRzIEJhc2VEcml2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9LCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgLy8gYHNoZWxsYCBvdmVyd3JpdGVzIGFkYi5zaGVsbCwgc28gcmVtb3ZlXG4gICAgZGVsZXRlIG9wdHMuc2hlbGw7XG5cbiAgICBzdXBlcihvcHRzLCBzaG91bGRWYWxpZGF0ZUNhcHMpO1xuICAgIHRoaXMubG9jYXRvclN0cmF0ZWdpZXMgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIF07XG4gICAgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSBkZXNpcmVkQ2FwQ29uc3RyYWludHM7XG4gICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG5cbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7fSwgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2FwcylcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYCdicm93c2VyTmFtZScgY2FwYWJpbGl0eSB3aWxsIGJlIGlnbm9yZWRgKTtcbiAgICAgICAgICBsb2dnZXIud2FybihgQ2hyb21lIGJyb3dzZXIgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBzZXNzaW9ucyBiZWNhdXNlIEVzcHJlc3NvIGF1dG9tYXRpb24gZG9lc24ndCBgICtcbiAgICAgICAgICAgICAgYGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgQ2hyb21lYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENocm9tZSBicm93c2VyIHNlc3Npb25zIGNhbm5vdCBiZSBydW4gaW4gRXNwcmVzc28gYmVjYXVzZSBFc3ByZXNzbyBgICtcbiAgICAgICAgICAgIGBhdXRvbWF0aW9uIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBDaHJvbWVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICAgIHRoaXMuYWRkV2lwZURhdGFUb0F2ZEFyZ3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRzLnN5c3RlbVBvcnQgPSB0aGlzLm9wdHMuc3lzdGVtUG9ydFxuICAgICAgICB8fCBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShTWVNURU1fUE9SVF9SQU5HRVswXSwgU1lTVEVNX1BPUlRfUkFOR0VbMV0pO1xuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuICAgICAgLy8gZ2V0IGRldmljZSB1ZGlkIGZvciB0aGlzIHNlc3Npb25cbiAgICAgIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICAgIHRoaXMub3B0cy51ZGlkID0gdWRpZDtcbiAgICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG4gICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgICAgLy8gQURCIGluc3RhbmNlXG4gICAgICB0aGlzLmFkYiA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLmNyZWF0ZUFEQih0aGlzLm9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIHtcbiAgICAgICAgICBvblBvc3RQcm9jZXNzOiB0aGlzLm9uUG9zdENvbmZpZ3VyZUFwcC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHN1cHBvcnRlZEV4dGVuc2lvbnM6IFsnLmFwaycsICcuYWFiJ11cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIGxvZ2dlci5pbmZvKGBBcHAgZmlsZSB3YXMgbm90IGxpc3RlZCwgaW5zdGVhZCB3ZSdyZSBnb2luZyB0byBydW4gYCArXG4gICAgICAgICAgICBgJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0gZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCB0aGUgcGFja2FnZSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgYGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zdGFydEVzcHJlc3NvU2Vzc2lvbigpO1xuICAgICAgcmV0dXJuIFtzZXNzaW9uSWQsIGNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgZS5tZXNzYWdlICs9IGAke18uZW5kc1dpdGgoZS5tZXNzYWdlLCAnLicpID8gJycgOiAnLid9IENoZWNrIGAgK1xuICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyI3Ryb3VibGVzaG9vdGluZyAnICtcbiAgICAgICAgJ3JlZ2FyZGluZyBhZHZhbmNlZCBzZXNzaW9uIHN0YXJ0dXAgdHJvdWJsZXNob290aW5nLic7XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZSwgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnIgPSBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIGVyci5zdGFjayA9IGUuc3RhY2s7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25Qb3N0Q29uZmlndXJlQXBwICh7Y2FjaGVkQXBwSW5mbywgaXNVcmwsIGFwcFBhdGh9KSB7XG4gICAgY29uc3QgcHJlc2lnbkFwcCA9IGFzeW5jIChhcHBMb2NhdGlvbikgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1NpZ24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1NraXBwaW5nIGFwcGxpY2F0aW9uIHNpZ25pbmcgYmVjYXVzZSBub1NpZ24gY2FwYWJpbGl0eSBpcyBzZXQgdG8gdHJ1ZS4gJyArXG4gICAgICAgICAgJ0hhdmluZyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB3aXRoIGltcHJvcGVyIHNpZ25hdHVyZS9ub24tc2lnbmVkIHdpbGwgY2F1c2UgJyArXG4gICAgICAgICAgJ0VzcHJlc3NvIGF1dG9tYXRpb24gc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfSBlbHNlIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2lnbihhcHBMb2NhdGlvbiwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBpc0FwayA9IF8uZW5kc1dpdGgoXy50b0xvd2VyKGFwcFBhdGgpLCAnLmFwaycpO1xuICAgIC8vIERvIG5vdCBjYWNoZSAuYXBrIGlmIHdhcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gICAgY29uc3Qgc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkID0gIWlzQXBrIHx8IChpc0FwayAmJiBpc1VybCk7XG4gICAgbGV0IHBhdGhJbkNhY2hlID0gbnVsbDtcbiAgICBsZXQgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IGZhbHNlO1xuICAgIGlmIChfLmlzUGxhaW5PYmplY3QoY2FjaGVkQXBwSW5mbykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VIYXNoID0gYXdhaXQgZnMuaGFzaChhcHBQYXRoKTtcbiAgICAgIGlmIChwYWNrYWdlSGFzaCA9PT0gY2FjaGVkQXBwSW5mby5wYWNrYWdlSGFzaCAmJiBhd2FpdCBmcy5leGlzdHMoY2FjaGVkQXBwSW5mby5mdWxsUGF0aCkpIHtcbiAgICAgICAgaXNSZXN1bHRBcHBQYXRoQWxyZWFkeUNhY2hlZCA9IHRydWU7XG4gICAgICAgIHBhdGhJbkNhY2hlID0gY2FjaGVkQXBwSW5mby5mdWxsUGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkKSB7XG4gICAgICBpZiAoc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkKSB7XG4gICAgICAgIHBhdGhJbkNhY2hlID0gaXNBcGsgPyBhcHBQYXRoIDogYXdhaXQgdGhpcy5hZGIuZXh0cmFjdFVuaXZlcnNhbEFwayhhcHBQYXRoKTtcbiAgICAgICAgaWYgKCFpc0FwayAmJiBpc1VybCkge1xuICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSB0ZW1wb3JhcmlseSBkb3dubG9hZGVkIC5hYWIgcGFja2FnZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcHBQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKHBhdGhJbkNhY2hlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcGspIHtcbiAgICAgICAgLy8gSXQgaXMgcHJvYmFibHkgbm90IHRoZSBiZXN0IGlkZWEgdG8gbW9kaWZ5IHRoZSBwcm92aWRlZCBhcHAgaW4tcGxhY2UsXG4gICAgICAgIC8vIGJ1dCB0aGlzIGlzIGhvdyBpdCB3YXMgYWx3YXlzIHdvcmtpbmdcbiAgICAgICAgYXdhaXQgcHJlc2lnbkFwcChhcHBQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA/IHthcHBQYXRoOiBwYXRoSW5DYWNoZX0gOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBkcml2ZXJEYXRhICgpIHtcbiAgICAvLyBUT0RPIGZpbGxlIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyLWRyaXZlcjsgY29uc29saWRhdGVcbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICBsb2dnZXIuaW5mbygnYXZkIG5hbWUgZGVmaW5lZCwgaWdub3JpbmcgZGV2aWNlIG5hbWUgYW5kIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjYXBzLmRldmljZU5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBhZGRXaXBlRGF0YVRvQXZkQXJncyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuYXZkQXJncykge1xuICAgICAgdGhpcy5vcHRzLmF2ZEFyZ3MgPSAnLXdpcGUtZGF0YSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRzLmF2ZEFyZ3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyArPSAnIC13aXBlLWRhdGEnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gbXVjaCBvZiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjJcbiAgYXN5bmMgc3RhcnRFc3ByZXNzb1Nlc3Npb24gKCkge1xuICAgIGxvZ2dlci5pbmZvKGBFc3ByZXNzb0RyaXZlciB2ZXJzaW9uOiAke3ZlcnNpb259YCk7XG5cbiAgICAvLyBSZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWFuZHJvaWQtZHJpdmVyL3B1bGwvNDYxIHdoYXQgaGFwcGVucyBpZiB0aGVyIGlzIG5vIHNldEhpZGRlbkFwaVBvbGljeSBmb3IgQW5kcm9pZCBQK1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgbG9nZ2VyLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHR1cm4gb2ZmIGFuaW1hdGlvbnM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZFxuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgZXNwcmVzc28gc2VydmVyIGV0Y1xuICAgIHRoaXMuaW5pdEVzcHJlc3NvU2VydmVyKCk7XG4gICAgLy8gRnVydGhlciBwcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgZXNwcmVzc28gcG9ydFxuICAgIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyBFc3ByZXNzbyBTZXJ2ZXIgcG9ydCAke0RFVklDRV9QT1JUfSB0byAke3RoaXMub3B0cy5zeXN0ZW1Qb3J0fWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0LCBERVZJQ0VfUE9SVCk7XG5cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICAvLyB1bmxvY2sgdGhlIGRldmljZSB0byBwcmVwYXJlIGl0IGZvciB0ZXN0aW5nXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYE5vdCB3YWl0aW5nIGZvciB0aGUgYXBwbGljYXRpb24gYWN0aXZpdHkgdG8gc3RhcnQgYmVjYXVzZSAnYXV0b0xhdW5jaCcgaXMgZGlzYWJsZWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGIud2FpdEZvckFjdGl2aXR5KHRoaXMuY2Fwcy5hcHBXYWl0UGFja2FnZSwgdGhpcy5jYXBzLmFwcFdhaXRBY3Rpdml0eSwgdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbik7XG4gICAgfVxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgYXdhaXQgdGhpcy5pbml0V2VidmlldygpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIGVzcHJlc3NvXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRXZWJ2aWV3ICgpIHtcbiAgICBjb25zdCB2aWV3TmFtZSA9IGFuZHJvaWRDb21tYW5kcy5kZWZhdWx0V2Vidmlld05hbWUuY2FsbCh0aGlzKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCB8fCAyMDAwO1xuICAgIGxvZ2dlci5pbmZvKGBTZXR0aW5nIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgLyA1MDAsIDUwMCwgdGhpcy5zZXRDb250ZXh0LmJpbmQodGhpcyksIHZpZXdOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGFkZERldmljZUluZm9Ub0NhcHMgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaVZlcnNpb24sXG4gICAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgICBtYW51ZmFjdHVyZXIsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlYWxEaXNwbGF5U2l6ZSxcbiAgICAgIGRpc3BsYXlEZW5zaXR5LFxuICAgIH0gPSBhd2FpdCB0aGlzLm1vYmlsZUdldERldmljZUluZm8oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlQXBpTGV2ZWwgPSBwYXJzZUludChhcGlWZXJzaW9uLCAxMCk7XG4gICAgdGhpcy5jYXBzLnBsYXRmb3JtVmVyc2lvbiA9IHBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IHJlYWxEaXNwbGF5U2l6ZTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuRGVuc2l0eSA9IGRpc3BsYXlEZW5zaXR5O1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG4gIH1cblxuICBpbml0RXNwcmVzc29TZXJ2ZXIgKCkge1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyBlc3ByZXNzbyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhXG4gICAgdGhpcy5lc3ByZXNzbyA9IG5ldyBFc3ByZXNzb1J1bm5lcih7XG4gICAgICBob3N0OiB0aGlzLm9wdHMucmVtb3RlQWRiSG9zdCB8fCB0aGlzLm9wdHMuaG9zdCB8fCAnMTI3LjAuMC4xJyxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZm9yY2VFc3ByZXNzb1JlYnVpbGQ6ICEhdGhpcy5vcHRzLmZvcmNlRXNwcmVzc29SZWJ1aWxkLFxuICAgICAgZXNwcmVzc29CdWlsZENvbmZpZzogdGhpcy5vcHRzLmVzcHJlc3NvQnVpbGRDb25maWcsXG4gICAgICBzaG93R3JhZGxlTG9nOiAhIXRoaXMub3B0cy5zaG93R3JhZGxlTG9nLFxuICAgICAgc2VydmVyTGF1bmNoVGltZW91dDogdGhpcy5vcHRzLmVzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCxcbiAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogdGhpcy5vcHRzLmFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIHNraXBTZXJ2ZXJJbnN0YWxsYXRpb246IHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uLFxuICAgICAgdXNlS2V5c3RvcmU6IHRoaXMub3B0cy51c2VLZXlzdG9yZSxcbiAgICAgIGtleXN0b3JlUGF0aDogdGhpcy5vcHRzLmtleXN0b3JlUGF0aCxcbiAgICAgIGtleXN0b3JlUGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgICAga2V5QWxpYXM6IHRoaXMub3B0cy5rZXlBbGlhcyxcbiAgICAgIGtleVBhc3N3b3JkOiB0aGlzLm9wdHMua2V5UGFzc3dvcmQsXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmVzcHJlc3NvLnByb3h5UmVxUmVzLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gICAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmVzcHJlc3NvLnByb3h5Q29tbWFuZC5iaW5kKHRoaXMuZXNwcmVzc28pO1xuICB9XG5cbiAgLy8gVE9ETyB0aGlzIG1ldGhvZCBpcyBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBzZXQgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSBmcm9tIHRoZSBhcGtcbiAgICAvLyBUT0RPOiBpbmNvcnBvcmF0ZSBjaGFuZ2VzIGZyb20gYXBwaXVtIzUzMDggd2hpY2ggZml4IGEgcmFjZSBjb25kLVxuICAgIC8vIGl0aW9uIGJ1ZyBpbiBvbGQgYXBwaXVtIGFuZCBuZWVkIHRvIGJlIHJlcGxpY2F0ZWQgaGVyZVxuICAgIC8vIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MoXG4gICAgLy8gICAgIHRoaXMub3B0cy5sYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFRFU1RfQVBLX1BLR11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24gY2FwYWJpbGl0eSBpcyBzZXQuIE5vdCBpbnN0YWxsaWcgZXNwcmVzc28tc2VydmVyICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmVzcHJlc3NvLmluc3RhbGxUZXN0QXBrKCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYENhbm5vdCBhZGQgc2VydmVyIHBhY2thZ2VzIHRvIHRoZSBEb3plIHdoaXRlbGlzdC4gT3JpZ2luYWwgZXJyb3I6IGAgK1xuICAgICAgICAgIChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMuZXNwcmVzc28pIHtcbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRPRE8gYmVsb3cgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgaWYgKHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlc2V0IGFuaW1hdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiZcbiAgICAgICAgICB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldElNRSh0aGlzLmRlZmF1bHRJTUUpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ2hyb21lU2Vzc2lvbiAmJiB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsICYmICF0aGlzLmFwcE9uRGV2aWNlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRlVMTF9SRVNFVCBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuc3RvcExvZ2NhdCgpO1xuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSghIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRzLnN5c3RlbVBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZW1vdmUgcG9ydCBmb3J3YXJkICcke2Vycm9yLm1lc3NhZ2V9J2ApO1xuICAgICAgICAvL0lnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIGVzcHJlc3NvIHNlcnZlciBhbHJlYWR5XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgZXNwcmVzc28gc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG4gICAgLy8gd2UgYXJlIG1haW50YWluaW5nIHR3byBzZXRzIG9mIE5PX1BST1hZIGxpc3RzLCBvbmUgZm9yIGNocm9tZWRyaXZlcihDSFJPTUVfTk9fUFJPWFkpXG4gICAgLy8gYW5kIG9uZSBmb3IgRXNwcmVzc28oTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5pc05pbCh0aGlzLmNocm9tZWRyaXZlcikgPyBOT19QUk9YWSA6IENIUk9NRV9OT19QUk9YWTtcbiAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IFsuLi50aGlzLmp3cFByb3h5QXZvaWQsIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuICF0aGlzLm9wdHMuYXBwICYmIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIC8vIHdlIGRvIHNvbWUgZGlmZmVyZW50L3NwZWNpYWwgdGhpbmdzIHdpdGggdGhlc2UgbWV0aG9kc1xuICBpZiAoIV8uaW5jbHVkZXMoWydkZWZhdWx0V2Vidmlld05hbWUnXSwgY21kKSkge1xuICAgIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gIH1cbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgZXNwcmVzc28tc3BlY2lmaWMgY29tbWFuZHNcbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBFc3ByZXNzb0RyaXZlcjtcbiJdLCJmaWxlIjoibGliL2RyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
549
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsImFuZHJvaWRIZWxwZXJzIiwiU1lTVEVNX1BPUlRfUkFOR0UiLCJERVZJQ0VfUE9SVCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiQVBLX0VYVCIsIkFBQl9FWFQiLCJTVVBQT1JURURfRVhURU5TSU9OUyIsIkVzcHJlc3NvRHJpdmVyIiwiQmFzZURyaXZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInNob3VsZFZhbGlkYXRlQ2FwcyIsInNoZWxsIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJlc3ByZXNzbyIsImp3cFByb3h5QWN0aXZlIiwiZGVmYXVsdElNRSIsImp3cFByb3h5QXZvaWQiLCJhcGtTdHJpbmdzIiwic2V0dGluZ3MiLCJEZXZpY2VTZXR0aW5ncyIsIm9uU2V0dGluZ3NVcGRhdGUiLCJiaW5kIiwiY2hyb21lZHJpdmVyIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJjcmVhdGVTZXNzaW9uIiwiYXJncyIsInNlc3Npb25JZCIsImNhcHMiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsIk9iamVjdCIsImFzc2lnbiIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsIl8iLCJkZWZhdWx0cyIsImlzQ2hyb21lU2Vzc2lvbiIsImFwcCIsImxvZyIsIndhcm4iLCJlcnJvckFuZFRocm93IiwicmVib290Iiwic2V0QXZkRnJvbUNhcGFiaWxpdGllcyIsImFkZFdpcGVEYXRhVG9BdmRBcmdzIiwic3lzdGVtUG9ydCIsInVkaWQiLCJlbVBvcnQiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJhZGIiLCJjcmVhdGVBREIiLCJjb25maWd1cmVBcHAiLCJvblBvc3RQcm9jZXNzIiwib25Qb3N0Q29uZmlndXJlQXBwIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImFwcE9uRGV2aWNlIiwiaW5mbyIsImFwcFBhY2thZ2UiLCJpc0FwcEluc3RhbGxlZCIsInN0YXJ0RXNwcmVzc29TZXNzaW9uIiwiZSIsImRlbGV0ZVNlc3Npb24iLCJtZXNzYWdlIiwiZW5kc1dpdGgiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiZXJyIiwic3RhY2siLCJ1bnppcEFwcCIsImFwcFBhdGgiLCJ1c2VTeXN0ZW1VbnppcEVudiIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwiaXNFbXB0eSIsImluY2x1ZGVzIiwidG9Mb3dlciIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInppcCIsImV4dHJhY3RBbGxUbyIsImdsb2JQYXR0ZXJuIiwibWFwIiwiZXh0IiwicmVwbGFjZSIsImpvaW4iLCJzb3J0ZWRCdW5kbGVJdGVtcyIsImZzIiwiZ2xvYiIsImN3ZCIsInN0cmljdCIsInNvcnQiLCJhIiwiYiIsInNwbGl0IiwicGF0aCIsInNlcCIsImxlbmd0aCIsInVuemlwcGVkQXBwUGF0aCIsImZpcnN0IiwiZGVidWciLCJjYWNoZWRBcHBJbmZvIiwiaXNVcmwiLCJwcmVzaWduQXBwIiwiYXBwTG9jYXRpb24iLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJzaWduIiwiaGFzQXBrRXh0IiwiaGFzQWFiRXh0IiwiZXh0cmFjdFVuaXZlcnNhbEFwayIsInNob3VsZEV4dHJhY3QiLCJwYXRoSW5DYWNoZSIsImlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQiLCJpc1BsYWluT2JqZWN0IiwicGFja2FnZUhhc2giLCJoYXNoIiwiZXhpc3RzIiwiZnVsbFBhdGgiLCJpc0FwayIsInNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCIsImlzVW56aXBwZWRBcGsiLCJyaW1yYWYiLCJkcml2ZXJEYXRhIiwiaXNFbXVsYXRvciIsImF2ZCIsImRldmljZU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJhdmREZXZpY2UiLCJhdmRBcmdzIiwidG9Mb3dlckNhc2UiLCJ2ZXJzaW9uIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImFwcEluZm8iLCJnZXRMYXVuY2hJbmZvIiwiaW5pdERldmljZSIsImlzQW5pbWF0aW9uT24iLCJzZXRBbmltYXRpb25TdGF0ZSIsIndhc0FuaW1hdGlvbkVuYWJsZWQiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RXNwcmVzc29TZXJ2ZXIiLCJmb3J3YXJkUG9ydCIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJpbml0QVVUIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRBY3Rpdml0eSIsInN0YXJ0U2Vzc2lvbiIsIndhaXRGb3JBY3Rpdml0eSIsImFwcFdhaXREdXJhdGlvbiIsImF1dG9XZWJ2aWV3IiwiaW5pdFdlYnZpZXciLCJhZGREZXZpY2VJbmZvVG9DYXBzIiwidmlld05hbWUiLCJhbmRyb2lkQ29tbWFuZHMiLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjYWxsIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsIkVzcHJlc3NvUnVubmVyIiwiaG9zdCIsInJlbW90ZUFkYkhvc3QiLCJkZXZpY2VQb3J0IiwiYXBrIiwidG1wRGlyIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJlc3ByZXNzb0J1aWxkQ29uZmlnIiwic2hvd0dyYWRsZUxvZyIsInNlcnZlckxhdW5jaFRpbWVvdXQiLCJlc3ByZXNzb1NlcnZlckxhdW5jaFRpbWVvdXQiLCJza2lwU2VydmVySW5zdGFsbGF0aW9uIiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlIiwicHJveHlSZXFSZXMiLCJwcm94eUNvbW1hbmQiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwicGFyc2VBcnJheSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJURVNUX0FQS19QS0ciLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsInNraXBVbmluc3RhbGwiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiaW5zdGFsbFRlc3RBcGsiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJzdGRlcnIiLCJfc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyIsInN0b3BSZWNvcmRpbmdTY3JlZW4iLCJpZ24iLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsInN0b3BMb2djYXQiLCJhdmROYW1lIiwia2lsbEVtdWxhdG9yIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsInVuZGVmaW5lZCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZXJyb3IiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJpc05pbCIsIm5hdGl2ZVdlYlNjcmVlbnNob3QiLCJpc0Nocm9tZUJyb3dzZXIiLCJicm93c2VyTmFtZSIsImlzUGFja2FnZU9yQnVuZGxlIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwicHJvdG90eXBlIiwiY29tbWFuZHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUEsTUFBTUEsT0FBTyxHQUFHQyxtQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQTFCO0FBSUEsTUFBTUMsV0FBVyxHQUFHLElBQXBCO0FBTUEsTUFBTUMsUUFBUSxHQUFHLENBQ2YsQ0FBQyxLQUFELEVBQVEsSUFBSUMsTUFBSixDQUFXLG1CQUFYLENBQVIsQ0FEZSxFQUVmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxnREFBWCxDQUFSLENBRmUsRUFHZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsK0NBQVgsQ0FBUixDQUhlLEVBSWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLCtDQUFYLENBQVIsQ0FKZSxFQUtmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpREFBWCxDQUFSLENBTGUsRUFNZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcsMkNBQVgsQ0FBUixDQU5lLEVBT2YsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFBSixDQUFXLDJDQUFYLENBQVIsQ0FQZSxFQVFmLENBQUMsS0FBRCxFQUFRLElBQUlBLE1BQUosQ0FBVyxpQ0FBWCxDQUFSLENBUmUsRUFTZixDQUFDLEtBQUQsRUFBUSxJQUFJQSxNQUFKLENBQVcseUJBQVgsQ0FBUixDQVRlLEVBVWYsQ0FBQyxLQUFELEVBQVEsSUFBSUEsTUFB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Q0Q7O2VBR2NyUCxjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgZXJyb3JzLCBpc0Vycm9yVHlwZSwgRGV2aWNlU2V0dGluZ3N9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgRXNwcmVzc29SdW5uZXIsIFRFU1RfQVBLX1BLRyB9IGZyb20gJy4vZXNwcmVzc28tcnVubmVyJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCB6aXAgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCB9IGZyb20gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcic7XG5pbXBvcnQgZGVzaXJlZENhcENvbnN0cmFpbnRzIGZyb20gJy4vZGVzaXJlZC1jYXBzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby11bnJlc29sdmVkXG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBxdWFsaWZ5QWN0aXZpdHlOYW1lIH0gZnJvbSAnLi91dGlscyc7XG5cblxuLy8gVE9ETyBtZXJnZSBvdXIgb3duIGhlbHBlcnMgb250byB0aGlzIGxhdGVyXG5jb25zdCBoZWxwZXJzID0gYW5kcm9pZEhlbHBlcnM7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBFc3ByZXNzbyBIVFRQIHNlcnZlciBvbiB0aGUgZGV2aWNlXG5jb25zdCBTWVNURU1fUE9SVF9SQU5HRSA9IFs4MzAwLCA4Mzk5XTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBlc3ByZXNzbyBzZXJ2ZXIgbGlzdGVucyB0byBvbiB0aGUgZGV2aWNlLiBXZSB3aWxsXG4vLyBmb3J3YXJkIG9uZSBvZiB0aGUgcG9ydHMgYWJvdmUgb24gdGhlIHN5c3RlbSB0byB0aGlzIHBvcnQgb24gdGhlIGRldmljZS5cbmNvbnN0IERFVklDRV9QT1JUID0gNjc5MTtcblxuLy8gTk9fUFJPWFkgY29udGFpbnMgdGhlIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBlc3ByZXNzbyBzZXJ2ZXIuXG4vLyBUT0RPOiBOZWVkIHRvIHNlZ3JlZ2F0ZSB0aGUgcGF0aHMgYmV0dGVyIHdheSB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zIHdoZXJldmVyIGFwcGxpY2FibGUuXG4vLyAoTm90IHNlZ3JlZ2F0aW5nIHJpZ2h0IGF3YXkgYmVjYXVzZSBtb3JlIHBhdGhzIHRvIGJlIGFkZGVkIGluIHRoZSBOT19QUk9YWSBsaXN0KVxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uLyg/IS4qLyknKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvY3VycmVudF9hY3Rpdml0eScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9jdXJyZW50X3BhY2thZ2UnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvZGlzcGxheV9kZW5zaXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2lzX2tleWJvYXJkX3Nob3duJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV9iYXJzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3N5c3RlbV90aW1lJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvYmFja2dyb3VuZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvY2xvc2UnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL2xhdW5jaCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvcmVzZXQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL3N0cmluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vY29tcGFyZV9pbWFnZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2FjdGl2YXRlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX2luc3RhbGxlZCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvYXBwX3N0YXRlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9maW5nZXJfcHJpbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2luc3RhbGxfYXBwJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS9pc19sb2NrZWQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL2xvY2snKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1bGxfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcHVsbF9mb2xkZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3B1c2hfZmlsZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2UvcmVtb3ZlX2FwcCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9kZXZpY2Uvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3Rlcm1pbmF0ZV9hcHAnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL3VubG9jaycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vcGVyZm9ybWFuY2VEYXRhL3R5cGVzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3NldHRpbmdzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RvcF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZV9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2ltZS9bXi9dKycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG4vLyBUaGlzIGlzIGEgc2V0IG9mIG1ldGhvZHMgYW5kIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBDaHJvbWVkcml2ZXIuXG5jb25zdCBDSFJPTUVfTk9fUFJPWFkgPSBbXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9yZWN0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIG1vYmlsZTogY29tbWFuZHMgd29ya2luZyBpbiB3ZWIgY29udGV4dFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZSQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG5cbiAgLy8gTUpTT05XUCBjb21tYW5kc1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG5cbiAgLy8gVzNDIGNvbW1hbmRzXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nL3R5cGVzJyldLFxuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cnKV0sXG5dO1xuXG5cbmNvbnN0IEFQS19FWFQgPSAnLmFwayc7XG5jb25zdCBBQUJfRVhUID0gJy5hYWInO1xuY29uc3QgU1VQUE9SVEVEX0VYVEVOU0lPTlMgPSBbQVBLX0VYVCwgQUFCX0VYVF07XG5cbmNsYXNzIEVzcHJlc3NvRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30sIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgICAvLyBgc2hlbGxgIG92ZXJ3cml0ZXMgYWRiLnNoZWxsLCBzbyByZW1vdmVcbiAgICBkZWxldGUgb3B0cy5zaGVsbDtcblxuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLmVzcHJlc3NvID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0SU1FID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcblxuICAgIHRoaXMuYXBrU3RyaW5ncyA9IHt9OyAvLyBtYXAgb2YgbGFuZ3VhZ2UgLT4gc3RyaW5ncyBvYmpcbiAgICB0aGlzLnNldHRpbmdzID0gbmV3IERldmljZVNldHRpbmdzKHt9LCB0aGlzLm9uU2V0dGluZ3NVcGRhdGUuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoLi4uYXJncykge1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBvdGhlclNlc3Npb25EYXRhIGZvciBtdWx0aXBsZSBzZXNzaW9uc1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jYXBzKVxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYXBzID0gT2JqZWN0LmFzc2lnbihzZXJ2ZXJEZXRhaWxzLCB0aGlzLmNhcHMpO1xuXG4gICAgICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogOTAwMDBcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGAnYnJvd3Nlck5hbWUnIGNhcGFiaWxpdHkgd2lsbCBiZSBpZ25vcmVkYCk7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgQ2hyb21lIGJyb3dzZXIgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBzZXNzaW9ucyBiZWNhdXNlIEVzcHJlc3NvIGF1dG9tYXRpb24gZG9lc24ndCBgICtcbiAgICAgICAgICAgICAgYGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgQ2hyb21lYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2hyb21lIGJyb3dzZXIgc2Vzc2lvbnMgY2Fubm90IGJlIHJ1biBpbiBFc3ByZXNzbyBiZWNhdXNlIEVzcHJlc3NvIGAgK1xuICAgICAgICAgICAgYGF1dG9tYXRpb24gZG9lc24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIENocm9tZWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgICAgdGhpcy5hZGRXaXBlRGF0YVRvQXZkQXJncygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdHMuc3lzdGVtUG9ydCA9IHRoaXMub3B0cy5zeXN0ZW1Qb3J0XG4gICAgICAgIHx8IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKFNZU1RFTV9QT1JUX1JBTkdFWzBdLCBTWVNURU1fUE9SVF9SQU5HRVsxXSk7XG4gICAgICB0aGlzLm9wdHMuYWRiUG9ydCA9IHRoaXMub3B0cy5hZGJQb3J0IHx8IERFRkFVTFRfQURCX1BPUlQ7XG4gICAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgICAgY29uc3Qge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcbiAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgb3VyIGphdmEgdmVyc2lvbiBhbmQgZGV2aWNlIGluZm8sIHdlIGNhbiBjcmVhdGUgb3VyXG4gICAgICAvLyBBREIgaW5zdGFuY2VcbiAgICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwge1xuICAgICAgICAgIG9uUG9zdFByb2Nlc3M6IHRoaXMub25Qb3N0Q29uZmlndXJlQXBwLmJpbmQodGhpcyksXG4gICAgICAgICAgc3VwcG9ydGVkRXh0ZW5zaW9uczogU1VQUE9SVEVEX0VYVEVOU0lPTlNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIHRoaXMubG9nLmluZm8oYEFwcCBmaWxlIHdhcyBub3QgbGlzdGVkLCBpbnN0ZWFkIHdlJ3JlIGdvaW5nIHRvIHJ1biBgICtcbiAgICAgICAgICAgIGAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBkaXJlY3RseSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQodGhpcy5vcHRzLmFwcFBhY2thZ2UpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgdGhlIHBhY2thZ2UgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgIGBpbnN0YWxsZWQgb24gdGhlIGRldmljZWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRFc3ByZXNzb1Nlc3Npb24oKTtcbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCBjYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIGUubWVzc2FnZSArPSBgJHtfLmVuZHNXaXRoKGUubWVzc2FnZSwgJy4nKSA/ICcnIDogJy4nfSBDaGVjayBgICtcbiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLWVzcHJlc3NvLWRyaXZlciN0cm91Ymxlc2hvb3RpbmcgJyArXG4gICAgICAgICdyZWdhcmRpbmcgYWR2YW5jZWQgc2Vzc2lvbiBzdGFydHVwIHRyb3VibGVzaG9vdGluZy4nO1xuICAgICAgaWYgKGlzRXJyb3JUeXBlKGUsIGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyID0gbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKGUubWVzc2FnZSk7XG4gICAgICBlcnIuc3RhY2sgPSBlLnN0YWNrO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnppcCB0aGUgZ2l2ZW4gYXBwIHBhdGggYW5kIHJldHVybiB0aGUgZmlyc3QgcGFja2FnZSB0aGF0IGhhcyBTVVBQT1JURURfRVhURU5TSU9OU1xuICAgKiBpbiB0aGUgYXJjaGl2ZWQgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggVGhlIHBhdGggdG8gYXBwIGZpbGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVucyB0aGUgcGF0aCB0byBhbiB1bnppcHBlZCBhcHAgZmlsZSBwYXRoLlxuICAgKiBAdGhyb3dzIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgemlwIGRpZCBub3QgaGF2ZSBhbnkgU1VQUE9SVEVEX0VYVEVOU0lPTlMgcGFja2FnZXMuXG4gICAqL1xuICBhc3luYyB1bnppcEFwcCAoYXBwUGF0aCkge1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwRW52ID0gcHJvY2Vzcy5lbnYuQVBQSVVNX1BSRUZFUl9TWVNURU1fVU5aSVA7XG4gICAgY29uc3QgdXNlU3lzdGVtVW56aXAgPSBfLmlzRW1wdHkodXNlU3lzdGVtVW56aXBFbnYpXG4gICAgICB8fCAhWycwJywgJ2ZhbHNlJ10uaW5jbHVkZXMoXy50b0xvd2VyKHVzZVN5c3RlbVVuemlwRW52KSk7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oYXBwUGF0aCwgdG1wUm9vdCwge3VzZVN5c3RlbVVuemlwfSk7XG5cbiAgICBjb25zdCBnbG9iUGF0dGVybiA9IGAqKi8qLisoJHtTVVBQT1JURURfRVhURU5TSU9OUy5tYXAoKGV4dCkgPT4gZXh0LnJlcGxhY2UoL15cXC4vLCAnJykpLmpvaW4oJ3wnKX0pYDtcbiAgICBjb25zdCBzb3J0ZWRCdW5kbGVJdGVtcyA9IChhd2FpdCBmcy5nbG9iKGdsb2JQYXR0ZXJuLCB7XG4gICAgICBjd2Q6IHRtcFJvb3QsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgIH0pKS5zb3J0KChhLCBiKSA9PiBhLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggLSBiLnNwbGl0KHBhdGguc2VwKS5sZW5ndGgpO1xuICAgIGlmIChzb3J0ZWRCdW5kbGVJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIG5vIGV4cGVjdGVkIHBhY2thZ2VzIGluIHRoZSB6aXBcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYCR7dGhpcy5vcHRzLmFwcH0gZGlkIG5vdCBoYXZlIGFueSBvZiAnJHtTVVBQT1JURURfRVhURU5TSU9OUy5qb2luKCcsICcpfScgYCArXG4gICAgICAgIGBleHRlbnNpb24gcGFja2FnZXMuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIHByb3ZpZGVkIC56aXAgYXJjaGl2ZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdmFsaWQgYXBwbGljYXRpb24gcGFja2FnZS5gKTtcbiAgICB9XG4gICAgY29uc3QgdW56aXBwZWRBcHBQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsIF8uZmlyc3Qoc29ydGVkQnVuZGxlSXRlbXMpKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgJyR7dW56aXBwZWRBcHBQYXRofScgaXMgdGhlIHVuemlwcGVkIGZpbGUgZnJvbSAnJHthcHBQYXRofSdgKTtcbiAgICByZXR1cm4gdW56aXBwZWRBcHBQYXRoO1xuICB9XG5cbiAgYXN5bmMgb25Qb3N0Q29uZmlndXJlQXBwICh7Y2FjaGVkQXBwSW5mbywgaXNVcmwsIGFwcFBhdGh9KSB7XG4gICAgY29uc3QgcHJlc2lnbkFwcCA9IGFzeW5jIChhcHBMb2NhdGlvbikgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1NpZ24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnU2tpcHBpbmcgYXBwbGljYXRpb24gc2lnbmluZyBiZWNhdXNlIG5vU2lnbiBjYXBhYmlsaXR5IGlzIHNldCB0byB0cnVlLiAnICtcbiAgICAgICAgICAnSGF2aW5nIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHdpdGggaW1wcm9wZXIgc2lnbmF0dXJlL25vbi1zaWduZWQgd2lsbCBjYXVzZSAnICtcbiAgICAgICAgICAnRXNwcmVzc28gYXV0b21hdGlvbiBzdGFydHVwIGZhaWx1cmUuJyk7XG4gICAgICB9IGVsc2UgaWYgKCFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwTG9jYXRpb24sIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaWduKGFwcExvY2F0aW9uLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhc0Fwa0V4dCA9IChhcHBQYXRoKSA9PiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQVBLX0VYVCk7XG4gICAgY29uc3QgaGFzQWFiRXh0ID0gKGFwcFBhdGgpID0+IF8uZW5kc1dpdGgoXy50b0xvd2VyKGFwcFBhdGgpLCBBQUJfRVhUKTtcbiAgICBjb25zdCBleHRyYWN0VW5pdmVyc2FsQXBrID0gYXN5bmMgKHNob3VsZEV4dHJhY3QsIGFwcFBhdGgpID0+XG4gICAgICBzaG91bGRFeHRyYWN0ID8gYXBwUGF0aCA6IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RVbml2ZXJzYWxBcGsoYXBwUGF0aCk7XG5cbiAgICBsZXQgcGF0aEluQ2FjaGUgPSBudWxsO1xuICAgIGxldCBpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkID0gZmFsc2U7XG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChjYWNoZWRBcHBJbmZvKSkge1xuICAgICAgY29uc3QgcGFja2FnZUhhc2ggPSBhd2FpdCBmcy5oYXNoKGFwcFBhdGgpO1xuICAgICAgaWYgKHBhY2thZ2VIYXNoID09PSBjYWNoZWRBcHBJbmZvLnBhY2thZ2VIYXNoICYmIGF3YWl0IGZzLmV4aXN0cyhjYWNoZWRBcHBJbmZvLmZ1bGxQYXRoKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyAnJHtjYWNoZWRBcHBJbmZvLmZ1bGxQYXRofScgd2hpY2ggaXMgY2FjaGVkIGZyb20gJyR7YXBwUGF0aH0nYCk7XG4gICAgICAgIGlzUmVzdWx0QXBwUGF0aEFscmVhZHlDYWNoZWQgPSB0cnVlO1xuICAgICAgICBwYXRoSW5DYWNoZSA9IGNhY2hlZEFwcEluZm8uZnVsbFBhdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXBwUGF0aCBjYW4gYmUgLnppcCwgLmFwayBvciAuYWFiXG4gICAgY29uc3QgaXNBcGsgPSBoYXNBcGtFeHQoYXBwUGF0aCk7XG4gICAgLy8gT25seSBsb2NhbCAuYXBrIGZpbGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbi1wbGFjZSBzaG91bGQgbm90IGJlIGNhY2hlZFxuICAgIGNvbnN0IHNob3VsZFJlc3VsdEFwcFBhdGhCZUNhY2hlZCA9ICFpc0FwayB8fCAoaXNBcGsgJiYgaXNVcmwpO1xuXG4gICAgaWYgKCFpc1Jlc3VsdEFwcFBhdGhBbHJlYWR5Q2FjaGVkKSB7XG4gICAgICBpZiAoc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkKSB7XG4gICAgICAgIC8vIC56aXAsIC5hYWIgb3IgZG93bmxvYWRlZCAuYXBrXG5cbiAgICAgICAgbGV0IHVuemlwcGVkQXBwUGF0aDtcbiAgICAgICAgbGV0IGlzVW56aXBwZWRBcGsgPSBmYWxzZTtcbiAgICAgICAgaWYgKCEoaGFzQXBrRXh0KGFwcFBhdGgpIHx8IGhhc0FhYkV4dChhcHBQYXRoKSkpIHtcbiAgICAgICAgICB1bnppcHBlZEFwcFBhdGggPSBhd2FpdCB0aGlzLnVuemlwQXBwKGFwcFBhdGgpO1xuICAgICAgICAgIGlzVW56aXBwZWRBcGsgPSBoYXNBcGtFeHQodW56aXBwZWRBcHBQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVuemlwcGVkQXBwUGF0aCBvciBhcHBQYXRoIGhhcyBTVVBQT1JURURfRVhURU5TSU9OUy5cbiAgICAgICAgcGF0aEluQ2FjaGUgPSB1bnppcHBlZEFwcFBhdGhcbiAgICAgICAgICA/IGF3YWl0IGV4dHJhY3RVbml2ZXJzYWxBcGsoaXNVbnppcHBlZEFwaywgdW56aXBwZWRBcHBQYXRoKVxuICAgICAgICAgIDogYXdhaXQgZXh0cmFjdFVuaXZlcnNhbEFwayhpc0FwaywgYXBwUGF0aCk7XG5cbiAgICAgICAgaWYgKCFpc0FwayAmJiBpc1VybCkge1xuICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSB0ZW1wb3JhcmlseSBkb3dubG9hZGVkIC5hYWIgb3IgLnppcCBwYWNrYWdlXG4gICAgICAgICAgYXdhaXQgZnMucmltcmFmKGFwcFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNBYWJFeHQodW56aXBwZWRBcHBQYXRoKSkge1xuICAgICAgICAgIC8vIENsZWFudXAgdGhlIGxvY2FsIHVuemlwcGVkIC5hYWIgZmlsZVxuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZih1bnppcHBlZEFwcFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHByZXNpZ25BcHAocGF0aEluQ2FjaGUpO1xuICAgICAgfSBlbHNlIGlmIChpc0Fwaykge1xuICAgICAgICAvLyBJdCBpcyBwcm9iYWJseSBub3QgdGhlIGJlc3QgaWRlYSB0byBtb2RpZnkgdGhlIHByb3ZpZGVkIGFwcCBpbi1wbGFjZSxcbiAgICAgICAgLy8gYnV0IHRoaXMgaXMgaG93IGl0IHdhcyBhbHdheXMgd29ya2luZ1xuICAgICAgICBhd2FpdCBwcmVzaWduQXBwKGFwcFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkUmVzdWx0QXBwUGF0aEJlQ2FjaGVkID8ge2FwcFBhdGg6IHBhdGhJbkNhY2hlfSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGRyaXZlckRhdGEgKCkge1xuICAgIC8vIFRPRE8gZmlsbGUgb3V0IHJlc291cmNlIGluZm8gaGVyZVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIGR1cGxpY2F0ZWQgZnJvbSB1aWF1dG9tYXRvcjItZHJpdmVyOyBjb25zb2xpZGF0ZVxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBkZXZpY2VOYW1lIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghY2Fwcy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gdGhpcyBtZXRob2QgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMi1kcml2ZXI7IGNvbnNvbGlkYXRlXG4gIGFkZFdpcGVEYXRhVG9BdmRBcmdzICgpIHtcbiAgICBpZiAoIXRoaXMub3B0cy5hdmRBcmdzKSB7XG4gICAgICB0aGlzLm9wdHMuYXZkQXJncyA9ICctd2lwZS1kYXRhJztcbiAgICB9IGVsc2UgaWYgKCF0aGlzLm9wdHMuYXZkQXJncy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCctd2lwZS1kYXRhJykpIHtcbiAgICAgIHRoaXMub3B0cy5hdmRBcmdzICs9ICcgLXdpcGUtZGF0YSc7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyBtdWNoIG9mIHRoaXMgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICBhc3luYyBzdGFydEVzcHJlc3NvU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgRXNwcmVzc29Ecml2ZXIgdmVyc2lvbjogJHt2ZXJzaW9ufWApO1xuXG4gICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1hbmRyb2lkLWRyaXZlci9wdWxsLzQ2MSB3aGF0IGhhcHBlbnMgaWYgdGhlciBpcyBubyBzZXRIaWRkZW5BcGlQb2xpY3kgZm9yIEFuZHJvaWQgUCtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgIHRoaXMubG9nLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBsZXQgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAoYXBwSW5mbykge1xuICAgICAgLy8gYW5kIGdldCBpdCBvbnRvIG91ciAnb3B0cycgb2JqZWN0IHNvIHdlIHVzZSBpdCBmcm9tIG5vdyBvblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBJbmZvID0gdGhpcy5vcHRzO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZXNwcmVzc28tZHJpdmVyL2lzc3Vlcy83MlxuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKGZhbHNlKTtcbiAgICAgICAgdGhpcy53YXNBbmltYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gdHVybiBvZmYgYW5pbWF0aW9uczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBtb2RpZmllZCBlc3ByZXNzbyBzZXJ2ZXIgZXRjXG4gICAgdGhpcy5pbml0RXNwcmVzc29TZXJ2ZXIoKTtcbiAgICAvLyBGdXJ0aGVyIHByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBlc3ByZXNzbyBwb3J0XG4gICAgdGhpcy5sb2cuZGVidWcoYEZvcndhcmRpbmcgRXNwcmVzc28gU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gJHt0aGlzLm9wdHMuc3lzdGVtUG9ydH1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCwgREVWSUNFX1BPUlQpO1xuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAnc2tpcFVubG9jaycgY2FwYWJpbGl0eSBzZXQsIHNvIHNraXBwaW5nIGRldmljZSB1bmxvY2tgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvL0FkZGluZyBBVVQgcGFja2FnZSBuYW1lIGluIHRoZSBjYXBhYmlsaXRpZXMgaWYgcGFja2FnZSBuYW1lIG5vdCBleGlzdCBpbiBjYXBzXG4gICAgaWYgKCF0aGlzLmNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UgPSBhcHBJbmZvLmFwcFdhaXRQYWNrYWdlIHx8IGFwcEluZm8uYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwUGFja2FnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwQWN0aXZpdHksIHRoaXMuY2Fwcy5hcHBQYWNrYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXBzLmFwcEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwUGFja2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZSh0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLmNhcHMuYXBwV2FpdFBhY2thZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5ID0gcXVhbGlmeUFjdGl2aXR5TmFtZShhcHBJbmZvLmFwcFdhaXRBY3Rpdml0eSB8fCBhcHBJbmZvLmFwcEFjdGl2aXR5IHx8IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSxcbiAgICAgICAgdGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlKTtcbiAgICB9XG5cbiAgICAvLyBsYXVuY2ggZXNwcmVzc28gYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG4gICAgaWYgKHRoaXMuY2Fwcy5hdXRvTGF1bmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IHdhaXRpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbiBhY3Rpdml0eSB0byBzdGFydCBiZWNhdXNlICdhdXRvTGF1bmNoJyBpcyBkaXNhYmxlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yQWN0aXZpdHkodGhpcy5jYXBzLmFwcFdhaXRQYWNrYWdlLCB0aGlzLmNhcHMuYXBwV2FpdEFjdGl2aXR5LCB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uKTtcbiAgICB9XG4gICAgLy8gaWYgd2Ugd2FudCB0byBpbW1lZGlhdGVseSBnZXQgaW50byBhIHdlYnZpZXcsIHNldCBvdXIgY29udGV4dFxuICAgIC8vIGFwcHJvcHJpYXRlbHlcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRXZWJ2aWV3KCk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gZXNwcmVzc29cbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuYWRkRGV2aWNlSW5mb1RvQ2FwcygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdFdlYnZpZXcgKCkge1xuICAgIGNvbnN0IHZpZXdOYW1lID0gYW5kcm9pZENvbW1hbmRzLmRlZmF1bHRXZWJ2aWV3TmFtZS5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG4gICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgaW5pdEVzcHJlc3NvU2VydmVyICgpIHtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHBhY2thZ2UgYW5kIGFjdGl2aXR5LCB3ZSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mXG4gICAgLy8gZXNwcmVzc28gd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGF0YVxuICAgIHRoaXMuZXNwcmVzc28gPSBuZXcgRXNwcmVzc29SdW5uZXIodGhpcy5sb2csIHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8ICcxMjcuMC4wLjEnLFxuICAgICAgc3lzdGVtUG9ydDogdGhpcy5vcHRzLnN5c3RlbVBvcnQsXG4gICAgICBkZXZpY2VQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgIGFkYjogdGhpcy5hZGIsXG4gICAgICBhcGs6IHRoaXMub3B0cy5hcHAsXG4gICAgICB0bXBEaXI6IHRoaXMub3B0cy50bXBEaXIsXG4gICAgICBhcHBQYWNrYWdlOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgIGFwcEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICBmb3JjZUVzcHJlc3NvUmVidWlsZDogISF0aGlzLm9wdHMuZm9yY2VFc3ByZXNzb1JlYnVpbGQsXG4gICAgICBlc3ByZXNzb0J1aWxkQ29uZmlnOiB0aGlzLm9wdHMuZXNwcmVzc29CdWlsZENvbmZpZyxcbiAgICAgIHNob3dHcmFkbGVMb2c6ICEhdGhpcy5vcHRzLnNob3dHcmFkbGVMb2csXG4gICAgICBzZXJ2ZXJMYXVuY2hUaW1lb3V0OiB0aGlzLm9wdHMuZXNwcmVzc29TZXJ2ZXJMYXVuY2hUaW1lb3V0LFxuICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiB0aGlzLm9wdHMuYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgc2tpcFNlcnZlckluc3RhbGxhdGlvbjogdGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24sXG4gICAgICB1c2VLZXlzdG9yZTogdGhpcy5vcHRzLnVzZUtleXN0b3JlLFxuICAgICAga2V5c3RvcmVQYXRoOiB0aGlzLm9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAga2V5c3RvcmVQYXNzd29yZDogdGhpcy5vcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICBrZXlBbGlhczogdGhpcy5vcHRzLmtleUFsaWFzLFxuICAgICAga2V5UGFzc3dvcmQ6IHRoaXMub3B0cy5rZXlQYXNzd29yZCxcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgfSk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuZXNwcmVzc28ucHJveHlSZXFSZXMuYmluZCh0aGlzLmVzcHJlc3NvKTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuZXNwcmVzc28ucHJveHlDb21tYW5kLmJpbmQodGhpcy5lc3ByZXNzbyk7XG4gIH1cblxuICAvLyBUT0RPIHRoaXMgbWV0aG9kIGlzIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gdWlhdXRvbWF0b3IyXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHNldCB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIGZyb20gdGhlIGFwa1xuICAgIC8vIFRPRE86IGluY29ycG9yYXRlIGNoYW5nZXMgZnJvbSBhcHBpdW0jNTMwOCB3aGljaCBmaXggYSByYWNlIGNvbmQtXG4gICAgLy8gaXRpb24gYnVnIGluIG9sZCBhcHBpdW0gYW5kIG5lZWQgdG8gYmUgcmVwbGljYXRlZCBoZXJlXG4gICAgLy8gdGhpcy5hcGtTdHJpbmdzW3RoaXMub3B0cy5sYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhcbiAgICAvLyAgICAgdGhpcy5vcHRzLmxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgVEVTVF9BUEtfUEtHXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0Z1bGwgcmVzZXQgcmVxdWlyZXMgYW4gYXBwIGNhcGFiaWxpdHksIHVzZSBmYXN0UmVzZXQgaWYgYXBwIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0KSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEFwayh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1Zygnc2tpcFNlcnZlckluc3RhbGxhdGlvbiBjYXBhYmlsaXR5IGlzIHNldC4gTm90IGluc3RhbGxpZyBlc3ByZXNzby1zZXJ2ZXIgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uaW5zdGFsbFRlc3RBcGsoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdChTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0RlbGV0aW5nIGVzcHJlc3NvIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMuZXNwcmVzc28pIHtcbiAgICAgIGlmICh0aGlzLmp3cFByb3h5QWN0aXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXNwcmVzc28uZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lc3ByZXNzbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFRPRE8gYmVsb3cgbG9naWMgaXMgZHVwbGljYXRlZCBmcm9tIHVpYXV0b21hdG9yMlxuICAgIGlmICh0aGlzLmFkYikge1xuICAgICAgaWYgKHRoaXMud2FzQW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gcmVzZXQgYW5pbWF0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJlxuICAgICAgICAgIHRoaXMuZGVmYXVsdElNRSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgUmVzZXR0aW5nIElNRSB0byAnJHt0aGlzLmRlZmF1bHRJTUV9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UgJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgRlVMTF9SRVNFVCBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuc3RvcExvZ2NhdCgpO1xuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBjbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIHRoZSBkZXZpY2UgZGVmYXVsdCBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBzdXBlci5kZWxldGVTZXNzaW9uKCk7XG4gICAgaWYgKHRoaXMub3B0cy5zeXN0ZW1Qb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byByZW1vdmUgcG9ydCBmb3J3YXJkICcke2Vycm9yLm1lc3NhZ2V9J2ApO1xuICAgICAgICAvL0lnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uU2V0dGluZ3NVcGRhdGUgKCkge1xuICAgIC8vIGludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlLCBzaW5jZSBjb21tYW5kcy51cGRhdGVTZXR0aW5ncyBwcm94aWVzXG4gICAgLy8gc2V0dGluZ3MgdG8gdGhlIGVzcHJlc3NvIHNlcnZlciBhbHJlYWR5XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGFsd2F5cyBoYXZlIGFuIGFjdGl2ZSBwcm94eSB0byB0aGUgZXNwcmVzc28gc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIGVzcHJlc3NvIHNlcnZlclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG4gICAgLy8gd2UgYXJlIG1haW50YWluaW5nIHR3byBzZXRzIG9mIE5PX1BST1hZIGxpc3RzLCBvbmUgZm9yIGNocm9tZWRyaXZlcihDSFJPTUVfTk9fUFJPWFkpXG4gICAgLy8gYW5kIG9uZSBmb3IgRXNwcmVzc28oTk9fUFJPWFkpLCBiYXNlZCBvbiBjdXJyZW50IGNvbnRleHQgd2lsbCByZXR1cm4gcmVsYXRlZCBOT19QUk9YWSBsaXN0XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gXy5pc05pbCh0aGlzLmNocm9tZWRyaXZlcikgPyBOT19QUk9YWSA6IENIUk9NRV9OT19QUk9YWTtcbiAgICBpZiAodGhpcy5vcHRzLm5hdGl2ZVdlYlNjcmVlbnNob3QpIHtcbiAgICAgIHRoaXMuandwUHJveHlBdm9pZCA9IFsuLi50aGlzLmp3cFByb3h5QXZvaWQsIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QXZvaWQ7XG4gIH1cblxuICBnZXQgaXNDaHJvbWVTZXNzaW9uICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0Nocm9tZUJyb3dzZXIodGhpcy5vcHRzLmJyb3dzZXJOYW1lKTtcbiAgfVxuXG4gIGdldCBhcHBPbkRldmljZSAoKSB7XG4gICAgcmV0dXJuICF0aGlzLm9wdHMuYXBwICYmIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIC8vIHdlIGRvIHNvbWUgZGlmZmVyZW50L3NwZWNpYWwgdGhpbmdzIHdpdGggdGhlc2UgbWV0aG9kc1xuICBpZiAoIV8uaW5jbHVkZXMoWydkZWZhdWx0V2Vidmlld05hbWUnXSwgY21kKSkge1xuICAgIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG4gIH1cbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgZXNwcmVzc28tc3BlY2lmaWMgY29tbWFuZHNcbmZvciAobGV0IFtjbWQsIGZuXSBvZiBfLnRvUGFpcnMoY29tbWFuZHMpKSB7XG4gIEVzcHJlc3NvRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBFc3ByZXNzb0RyaXZlcjtcbiJdLCJmaWxlIjoibGliL2RyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|