appium-uiautomator2-driver 2.0.3 → 2.0.6
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/README.md +7 -0
- package/build/lib/commands/element.js +2 -6
- package/build/lib/commands/general.js +8 -12
- package/build/lib/commands/screenshot.js +3 -7
- package/build/lib/commands/touch.js +4 -11
- package/build/lib/driver.js +52 -73
- package/build/lib/uiautomator2.js +29 -39
- package/lib/commands/element.js +1 -3
- package/lib/commands/general.js +7 -8
- package/lib/commands/screenshot.js +3 -5
- package/lib/commands/touch.js +3 -5
- package/lib/driver.js +53 -52
- package/lib/uiautomator2.js +28 -27
- package/npm-shrinkwrap.json +496 -280
- package/package.json +5 -5
|
@@ -15,8 +15,6 @@ var _baseDriver = require("@appium/base-driver");
|
|
|
15
15
|
|
|
16
16
|
var _asyncbox = require("asyncbox");
|
|
17
17
|
|
|
18
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
19
|
-
|
|
20
18
|
var _appiumUiautomator2Server = require("appium-uiautomator2-server");
|
|
21
19
|
|
|
22
20
|
var _support = require("@appium/support");
|
|
@@ -54,7 +52,7 @@ class UIA2Proxy extends _baseDriver.JWProxy {
|
|
|
54
52
|
}
|
|
55
53
|
|
|
56
54
|
class UiAutomator2Server {
|
|
57
|
-
constructor(opts = {}) {
|
|
55
|
+
constructor(log, opts = {}) {
|
|
58
56
|
for (let req of REQD_PARAMS) {
|
|
59
57
|
if (!opts || !_support.util.hasValue(opts[req])) {
|
|
60
58
|
throw new Error(`Option '${req}' is required!`);
|
|
@@ -63,8 +61,10 @@ class UiAutomator2Server {
|
|
|
63
61
|
this[req] = opts[req];
|
|
64
62
|
}
|
|
65
63
|
|
|
64
|
+
this.log = log;
|
|
66
65
|
this.disableSuppressAccessibilityService = opts.disableSuppressAccessibilityService;
|
|
67
66
|
const proxyOpts = {
|
|
67
|
+
log,
|
|
68
68
|
server: this.host,
|
|
69
69
|
port: this.systemPort,
|
|
70
70
|
keepAlive: true
|
|
@@ -94,7 +94,7 @@ class UiAutomator2Server {
|
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
this.log.info(`Server package at '${appPath}' is not writeable. ` + `Will copy it into the temporary location at '${tmpRoot}' as a workaround. ` + `Consider making this file writeable manually in order to improve the performance of session startup.`);
|
|
98
98
|
|
|
99
99
|
const dstPath = _path.default.resolve(tmpRoot, _path.default.basename(appPath));
|
|
100
100
|
|
|
@@ -137,8 +137,7 @@ class UiAutomator2Server {
|
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
const appState = await this.adb.getApplicationInstallState(appPath, appId);
|
|
140
|
-
|
|
141
|
-
_logger.default.debug(`${appId} installation state: ${appState}`);
|
|
140
|
+
this.log.debug(`${appId} installation state: ${appState}`);
|
|
142
141
|
|
|
143
142
|
if (await this.adb.checkApkCert(appPath, appId)) {
|
|
144
143
|
shouldUninstallServerPackages = shouldUninstallServerPackages || [this.adb.APP_INSTALL_STATE.OLDER_VERSION_INSTALLED, this.adb.APP_INSTALL_STATE.NEWER_VERSION_INSTALLED].includes(appState);
|
|
@@ -150,10 +149,10 @@ class UiAutomator2Server {
|
|
|
150
149
|
shouldInstallServerPackages = shouldInstallServerPackages || shouldUninstallServerPackages || [this.adb.APP_INSTALL_STATE.NOT_INSTALLED].includes(appState);
|
|
151
150
|
}
|
|
152
151
|
|
|
153
|
-
|
|
152
|
+
this.log.info(`Server packages are ${shouldInstallServerPackages ? '' : 'not '}going to be (re)installed`);
|
|
154
153
|
|
|
155
154
|
if (shouldInstallServerPackages && shouldUninstallServerPackages) {
|
|
156
|
-
|
|
155
|
+
this.log.info('Full packages reinstall is going to be performed');
|
|
157
156
|
}
|
|
158
157
|
|
|
159
158
|
for (const {
|
|
@@ -164,7 +163,7 @@ class UiAutomator2Server {
|
|
|
164
163
|
try {
|
|
165
164
|
await this.adb.uninstallApk(appId);
|
|
166
165
|
} catch (err) {
|
|
167
|
-
|
|
166
|
+
this.log.warn(`Error uninstalling '${appId}': ${err.message}`);
|
|
168
167
|
}
|
|
169
168
|
}
|
|
170
169
|
|
|
@@ -185,8 +184,7 @@ class UiAutomator2Server {
|
|
|
185
184
|
}
|
|
186
185
|
|
|
187
186
|
async verifyServicesAvailability() {
|
|
188
|
-
|
|
189
|
-
|
|
187
|
+
this.log.debug(`Waiting up to ${SERVICES_LAUNCH_TIMEOUT}ms for services to be available`);
|
|
190
188
|
let isPmServiceAvailable = false;
|
|
191
189
|
let pmOutput = '';
|
|
192
190
|
let pmError = null;
|
|
@@ -208,9 +206,7 @@ class UiAutomator2Server {
|
|
|
208
206
|
pmOutput = '';
|
|
209
207
|
} else if (pmOutput.includes(INSTRUMENTATION_TARGET)) {
|
|
210
208
|
pmOutput = '';
|
|
211
|
-
|
|
212
|
-
_logger.default.debug(`Instrumentation target '${INSTRUMENTATION_TARGET}' is available`);
|
|
213
|
-
|
|
209
|
+
this.log.debug(`Instrumentation target '${INSTRUMENTATION_TARGET}' is available`);
|
|
214
210
|
isPmServiceAvailable = true;
|
|
215
211
|
} else if (!pmError) {
|
|
216
212
|
pmError = new Error('The instrumentation target is not listed by Package Manager');
|
|
@@ -223,13 +219,13 @@ class UiAutomator2Server {
|
|
|
223
219
|
intervalMs: 1000
|
|
224
220
|
});
|
|
225
221
|
} catch (err) {
|
|
226
|
-
|
|
222
|
+
this.log.error(`Unable to find instrumentation target '${INSTRUMENTATION_TARGET}': ${(pmError || {}).message}`);
|
|
227
223
|
|
|
228
224
|
if (pmOutput) {
|
|
229
|
-
|
|
225
|
+
this.log.debug('Available targets:');
|
|
230
226
|
|
|
231
227
|
for (const line of pmOutput.split('\n')) {
|
|
232
|
-
|
|
228
|
+
this.log.debug(` ${line.replace('instrumentation:', '')}`);
|
|
233
229
|
}
|
|
234
230
|
}
|
|
235
231
|
}
|
|
@@ -239,11 +235,10 @@ class UiAutomator2Server {
|
|
|
239
235
|
await this.cleanupAutomationLeftovers();
|
|
240
236
|
|
|
241
237
|
if (caps.skipServerInstallation) {
|
|
242
|
-
|
|
238
|
+
this.log.info(`'skipServerInstallation' is set. Attempting to use UIAutomator2 server from the device`);
|
|
243
239
|
} else {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
_logger.default.info(`Using UIAutomator2 server from '${_appiumUiautomator2Server.SERVER_APK_PATH}' and test from '${_appiumUiautomator2Server.TEST_APK_PATH}'`);
|
|
240
|
+
this.log.info(`Starting UIAutomator2 server ${_appiumUiautomator2Server.version}`);
|
|
241
|
+
this.log.info(`Using UIAutomator2 server from '${_appiumUiautomator2Server.SERVER_APK_PATH}' and test from '${_appiumUiautomator2Server.TEST_APK_PATH}'`);
|
|
247
242
|
}
|
|
248
243
|
|
|
249
244
|
const timeout = caps.uiautomator2ServerLaunchTimeout || SERVER_LAUNCH_TIMEOUT;
|
|
@@ -253,8 +248,7 @@ class UiAutomator2Server {
|
|
|
253
248
|
const delayBetweenRetries = 3000;
|
|
254
249
|
|
|
255
250
|
while (retries < maxRetries) {
|
|
256
|
-
|
|
257
|
-
|
|
251
|
+
this.log.info(`Waiting up to ${timeout}ms for UiAutomator2 to be online...`);
|
|
258
252
|
this.jwproxy.didInstrumentationExit = false;
|
|
259
253
|
await this.startInstrumentationProcess();
|
|
260
254
|
|
|
@@ -272,7 +266,7 @@ class UiAutomator2Server {
|
|
|
272
266
|
intervalMs: 1000
|
|
273
267
|
});
|
|
274
268
|
} catch (err) {
|
|
275
|
-
|
|
269
|
+
this.log.errorAndThrow(`The instrumentation process cannot be initialized within ${timeout}ms timeout. ` + 'Make sure the application under test does not crash and investigate the logcat output. ' + `You could also try to increase the value of 'uiautomator2ServerLaunchTimeout' capability`);
|
|
276
270
|
}
|
|
277
271
|
}
|
|
278
272
|
|
|
@@ -283,17 +277,15 @@ class UiAutomator2Server {
|
|
|
283
277
|
retries++;
|
|
284
278
|
|
|
285
279
|
if (retries >= maxRetries) {
|
|
286
|
-
|
|
280
|
+
this.log.errorAndThrow('The instrumentation process cannot be initialized. ' + 'Make sure the application under test does not crash and investigate the logcat output.');
|
|
287
281
|
}
|
|
288
282
|
|
|
289
|
-
|
|
290
|
-
|
|
283
|
+
this.log.warn(`The instrumentation process has been unexpectedly terminated. ` + `Retrying UiAutomator2 startup (#${retries} of ${maxRetries - 1})`);
|
|
291
284
|
await this.cleanupAutomationLeftovers(true);
|
|
292
285
|
await _bluebird.default.delay(delayBetweenRetries);
|
|
293
286
|
}
|
|
294
287
|
|
|
295
|
-
|
|
296
|
-
|
|
288
|
+
this.log.debug(`The initialization of the instrumentation process took ` + `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
297
289
|
await this.jwproxy.command('/session', 'POST', {
|
|
298
290
|
capabilities: {
|
|
299
291
|
firstMatch: [caps],
|
|
@@ -331,17 +323,17 @@ class UiAutomator2Server {
|
|
|
331
323
|
}
|
|
332
324
|
|
|
333
325
|
async deleteSession() {
|
|
334
|
-
|
|
326
|
+
this.log.debug('Deleting UiAutomator2 server session');
|
|
335
327
|
|
|
336
328
|
try {
|
|
337
329
|
await this.jwproxy.command('/', 'DELETE');
|
|
338
330
|
} catch (err) {
|
|
339
|
-
|
|
331
|
+
this.log.warn(`Did not get confirmation UiAutomator2 deleteSession worked; ` + `Error was: ${err}`);
|
|
340
332
|
}
|
|
341
333
|
}
|
|
342
334
|
|
|
343
335
|
async cleanupAutomationLeftovers(strictCleanup = false) {
|
|
344
|
-
|
|
336
|
+
this.log.debug(`Performing ${strictCleanup ? 'strict' : 'shallow'} cleanup of automation leftovers`);
|
|
345
337
|
|
|
346
338
|
try {
|
|
347
339
|
const {
|
|
@@ -355,17 +347,15 @@ class UiAutomator2Server {
|
|
|
355
347
|
}) => id).filter(Boolean);
|
|
356
348
|
|
|
357
349
|
if (activeSessionIds.length) {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
_logger.default.debug(`Cleaning up ${_support.util.pluralize('obsolete session', activeSessionIds.length, true)}`);
|
|
361
|
-
|
|
350
|
+
this.log.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);
|
|
351
|
+
this.log.debug(`Cleaning up ${_support.util.pluralize('obsolete session', activeSessionIds.length, true)}`);
|
|
362
352
|
await _bluebird.default.all(activeSessionIds.map(id => _axios.default.delete(`http://${this.host}:${this.systemPort}/session/${id}`)));
|
|
363
353
|
await _bluebird.default.delay(1000);
|
|
364
354
|
} else {
|
|
365
|
-
|
|
355
|
+
this.log.debug('No obsolete sessions have been detected');
|
|
366
356
|
}
|
|
367
357
|
} catch (e) {
|
|
368
|
-
|
|
358
|
+
this.log.debug(`No obsolete sessions have been detected (${e.message})`);
|
|
369
359
|
}
|
|
370
360
|
|
|
371
361
|
try {
|
|
@@ -388,4 +378,4 @@ var _default = UiAutomator2Server;
|
|
|
388
378
|
exports.default = _default;require('source-map-support').install();
|
|
389
379
|
|
|
390
380
|
|
|
391
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiY29tbWFuZCIsImluc3RhbGxTZXJ2ZXJBcGsiLCJpbnN0YWxsVGltZW91dCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInBhY2thZ2VJbmZvc01hcHBlciIsImFwcFBhdGgiLCJhcHBJZCIsImhlbHBlcnMiLCJpc1dyaXRlYWJsZSIsImxvZyIsImluZm8iLCJkc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJiYXNlbmFtZSIsImZzIiwiY29weUZpbGUiLCJwYWNrYWdlc0luZm8iLCJCIiwiYWxsIiwibWFwIiwiYXBrUGF0aCIsInRlc3RBcGtQYXRoIiwic2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMiLCJzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMiLCJpc0FwcEluc3RhbGxlZCIsImFkYiIsImNoZWNrQXBrQ2VydCIsInNpZ25BcHAiLCJhcHBTdGF0ZSIsImdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlIiwiZGVidWciLCJBUFBfSU5TVEFMTF9TVEFURSIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJpbmNsdWRlcyIsIk5PVF9JTlNUQUxMRUQiLCJ1bmluc3RhbGxBcGsiLCJlcnIiLCJ3YXJuIiwibWVzc2FnZSIsImluc3RhbGwiLCJub0luY3JlbWVudGFsIiwicmVwbGFjZSIsInRpbWVvdXRDYXBOYW1lIiwicmltcmFmIiwidmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkiLCJpc1BtU2VydmljZUF2YWlsYWJsZSIsInBtT3V0cHV0IiwicG1FcnJvciIsInNoZWxsIiwiZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvciIsImxpbmUiLCJzcGxpdCIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJzZXJ2ZXJWZXJzaW9uIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInJldHJpZXMiLCJtYXhSZXRyaWVzIiwiZGVsYXlCZXR3ZWVuUmV0cmllcyIsInN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsdXJhbGl6ZSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxnQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMsbUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyxtQkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0Qs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QUFULENBQTZCLGFBQTdCLENBQU47QUFDRCxLQUZELENBRUUsT0FBT0QsTUFBUCxFQUFlLENBQUU7QUFDcEI7O0FBM1NzQjs7O2VBK1NWaEksa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge1xuICBTRVJWRVJfQVBLX1BBVEggYXMgYXBrUGF0aCxcbiAgVEVTVF9BUEtfUEFUSCBhcyB0ZXN0QXBrUGF0aCxcbiAgdmVyc2lvbiBhcyBzZXJ2ZXJWZXJzaW9uXG59IGZyb20gJ2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyJztcbmltcG9ydCB7XG4gIHV0aWwsIGxvZ2dlciwgdGVtcERpciwgZnMsIHRpbWluZ1xufSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgUkVRRF9QQVJBTVMgPSBbJ2FkYicsICd0bXBEaXInLCAnaG9zdCcsICdzeXN0ZW1Qb3J0JywgJ2RldmljZVBvcnQnLCAnZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiddO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9SRVRSSUVTID0gMjA7XG5jb25zdCBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX1BBQ0tBR0VfSUQgPSAnaW8uYXBwaXVtLnVpYXV0b21hdG9yMi5zZXJ2ZXInO1xuY29uc3QgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCA9IGAke1NFUlZFUl9QQUNLQUdFX0lEfS50ZXN0YDtcbmNvbnN0IElOU1RSVU1FTlRBVElPTl9UQVJHRVQgPSBgJHtTRVJWRVJfVEVTVF9QQUNLQUdFX0lEfS9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJgO1xuY29uc3QgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyID0gbG9nZ2VyLmdldExvZ2dlcignSW5zdHJ1bWVudGF0aW9uJyk7XG5cbmNsYXNzIFVJQTJQcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBVaUF1dG9tYXRvcjIgc2VydmVyIGJlY2F1c2UgYCArXG4gICAgICAgICd0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcgKHByb2JhYmx5IGNyYXNoZWQpLiAnICtcbiAgICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGFuZC9vciB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdXBlci5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG59XG5cbmNsYXNzIFVpQXV0b21hdG9yMlNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRRF9QQVJBTVMpIHtcbiAgICAgIGlmICghb3B0cyB8fCAhdXRpbC5oYXNWYWx1ZShvcHRzW3JlcV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICcke3JlcX0nIGlzIHJlcXVpcmVkIWApO1xuICAgICAgfVxuICAgICAgdGhpc1tyZXFdID0gb3B0c1tyZXFdO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlID0gb3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBzZXJ2ZXI6IHRoaXMuaG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMuc3lzdGVtUG9ydCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChvcHRzLnJlYWRUaW1lb3V0ICYmIG9wdHMucmVhZFRpbWVvdXQgPiAwKSB7XG4gICAgICBwcm94eU9wdHMudGltZW91dCA9IG9wdHMucmVhZFRpbWVvdXQ7XG4gICAgfVxuICAgIHRoaXMuandwcm94eSA9IG5ldyBVSUEyUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIHRoZSBhcGtzIG9uIHRvIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YWxsVGltZW91dCAtIEluc3RhbGxhdGlvbiB0aW1lb3V0XG4gICAqL1xuICBhc3luYyBpbnN0YWxsU2VydmVyQXBrIChpbnN0YWxsVGltZW91dCA9IFNFUlZFUl9JTlNUQUxMX1JFVFJJRVMgKiAxMDAwKSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvc01hcHBlciA9IGFzeW5jICh7YXBwUGF0aCwgYXBwSWR9KSA9PiB7XG4gICAgICBpZiAoYXdhaXQgaGVscGVycy5pc1dyaXRlYWJsZShhcHBQYXRoKSkge1xuICAgICAgICByZXR1cm4geyBhcHBQYXRoLCBhcHBJZCB9O1xuICAgICAgfVxuXG4gICAgICBsb2cuaW5mbyhgU2VydmVyIHBhY2thZ2UgYXQgJyR7YXBwUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICBgV2lsbCBjb3B5IGl0IGludG8gdGhlIHRlbXBvcmFyeSBsb2NhdGlvbiBhdCAnJHt0bXBSb290fScgYXMgYSB3b3JrYXJvdW5kLiBgICtcbiAgICAgICAgYENvbnNpZGVyIG1ha2luZyB0aGlzIGZpbGUgd3JpdGVhYmxlIG1hbnVhbGx5IGluIG9yZGVyIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHNlc3Npb24gc3RhcnR1cC5gKTtcbiAgICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgcGF0aC5iYXNlbmFtZShhcHBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShhcHBQYXRoLCBkc3RQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFwcFBhdGg6IGRzdFBhdGgsXG4gICAgICAgIGFwcElkLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VzSW5mbyA9IGF3YWl0IEIuYWxsKEIubWFwKFtcbiAgICAgICAge1xuICAgICAgICAgIGFwcFBhdGg6IGFwa1BhdGgsXG4gICAgICAgICAgYXBwSWQ6IFNFUlZFUl9QQUNLQUdFX0lELFxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXBwUGF0aDogdGVzdEFwa1BhdGgsXG4gICAgICAgICAgYXBwSWQ6IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgIH0sXG4gICAgICBdLCBwYWNrYWdlSW5mb3NNYXBwZXIpKTtcblxuICAgICAgbGV0IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gZmFsc2U7XG4gICAgICBsZXQgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IHthcHBJZCwgYXBwUGF0aH0gb2YgcGFja2FnZXNJbmZvKSB7XG4gICAgICAgIGlmIChhcHBJZCA9PT0gU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCkge1xuICAgICAgICAgIGNvbnN0IGlzQXBwSW5zdGFsbGVkID0gYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xuXG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgaW4gZ2V0dGluZyB0aGUgc3RhdGUgZm9yIHRlc3Qgc2VydmVyLFxuICAgICAgICAgIC8vIHNpbmNlIGl0IGRvZXMgbm90IGNvbnRhaW4gdmVyc2lvbiBpbmZvXG4gICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIGFwcFBhdGgpO1xuICAgICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBpc0FwcEluc3RhbGxlZDtcbiAgICAgICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpc0FwcEluc3RhbGxlZCkge1xuICAgICAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlKGFwcFBhdGgsIGFwcElkKTtcbiAgICAgICAgbG9nLmRlYnVnKGAke2FwcElkfSBpbnN0YWxsYXRpb24gc3RhdGU6ICR7YXBwU3RhdGV9YCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBbXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCAhW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYFNlcnZlciBwYWNrYWdlcyBhcmUgJHtzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPyAnJyA6ICdub3QgJ31nb2luZyB0byBiZSAocmUpaW5zdGFsbGVkYCk7XG4gICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzICYmIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKCdGdWxsIHBhY2thZ2VzIHJlaW5zdGFsbCBpcyBnb2luZyB0byBiZSBwZXJmb3JtZWQnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qge2FwcElkLCBhcHBQYXRofSBvZiBwYWNrYWdlc0luZm8pIHtcbiAgICAgICAgaWYgKHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhhcHBJZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2cud2FybihgRXJyb3IgdW5pbnN0YWxsaW5nICcke2FwcElkfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGFwcFBhdGgsIHtcbiAgICAgICAgICAgIG5vSW5jcmVtZW50YWw6IHRydWUsXG4gICAgICAgICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgdGltZW91dDogaW5zdGFsbFRpbWVvdXQsXG4gICAgICAgICAgICB0aW1lb3V0Q2FwTmFtZTogJ3VpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5KCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSAoKSB7XG4gICAgbG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7U0VSVklDRVNfTEFVTkNIX1RJTUVPVVR9bXMgZm9yIHNlcnZpY2VzIHRvIGJlIGF2YWlsYWJsZWApO1xuICAgIGxldCBpc1BtU2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIGxldCBwbU91dHB1dCA9ICcnO1xuICAgIGxldCBwbUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNQbVNlcnZpY2VBdmFpbGFibGUpIHtcbiAgICAgICAgICBwbUVycm9yID0gbnVsbDtcbiAgICAgICAgICBwbU91dHB1dCA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdpbnN0cnVtZW50YXRpb24nXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwbU91dHB1dC5pbmNsdWRlcygnQ291bGQgbm90IGFjY2VzcyB0aGUgUGFja2FnZSBNYW5hZ2VyJykpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoYFByb2JsZW0gcnVubmluZyBQYWNrYWdlIE1hbmFnZXI6ICR7cG1PdXRwdXR9YCk7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgIH0gZWxzZSBpZiAocG1PdXRwdXQuaW5jbHVkZXMoSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCkpIHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgICBsb2cuZGVidWcoYEluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nIGlzIGF2YWlsYWJsZWApO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXNcbiAgICAgICAgICAgIGlzUG1TZXJ2aWNlQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFwbUVycm9yKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gbmV3IEVycm9yKCdUaGUgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCBpcyBub3QgbGlzdGVkIGJ5IFBhY2thZ2UgTWFuYWdlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNQbVNlcnZpY2VBdmFpbGFibGU7XG4gICAgICB9LCB7XG4gICAgICAgIHdhaXRNczogU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQsXG4gICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcihgVW5hYmxlIHRvIGZpbmQgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfSc6ICR7KHBtRXJyb3IgfHwge30pLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAocG1PdXRwdXQpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdBdmFpbGFibGUgdGFyZ2V0czonKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHBtT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgICAgICR7bGluZS5yZXBsYWNlKCdpbnN0cnVtZW50YXRpb246JywgJycpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uIChjYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycygpO1xuICAgIGlmIChjYXBzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24pIHtcbiAgICAgIGxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBBdHRlbXB0aW5nIHRvIHVzZSBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gdGhlIGRldmljZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgU3RhcnRpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciAke3NlcnZlclZlcnNpb259YCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tICcke2Fwa1BhdGh9JyBhbmQgdGVzdCBmcm9tICcke3Rlc3RBcGtQYXRofSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gY2Fwcy51aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IHx8IFNFUlZFUl9MQVVOQ0hfVElNRU9VVDtcbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGxldCByZXRyaWVzID0gMDtcbiAgICBjb25zdCBtYXhSZXRyaWVzID0gMjtcbiAgICBjb25zdCBkZWxheUJldHdlZW5SZXRyaWVzID0gMzAwMDtcbiAgICB3aGlsZSAocmV0cmllcyA8IG1heFJldHJpZXMpIHtcbiAgICAgIGxvZy5pbmZvKGBXYWl0aW5nIHVwIHRvICR7dGltZW91dH1tcyBmb3IgVWlBdXRvbWF0b3IyIHRvIGJlIG9ubGluZS4uLmApO1xuICAgICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzKCk7XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gc2hvcnQgY2lyY3VpdCB0byByZXRyeSBvciBmYWlsIGZhc3RcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkIHdpdGhpbiAke3RpbWVvdXR9bXMgdGltZW91dC4gYFxuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4gJ1xuICAgICAgICAgICAgKyBgWW91IGNvdWxkIGFsc28gdHJ5IHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiAndWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXRyaWVzKys7XG4gICAgICBpZiAocmV0cmllcyA+PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KCdUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkLiAnXG4gICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4nKTtcbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaGFzIGJlZW4gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQuIGBcbiAgICAgICAgKyBgUmV0cnlpbmcgVWlBdXRvbWF0b3IyIHN0YXJ0dXAgKCMke3JldHJpZXN9IG9mICR7bWF4UmV0cmllcyAtIDF9KWApO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyh0cnVlKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoZGVsYXlCZXR3ZWVuUmV0cmllcyk7XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKGBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIHRvb2sgYFxuICAgICAgKyBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBmaXJzdE1hdGNoOiBbY2Fwc10sXG4gICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyAoKSB7XG4gICAgY29uc3QgY21kID0gWydhbScsICdpbnN0cnVtZW50JywgJy13J107XG4gICAgaWYgKHRoaXMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgY21kLnB1c2goJy0tbm8td2luZG93LWFuaW1hdGlvbicpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZSBHb29nbGUgYW5hbHl0aWNzIHRvIHByZXZlbnQgcG9zc2libGUgZmF0YWwgZXhjZXB0aW9uXG4gICAgY21kLnB1c2goJy1lJywgJ2Rpc2FibGVBbmFseXRpY3MnLCB0cnVlKTtcbiAgICBjbWQucHVzaChJTlNUUlVNRU5UQVRJT05fVEFSR0VUKTtcbiAgICBjb25zdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzID0gdGhpcy5hZGIuY3JlYXRlU3ViUHJvY2VzcyhbJ3NoZWxsJywgLi4uY21kXSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKGBUaGUgcHJvY2VzcyBoYXMgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IHRydWU7XG4gICAgfSk7XG4gICAgYXdhaXQgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZy5kZWJ1ZygnRGVsZXRpbmcgVWlBdXRvbWF0b3IyIHNlcnZlciBzZXNzaW9uJyk7XG4gICAgLy8gcmVseSBvbiBqd3Byb3h5J3MgaW50ZWxsaWdlbmNlIHRvIGtub3cgd2hhdCB3ZSdyZSB0YWxraW5nIGFib3V0IGFuZFxuICAgIC8vIGRlbGV0ZSB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvJywgJ0RFTEVURScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYERpZCBub3QgZ2V0IGNvbmZpcm1hdGlvbiBVaUF1dG9tYXRvcjIgZGVsZXRlU2Vzc2lvbiB3b3JrZWQ7IGAgK1xuICAgICAgICAgIGBFcnJvciB3YXM6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIChzdHJpY3RDbGVhbnVwID0gZmFsc2UpIHtcbiAgICBsb2cuZGVidWcoYFBlcmZvcm1pbmcgJHtzdHJpY3RDbGVhbnVwID8gJ3N0cmljdCcgOiAnc2hhbGxvdyd9IGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnNgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vc2Vzc2lvbnNgLFxuICAgICAgICB0aW1lb3V0OiA1MDAsXG4gICAgICB9KSkuZGF0YTtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZHMgPSB2YWx1ZS5tYXAoKHtpZH0pID0+IGlkKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYWN0aXZlU2Vzc2lvbklkcy5sZW5ndGgpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZm9sbG93aW5nIG9ic29sZXRlIHNlc3Npb25zIGFyZSBzdGlsbCBydW5uaW5nOiAke0pTT04uc3RyaW5naWZ5KGFjdGl2ZVNlc3Npb25JZHMpfWApO1xuICAgICAgICBsb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ29ic29sZXRlIHNlc3Npb24nLCBhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICAgIGF3YWl0IEIuYWxsKGFjdGl2ZVNlc3Npb25JZHNcbiAgICAgICAgICAubWFwKChpZCkgPT4gYXhpb3MuZGVsZXRlKGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS9zZXNzaW9uLyR7aWR9YCkpXG4gICAgICAgICk7XG4gICAgICAgIC8vIExldCBhbGwgc2Vzc2lvbnMgdG8gYmUgcHJvcGVybHkgdGVybWluYXRlZCBiZWZvcmUgY29udGludWluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKCdObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoYE5vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgIGlmICghc3RyaWN0Q2xlYW51cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTA3NDlcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbFByb2Nlc3Nlc0J5TmFtZSgndWlhdXRvbWF0b3InKTtcbiAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gIH1cbn1cblxuZXhwb3J0IHsgVWlBdXRvbWF0b3IyU2VydmVyLCBJTlNUUlVNRU5UQVRJT05fVEFSR0VULCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCB9O1xuZXhwb3J0IGRlZmF1bHQgVWlBdXRvbWF0b3IyU2VydmVyO1xuIl0sImZpbGUiOiJsaWIvdWlhdXRvbWF0b3IyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
381
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwibG9nIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiY29tbWFuZCIsImluc3RhbGxTZXJ2ZXJBcGsiLCJpbnN0YWxsVGltZW91dCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInBhY2thZ2VJbmZvc01hcHBlciIsImFwcFBhdGgiLCJhcHBJZCIsImhlbHBlcnMiLCJpc1dyaXRlYWJsZSIsImluZm8iLCJkc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJiYXNlbmFtZSIsImZzIiwiY29weUZpbGUiLCJwYWNrYWdlc0luZm8iLCJCIiwiYWxsIiwibWFwIiwiYXBrUGF0aCIsInRlc3RBcGtQYXRoIiwic2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMiLCJzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMiLCJpc0FwcEluc3RhbGxlZCIsImFkYiIsImNoZWNrQXBrQ2VydCIsInNpZ25BcHAiLCJhcHBTdGF0ZSIsImdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlIiwiZGVidWciLCJBUFBfSU5TVEFMTF9TVEFURSIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJpbmNsdWRlcyIsIk5PVF9JTlNUQUxMRUQiLCJ1bmluc3RhbGxBcGsiLCJlcnIiLCJ3YXJuIiwibWVzc2FnZSIsImluc3RhbGwiLCJub0luY3JlbWVudGFsIiwicmVwbGFjZSIsInRpbWVvdXRDYXBOYW1lIiwicmltcmFmIiwidmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkiLCJpc1BtU2VydmljZUF2YWlsYWJsZSIsInBtT3V0cHV0IiwicG1FcnJvciIsInNoZWxsIiwiZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvciIsImxpbmUiLCJzcGxpdCIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJzZXJ2ZXJWZXJzaW9uIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInJldHJpZXMiLCJtYXhSZXRyaWVzIiwiZGVsYXlCZXR3ZWVuUmV0cmllcyIsInN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsdXJhbGl6ZSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxnQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMsbUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyxtQkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0QsV0FBTyxN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Q0Q7QUFDRixLQWpCRCxDQWlCRSxPQUFPb0IsQ0FBUCxFQUFVO0FBQ1YsV0FBS3RFLEdBQUwsQ0FBU2tELEtBQVQsQ0FBZ0IsNENBQTJDb0IsQ0FBQyxDQUFDWCxPQUFRLEdBQXJFO0FBQ0Q7O0FBRUQsUUFBSTtBQUNGLFlBQU0sS0FBS2QsR0FBTCxDQUFTZ0YsU0FBVCxDQUFtQjdJLHNCQUFuQixDQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU84SSxNQUFQLEVBQWUsQ0FBRTs7QUFDbkIsUUFBSSxDQUFDZCxhQUFMLEVBQW9CO0FBQ2xCO0FBQ0Q7O0FBRUQsUUFBSTtBQUNGLFlBQU0sS0FBS25FLEdBQUwsQ0FBU2tGLG1CQUFULENBQTZCLGFBQTdCLENBQU47QUFDRCxLQUZELENBRUUsT0FBT0QsTUFBUCxFQUFlLENBQUU7QUFDcEI7O0FBN1NzQjs7O2VBaVRWaEksa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHtcbiAgU0VSVkVSX0FQS19QQVRIIGFzIGFwa1BhdGgsXG4gIFRFU1RfQVBLX1BBVEggYXMgdGVzdEFwa1BhdGgsXG4gIHZlcnNpb24gYXMgc2VydmVyVmVyc2lvblxufSBmcm9tICdhcHBpdW0tdWlhdXRvbWF0b3IyLXNlcnZlcic7XG5pbXBvcnQge1xuICB1dGlsLCBsb2dnZXIsIHRlbXBEaXIsIGZzLCB0aW1pbmdcbn0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IFJFUURfUEFSQU1TID0gWydhZGInLCAndG1wRGlyJywgJ2hvc3QnLCAnc3lzdGVtUG9ydCcsICdkZXZpY2VQb3J0JywgJ2Rpc2FibGVXaW5kb3dBbmltYXRpb24nXTtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX0lOU1RBTExfUkVUUklFUyA9IDIwO1xuY29uc3QgU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNFUlZFUl9QQUNLQUdFX0lEID0gJ2lvLmFwcGl1bS51aWF1dG9tYXRvcjIuc2VydmVyJztcbmNvbnN0IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgPSBgJHtTRVJWRVJfUEFDS0FHRV9JRH0udGVzdGA7XG5jb25zdCBJTlNUUlVNRU5UQVRJT05fVEFSR0VUID0gYCR7U0VSVkVSX1RFU1RfUEFDS0FHRV9JRH0vYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyYDtcbmNvbnN0IGluc3RydW1lbnRhdGlvbkxvZ2dlciA9IGxvZ2dlci5nZXRMb2dnZXIoJ0luc3RydW1lbnRhdGlvbicpO1xuXG5jbGFzcyBVSUEyUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgYXN5bmMgcHJveHlDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoXG4gICAgICAgIGAnJHttZXRob2R9ICR7dXJsfScgY2Fubm90IGJlIHByb3hpZWQgdG8gVWlBdXRvbWF0b3IyIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICAndGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gJyArXG4gICAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBhbmQvb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBVaUF1dG9tYXRvcjJTZXJ2ZXIge1xuICBjb25zdHJ1Y3RvciAobG9nLCBvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRRF9QQVJBTVMpIHtcbiAgICAgIGlmICghb3B0cyB8fCAhdXRpbC5oYXNWYWx1ZShvcHRzW3JlcV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICcke3JlcX0nIGlzIHJlcXVpcmVkIWApO1xuICAgICAgfVxuICAgICAgdGhpc1tyZXFdID0gb3B0c1tyZXFdO1xuICAgIH1cbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlID0gb3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBsb2csXG4gICAgICBzZXJ2ZXI6IHRoaXMuaG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMuc3lzdGVtUG9ydCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChvcHRzLnJlYWRUaW1lb3V0ICYmIG9wdHMucmVhZFRpbWVvdXQgPiAwKSB7XG4gICAgICBwcm94eU9wdHMudGltZW91dCA9IG9wdHMucmVhZFRpbWVvdXQ7XG4gICAgfVxuICAgIHRoaXMuandwcm94eSA9IG5ldyBVSUEyUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIHRoZSBhcGtzIG9uIHRvIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YWxsVGltZW91dCAtIEluc3RhbGxhdGlvbiB0aW1lb3V0XG4gICAqL1xuICBhc3luYyBpbnN0YWxsU2VydmVyQXBrIChpbnN0YWxsVGltZW91dCA9IFNFUlZFUl9JTlNUQUxMX1JFVFJJRVMgKiAxMDAwKSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvc01hcHBlciA9IGFzeW5jICh7YXBwUGF0aCwgYXBwSWR9KSA9PiB7XG4gICAgICBpZiAoYXdhaXQgaGVscGVycy5pc1dyaXRlYWJsZShhcHBQYXRoKSkge1xuICAgICAgICByZXR1cm4geyBhcHBQYXRoLCBhcHBJZCB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5pbmZvKGBTZXJ2ZXIgcGFja2FnZSBhdCAnJHthcHBQYXRofScgaXMgbm90IHdyaXRlYWJsZS4gYCArXG4gICAgICAgIGBXaWxsIGNvcHkgaXQgaW50byB0aGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGF0ICcke3RtcFJvb3R9JyBhcyBhIHdvcmthcm91bmQuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgbWFraW5nIHRoaXMgZmlsZSB3cml0ZWFibGUgbWFudWFsbHkgaW4gb3JkZXIgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2Ygc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgY29uc3QgZHN0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwcFBhdGgpKTtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKGFwcFBhdGgsIGRzdFBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwUGF0aDogZHN0UGF0aCxcbiAgICAgICAgYXBwSWQsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZXNJbmZvID0gYXdhaXQgQi5hbGwoQi5tYXAoW1xuICAgICAgICB7XG4gICAgICAgICAgYXBwUGF0aDogYXBrUGF0aCxcbiAgICAgICAgICBhcHBJZDogU0VSVkVSX1BBQ0tBR0VfSUQsXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBhcHBQYXRoOiB0ZXN0QXBrUGF0aCxcbiAgICAgICAgICBhcHBJZDogU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCxcbiAgICAgICAgfSxcbiAgICAgIF0sIHBhY2thZ2VJbmZvc01hcHBlcikpO1xuXG4gICAgICBsZXQgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBmYWxzZTtcbiAgICAgIGxldCBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qge2FwcElkLCBhcHBQYXRofSBvZiBwYWNrYWdlc0luZm8pIHtcbiAgICAgICAgaWYgKGFwcElkID09PSBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEKSB7XG4gICAgICAgICAgY29uc3QgaXNBcHBJbnN0YWxsZWQgPSBhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCk7XG5cbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBpbiBnZXR0aW5nIHRoZSBzdGF0ZSBmb3IgdGVzdCBzZXJ2ZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lcyBub3QgY29udGFpbiB2ZXJzaW9uIGluZm9cbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChhcHBQYXRoLCBhcHBJZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgICBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IGlzQXBwSW5zdGFsbGVkO1xuICAgICAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzQXBwSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUoYXBwUGF0aCwgYXBwSWQpO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgJHthcHBJZH0gaW5zdGFsbGF0aW9uIHN0YXRlOiAke2FwcFN0YXRlfWApO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIGFwcFBhdGgpO1xuICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgIVtcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgICAgXS5pbmNsdWRlcyhhcHBTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IFtcbiAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVELFxuICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmluZm8oYFNlcnZlciBwYWNrYWdlcyBhcmUgJHtzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPyAnJyA6ICdub3QgJ31nb2luZyB0byBiZSAocmUpaW5zdGFsbGVkYCk7XG4gICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzICYmIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ0Z1bGwgcGFja2FnZXMgcmVpbnN0YWxsIGlzIGdvaW5nIHRvIGJlIHBlcmZvcm1lZCcpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7YXBwSWQsIGFwcFBhdGh9IG9mIHBhY2thZ2VzSW5mbykge1xuICAgICAgICBpZiAoc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKGFwcElkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLndhcm4oYEVycm9yIHVuaW5zdGFsbGluZyAnJHthcHBJZH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuaW5zdGFsbChhcHBQYXRoLCB7XG4gICAgICAgICAgICBub0luY3JlbWVudGFsOiB0cnVlLFxuICAgICAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGluc3RhbGxUaW1lb3V0LFxuICAgICAgICAgICAgdGltZW91dENhcE5hbWU6ICd1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSgpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkgKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7U0VSVklDRVNfTEFVTkNIX1RJTUVPVVR9bXMgZm9yIHNlcnZpY2VzIHRvIGJlIGF2YWlsYWJsZWApO1xuICAgIGxldCBpc1BtU2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIGxldCBwbU91dHB1dCA9ICcnO1xuICAgIGxldCBwbUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNQbVNlcnZpY2VBdmFpbGFibGUpIHtcbiAgICAgICAgICBwbUVycm9yID0gbnVsbDtcbiAgICAgICAgICBwbU91dHB1dCA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdpbnN0cnVtZW50YXRpb24nXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwbU91dHB1dC5pbmNsdWRlcygnQ291bGQgbm90IGFjY2VzcyB0aGUgUGFja2FnZSBNYW5hZ2VyJykpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoYFByb2JsZW0gcnVubmluZyBQYWNrYWdlIE1hbmFnZXI6ICR7cG1PdXRwdXR9YCk7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgIH0gZWxzZSBpZiAocG1PdXRwdXQuaW5jbHVkZXMoSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCkpIHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfScgaXMgYXZhaWxhYmxlYCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgICAgICAgaXNQbVNlcnZpY2VBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXBtRXJyb3IpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBpbnN0cnVtZW50YXRpb24gdGFyZ2V0IGlzIG5vdCBsaXN0ZWQgYnkgUGFja2FnZSBNYW5hZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1BtU2VydmljZUF2YWlsYWJsZTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYFVuYWJsZSB0byBmaW5kIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nOiAkeyhwbUVycm9yIHx8IHt9KS5tZXNzYWdlfWApO1xuICAgICAgaWYgKHBtT3V0cHV0KSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdBdmFpbGFibGUgdGFyZ2V0czonKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHBtT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGAgICAgJHtsaW5lLnJlcGxhY2UoJ2luc3RydW1lbnRhdGlvbjonLCAnJyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzKCk7XG4gICAgaWYgKGNhcHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24nIGlzIHNldC4gQXR0ZW1wdGluZyB0byB1c2UgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tIHRoZSBkZXZpY2VgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciAke3NlcnZlclZlcnNpb259YCk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gJyR7YXBrUGF0aH0nIGFuZCB0ZXN0IGZyb20gJyR7dGVzdEFwa1BhdGh9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXQgPSBjYXBzLnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQgfHwgU0VSVkVSX0xBVU5DSF9USU1FT1VUO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSAyO1xuICAgIGNvbnN0IGRlbGF5QmV0d2VlblJldHJpZXMgPSAzMDAwO1xuICAgIHdoaWxlIChyZXRyaWVzIDwgbWF4UmV0cmllcykge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXR9bXMgZm9yIFVpQXV0b21hdG9yMiB0byBiZSBvbmxpbmUuLi5gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcygpO1xuICAgICAgaWYgKCF0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIHNob3J0IGNpcmN1aXQgdG8gcmV0cnkgb3IgZmFpbCBmYXN0XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkIHdpdGhpbiAke3RpbWVvdXR9bXMgdGltZW91dC4gYFxuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4gJ1xuICAgICAgICAgICAgKyBgWW91IGNvdWxkIGFsc28gdHJ5IHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiAndWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXRyaWVzKys7XG4gICAgICBpZiAocmV0cmllcyA+PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ1RoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuICdcbiAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LicpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cud2FybihgVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyBiZWVuIHVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkLiBgXG4gICAgICAgICsgYFJldHJ5aW5nIFVpQXV0b21hdG9yMiBzdGFydHVwICgjJHtyZXRyaWVzfSBvZiAke21heFJldHJpZXMgLSAxfSlgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnModHJ1ZSk7XG4gICAgICBhd2FpdCBCLmRlbGF5KGRlbGF5QmV0d2VlblJldHJpZXMpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIHRvb2sgYFxuICAgICAgKyBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBmaXJzdE1hdGNoOiBbY2Fwc10sXG4gICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyAoKSB7XG4gICAgY29uc3QgY21kID0gWydhbScsICdpbnN0cnVtZW50JywgJy13J107XG4gICAgaWYgKHRoaXMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgY21kLnB1c2goJy0tbm8td2luZG93LWFuaW1hdGlvbicpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZSBHb29nbGUgYW5hbHl0aWNzIHRvIHByZXZlbnQgcG9zc2libGUgZmF0YWwgZXhjZXB0aW9uXG4gICAgY21kLnB1c2goJy1lJywgJ2Rpc2FibGVBbmFseXRpY3MnLCB0cnVlKTtcbiAgICBjbWQucHVzaChJTlNUUlVNRU5UQVRJT05fVEFSR0VUKTtcbiAgICBjb25zdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzID0gdGhpcy5hZGIuY3JlYXRlU3ViUHJvY2VzcyhbJ3NoZWxsJywgLi4uY21kXSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKGBUaGUgcHJvY2VzcyBoYXMgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IHRydWU7XG4gICAgfSk7XG4gICAgYXdhaXQgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2VydmVyIHNlc3Npb24nKTtcbiAgICAvLyByZWx5IG9uIGp3cHJveHkncyBpbnRlbGxpZ2VuY2UgdG8ga25vdyB3aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYW5kXG4gICAgLy8gZGVsZXRlIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBEaWQgbm90IGdldCBjb25maXJtYXRpb24gVWlBdXRvbWF0b3IyIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyAoc3RyaWN0Q2xlYW51cCA9IGZhbHNlKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYFBlcmZvcm1pbmcgJHtzdHJpY3RDbGVhbnVwID8gJ3N0cmljdCcgOiAnc2hhbGxvdyd9IGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnNgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vc2Vzc2lvbnNgLFxuICAgICAgICB0aW1lb3V0OiA1MDAsXG4gICAgICB9KSkuZGF0YTtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZHMgPSB2YWx1ZS5tYXAoKHtpZH0pID0+IGlkKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYWN0aXZlU2Vzc2lvbklkcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgb2Jzb2xldGUgc2Vzc2lvbnMgYXJlIHN0aWxsIHJ1bm5pbmc6ICR7SlNPTi5zdHJpbmdpZnkoYWN0aXZlU2Vzc2lvbklkcyl9YCk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyB1cCAke3V0aWwucGx1cmFsaXplKCdvYnNvbGV0ZSBzZXNzaW9uJywgYWN0aXZlU2Vzc2lvbklkcy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgICBhd2FpdCBCLmFsbChhY3RpdmVTZXNzaW9uSWRzXG4gICAgICAgICAgLm1hcCgoaWQpID0+IGF4aW9zLmRlbGV0ZShgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vc2Vzc2lvbi8ke2lkfWApKVxuICAgICAgICApO1xuICAgICAgICAvLyBMZXQgYWxsIHNlc3Npb25zIHRvIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcChTRVJWRVJfVEVTVF9QQUNLQUdFX0lEKTtcbiAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgaWYgKCFzdHJpY3RDbGVhbnVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMDc0OVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5raWxsUHJvY2Vzc2VzQnlOYW1lKCd1aWF1dG9tYXRvcicpO1xuICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgfVxufVxuXG5leHBvcnQgeyBVaUF1dG9tYXRvcjJTZXJ2ZXIsIElOU1RSVU1FTlRBVElPTl9UQVJHRVQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIH07XG5leHBvcnQgZGVmYXVsdCBVaUF1dG9tYXRvcjJTZXJ2ZXI7XG4iXSwiZmlsZSI6ImxpYi91aWF1dG9tYXRvcjIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/lib/commands/element.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import log from '../logger';
|
|
2
1
|
import _ from 'lodash';
|
|
3
2
|
import { util } from '@appium/support';
|
|
4
3
|
import { PROTOCOLS, W3C_ELEMENT_KEY } from '@appium/base-driver';
|
|
@@ -34,7 +33,6 @@ commands.getName = async function (elementId) {
|
|
|
34
33
|
};
|
|
35
34
|
|
|
36
35
|
commands.getLocation = async function (elementId) {
|
|
37
|
-
log.info(`calling get location: ${elementId}`);
|
|
38
36
|
return await this.uiautomator2.jwproxy.command(`/element/${elementId}/location`, 'GET', {});
|
|
39
37
|
};
|
|
40
38
|
|
|
@@ -113,7 +111,7 @@ commands.clear = async function (elementId) {
|
|
|
113
111
|
|
|
114
112
|
commands.getElementRect = async function (elementId) {
|
|
115
113
|
if (this.isWebContext()) {
|
|
116
|
-
log.debug(`Detected downstream chromedriver protocol: ${this.chromedriver.jwproxy.downstreamProtocol}`);
|
|
114
|
+
this.log.debug(`Detected downstream chromedriver protocol: ${this.chromedriver.jwproxy.downstreamProtocol}`);
|
|
117
115
|
if (this.chromedriver.jwproxy.downstreamProtocol === PROTOCOLS.MJSONWP) {
|
|
118
116
|
const {x, y} = await this.chromedriver.jwproxy.command(`/element/${elementId}/location`, 'GET');
|
|
119
117
|
const {width, height} = await this.chromedriver.jwproxy.command(`/element/${elementId}/size`, 'GET');
|
package/lib/commands/general.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
-
import log from '../logger';
|
|
3
2
|
import B from 'bluebird';
|
|
4
3
|
import { errors } from '@appium/base-driver';
|
|
5
4
|
import { fs, tempDir } from '@appium/support';
|
|
@@ -26,7 +25,7 @@ commands.doSendKeys = async function (params) {
|
|
|
26
25
|
|
|
27
26
|
// uiautomator2 doesn't support metastate for keyevents
|
|
28
27
|
commands.keyevent = async function (keycode, metastate) {
|
|
29
|
-
log.debug(`Ignoring metastate ${metastate}`);
|
|
28
|
+
this.log.debug(`Ignoring metastate ${metastate}`);
|
|
30
29
|
await this.adb.keyevent(keycode);
|
|
31
30
|
};
|
|
32
31
|
|
|
@@ -38,7 +37,7 @@ commands.back = async function () {
|
|
|
38
37
|
commands.getStrings = async function (language) {
|
|
39
38
|
if (!language) {
|
|
40
39
|
language = await this.adb.getDeviceLanguage();
|
|
41
|
-
log.info(`No language specified, returning strings for: ${language}`);
|
|
40
|
+
this.log.info(`No language specified, returning strings for: ${language}`);
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
// Clients require the resulting mapping to have both keys
|
|
@@ -57,7 +56,7 @@ commands.getStrings = async function (language) {
|
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
if (!this.opts.app && !this.opts.appPackage) {
|
|
60
|
-
log.errorAndThrow("One of 'app' or 'appPackage' capabilities should must be specified");
|
|
59
|
+
this.log.errorAndThrow("One of 'app' or 'appPackage' capabilities should must be specified");
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
let app = this.opts.app;
|
|
@@ -67,12 +66,12 @@ commands.getStrings = async function (language) {
|
|
|
67
66
|
try {
|
|
68
67
|
app = await this.adb.pullApk(this.opts.appPackage, tmpRoot);
|
|
69
68
|
} catch (err) {
|
|
70
|
-
log.errorAndThrow(`Failed to pull an apk from '${this.opts.appPackage}'. Original error: ${err.message}`);
|
|
69
|
+
this.log.errorAndThrow(`Failed to pull an apk from '${this.opts.appPackage}'. Original error: ${err.message}`);
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
if (!await fs.exists(app)) {
|
|
75
|
-
log.errorAndThrow(`The app at '${app}' does not exist`);
|
|
74
|
+
this.log.errorAndThrow(`The app at '${app}' does not exist`);
|
|
76
75
|
}
|
|
77
76
|
|
|
78
77
|
try {
|
|
@@ -80,7 +79,7 @@ commands.getStrings = async function (language) {
|
|
|
80
79
|
this.apkStrings[language] = apkStrings;
|
|
81
80
|
return preprocessStringsMap(apkStrings);
|
|
82
81
|
} catch (err) {
|
|
83
|
-
log.errorAndThrow(`Cannot extract strings from '${app}'. Original error: ${err.message}`);
|
|
82
|
+
this.log.errorAndThrow(`Cannot extract strings from '${app}'. Original error: ${err.message}`);
|
|
84
83
|
}
|
|
85
84
|
} finally {
|
|
86
85
|
await fs.rimraf(tmpRoot);
|
|
@@ -285,7 +284,7 @@ commands.mobileType = async function mobileType (opts = {}) {
|
|
|
285
284
|
text,
|
|
286
285
|
} = opts;
|
|
287
286
|
if (_.isUndefined(text)) {
|
|
288
|
-
log.errorAndThrow(`The 'text' argument is mandatory`);
|
|
287
|
+
this.log.errorAndThrow(`The 'text' argument is mandatory`);
|
|
289
288
|
}
|
|
290
289
|
return await this.adb.typeUnicode(text);
|
|
291
290
|
};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
let commands = {};
|
|
1
|
+
const commands = {};
|
|
4
2
|
|
|
5
3
|
commands.getScreenshot = async function () {
|
|
6
4
|
if (this.mjpegStream) {
|
|
@@ -8,8 +6,8 @@ commands.getScreenshot = async function () {
|
|
|
8
6
|
if (data) {
|
|
9
7
|
return data;
|
|
10
8
|
}
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
this.log.warn('Tried to get screenshot from active MJPEG stream, but there ' +
|
|
10
|
+
'was no data yet. Falling back to regular screenshot methods.');
|
|
13
11
|
}
|
|
14
12
|
return await this.uiautomator2.jwproxy.command('/screenshot', 'GET');
|
|
15
13
|
};
|
package/lib/commands/touch.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import log from '../logger';
|
|
2
|
-
|
|
3
1
|
let commands = {}, extensions = {};
|
|
4
2
|
|
|
5
3
|
commands.doPerformMultiAction = async function (elementId, states) {
|
|
@@ -20,7 +18,7 @@ commands.doPerformMultiAction = async function (elementId, states) {
|
|
|
20
18
|
};
|
|
21
19
|
|
|
22
20
|
commands.performActions = async function (actions) {
|
|
23
|
-
log.debug(`Received the following W3C actions: ${JSON.stringify(actions, null, ' ')}`);
|
|
21
|
+
this.log.debug(`Received the following W3C actions: ${JSON.stringify(actions, null, ' ')}`);
|
|
24
22
|
// This is mandatory, since Selenium API uses MOUSE as the default pointer type
|
|
25
23
|
const preprocessedActions = actions
|
|
26
24
|
.map((action) => Object.assign({}, action, action.type === 'pointer' ? {
|
|
@@ -28,8 +26,8 @@ commands.performActions = async function (actions) {
|
|
|
28
26
|
pointerType: 'touch'
|
|
29
27
|
}
|
|
30
28
|
} : {}));
|
|
31
|
-
log.debug(`Preprocessed actions: ${JSON.stringify(preprocessedActions, null, ' ')}`);
|
|
32
|
-
return await this.uiautomator2.jwproxy.command('/actions', 'POST', {actions});
|
|
29
|
+
this.log.debug(`Preprocessed actions: ${JSON.stringify(preprocessedActions, null, ' ')}`);
|
|
30
|
+
return await this.uiautomator2.jwproxy.command('/actions', 'POST', {actions: preprocessedActions});
|
|
33
31
|
};
|
|
34
32
|
|
|
35
33
|
Object.assign(extensions, commands);
|