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
|
@@ -13,8 +13,6 @@ var _baseDriver = require("@appium/base-driver");
|
|
|
13
13
|
|
|
14
14
|
var _asyncbox = require("asyncbox");
|
|
15
15
|
|
|
16
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
17
|
-
|
|
18
16
|
var _serverBuilder = require("./server-builder");
|
|
19
17
|
|
|
20
18
|
var _path = _interopRequireDefault(require("path"));
|
|
@@ -57,7 +55,7 @@ class EspressoProxy extends _baseDriver.JWProxy {
|
|
|
57
55
|
}
|
|
58
56
|
|
|
59
57
|
class EspressoRunner {
|
|
60
|
-
constructor(opts = {}) {
|
|
58
|
+
constructor(log, opts = {}) {
|
|
61
59
|
for (let req of REQUIRED_PARAMS) {
|
|
62
60
|
if (!opts || !_support.util.hasValue(opts[req])) {
|
|
63
61
|
throw new Error(`Option '${req}' is required!`);
|
|
@@ -66,7 +64,9 @@ class EspressoRunner {
|
|
|
66
64
|
this[req] = opts[req];
|
|
67
65
|
}
|
|
68
66
|
|
|
67
|
+
this.log = log;
|
|
69
68
|
this.jwproxy = new EspressoProxy({
|
|
69
|
+
log,
|
|
70
70
|
server: this.host,
|
|
71
71
|
port: this.systemPort,
|
|
72
72
|
base: '',
|
|
@@ -104,15 +104,12 @@ class EspressoRunner {
|
|
|
104
104
|
|
|
105
105
|
async isAppPackageChanged() {
|
|
106
106
|
if (!(await this.adb.fileExists(TARGET_PACKAGE_CONTAINER))) {
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
this.log.debug('The previous target application package is unknown');
|
|
109
108
|
return true;
|
|
110
109
|
}
|
|
111
110
|
|
|
112
111
|
const previousAppPackage = (await this.adb.shell(['cat', TARGET_PACKAGE_CONTAINER])).trim();
|
|
113
|
-
|
|
114
|
-
_logger.default.debug(`The previous target application package was '${previousAppPackage}'. ` + `The current package is '${this.appPackage}'`);
|
|
115
|
-
|
|
112
|
+
this.log.debug(`The previous target application package was '${previousAppPackage}'. ` + `The current package is '${this.appPackage}'`);
|
|
116
113
|
return previousAppPackage !== this.appPackage;
|
|
117
114
|
}
|
|
118
115
|
|
|
@@ -122,27 +119,26 @@ class EspressoRunner {
|
|
|
122
119
|
const shouldInstallApp = shouldUninstallApp || [this.adb.APP_INSTALL_STATE.NOT_INSTALLED].includes(appState);
|
|
123
120
|
|
|
124
121
|
if (shouldUninstallApp) {
|
|
125
|
-
|
|
122
|
+
this.log.info(`Uninstalling Espresso Test Server apk from the target device (pkg: '${TEST_APK_PKG}')`);
|
|
126
123
|
|
|
127
124
|
try {
|
|
128
125
|
await this.adb.uninstallApk(TEST_APK_PKG);
|
|
129
126
|
} catch (err) {
|
|
130
|
-
|
|
127
|
+
this.log.warn(`Error uninstalling '${TEST_APK_PKG}': ${err.message}`);
|
|
131
128
|
}
|
|
132
129
|
}
|
|
133
130
|
|
|
134
131
|
if (shouldInstallApp) {
|
|
135
|
-
|
|
132
|
+
this.log.info(`Installing Espresso Test Server apk from the target device (path: '${this.modServerPath}')`);
|
|
136
133
|
|
|
137
134
|
try {
|
|
138
135
|
await this.adb.install(this.modServerPath, {
|
|
139
136
|
replace: false,
|
|
140
137
|
timeout: this.androidInstallTimeout
|
|
141
138
|
});
|
|
142
|
-
|
|
143
|
-
_logger.default.info(`Installed Espresso Test Server apk '${this.modServerPath}' (pkg: '${TEST_APK_PKG}')`);
|
|
139
|
+
this.log.info(`Installed Espresso Test Server apk '${this.modServerPath}' (pkg: '${TEST_APK_PKG}')`);
|
|
144
140
|
} catch (err) {
|
|
145
|
-
|
|
141
|
+
this.log.errorAndThrow(`Cannot install '${this.modServerPath}' because of '${err.message}'`);
|
|
146
142
|
}
|
|
147
143
|
}
|
|
148
144
|
}
|
|
@@ -151,16 +147,14 @@ class EspressoRunner {
|
|
|
151
147
|
let rebuild = this.forceEspressoRebuild;
|
|
152
148
|
|
|
153
149
|
if (rebuild) {
|
|
154
|
-
|
|
150
|
+
this.log.debug(`'forceEspressoRebuild' capability is enabled`);
|
|
155
151
|
} else if (await this.isAppPackageChanged()) {
|
|
156
|
-
|
|
157
|
-
|
|
152
|
+
this.log.info(`Forcing Espresso server rebuild because of changed application package`);
|
|
158
153
|
rebuild = true;
|
|
159
154
|
}
|
|
160
155
|
|
|
161
156
|
if (rebuild && (await _support.fs.exists(this.modServerPath))) {
|
|
162
|
-
|
|
163
|
-
|
|
157
|
+
this.log.debug(`Deleting the obsolete Espresso server package '${this.modServerPath}'`);
|
|
164
158
|
await _support.fs.unlink(this.modServerPath);
|
|
165
159
|
}
|
|
166
160
|
|
|
@@ -175,7 +169,7 @@ class EspressoRunner {
|
|
|
175
169
|
}
|
|
176
170
|
|
|
177
171
|
if ((rebuild || !isSigned) && (await this.adb.uninstallApk(TEST_APK_PKG))) {
|
|
178
|
-
|
|
172
|
+
this.log.info('Uninstalled the obsolete Espresso server package from the device under test');
|
|
179
173
|
}
|
|
180
174
|
|
|
181
175
|
await this.installServer();
|
|
@@ -188,20 +182,17 @@ class EspressoRunner {
|
|
|
188
182
|
let buildConfigurationStr;
|
|
189
183
|
|
|
190
184
|
if (await _support.fs.exists(this.espressoBuildConfig)) {
|
|
191
|
-
|
|
192
|
-
|
|
185
|
+
this.log.info(`Loading the build configuration from '${this.espressoBuildConfig}'`);
|
|
193
186
|
buildConfigurationStr = await _support.fs.readFile(this.espressoBuildConfig, 'utf8');
|
|
194
187
|
} else {
|
|
195
|
-
|
|
196
|
-
|
|
188
|
+
this.log.info(`Loading the build configuration from 'espressoBuildConfig' capability`);
|
|
197
189
|
buildConfigurationStr = this.espressoBuildConfig;
|
|
198
190
|
}
|
|
199
191
|
|
|
200
192
|
try {
|
|
201
193
|
buildConfiguration = JSON.parse(buildConfigurationStr);
|
|
202
194
|
} catch (e) {
|
|
203
|
-
|
|
204
|
-
|
|
195
|
+
this.log.error('Cannot parse the build configuration JSON', e);
|
|
205
196
|
throw e;
|
|
206
197
|
}
|
|
207
198
|
}
|
|
@@ -212,20 +203,14 @@ class EspressoRunner {
|
|
|
212
203
|
|
|
213
204
|
const serverPath = _path.default.resolve(this.tmpDir, dirName);
|
|
214
205
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
_logger.default.debug(`The build folder root could be customized by changing the 'tmpDir' capability`);
|
|
218
|
-
|
|
206
|
+
this.log.info(`Building espresso server in '${serverPath}'`);
|
|
207
|
+
this.log.debug(`The build folder root could be customized by changing the 'tmpDir' capability`);
|
|
219
208
|
await _support.fs.rimraf(serverPath);
|
|
220
209
|
await (0, _support.mkdirp)(serverPath);
|
|
221
|
-
|
|
222
|
-
_logger.default.debug(`Copying espresso server template from ('${TEST_SERVER_ROOT}' to '${serverPath}')`);
|
|
223
|
-
|
|
210
|
+
this.log.debug(`Copying espresso server template from ('${TEST_SERVER_ROOT}' to '${serverPath}')`);
|
|
224
211
|
await (0, _utils.copyGradleProjectRecursively)(TEST_SERVER_ROOT, serverPath);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
await new _serverBuilder.ServerBuilder({
|
|
212
|
+
this.log.debug('Bulding espresso server');
|
|
213
|
+
await new _serverBuilder.ServerBuilder(this.log, {
|
|
229
214
|
serverPath,
|
|
230
215
|
buildConfiguration,
|
|
231
216
|
showGradleLog: this.showGradleLog,
|
|
@@ -235,13 +220,12 @@ class EspressoRunner {
|
|
|
235
220
|
|
|
236
221
|
const apkPath = _path.default.resolve(serverPath, 'app', 'build', 'outputs', 'apk', 'androidTest', 'debug', 'app-debug-androidTest.apk');
|
|
237
222
|
|
|
238
|
-
|
|
239
|
-
|
|
223
|
+
this.log.debug(`Copying built apk from '${apkPath}' to '${this.modServerPath}'`);
|
|
240
224
|
await _support.fs.copyFile(apkPath, this.modServerPath);
|
|
241
225
|
}
|
|
242
226
|
|
|
243
227
|
async cleanupSessionLeftovers() {
|
|
244
|
-
|
|
228
|
+
this.log.debug('Performing cleanup of automation leftovers');
|
|
245
229
|
|
|
246
230
|
try {
|
|
247
231
|
const {
|
|
@@ -253,20 +237,18 @@ class EspressoRunner {
|
|
|
253
237
|
const activeSessionIds = value.map(sess => sess.id);
|
|
254
238
|
|
|
255
239
|
if (activeSessionIds.length) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
_logger.default.debug('Cleaning up the obsolete sessions');
|
|
259
|
-
|
|
240
|
+
this.log.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);
|
|
241
|
+
this.log.debug('Cleaning up the obsolete sessions');
|
|
260
242
|
await _bluebird.default.all(activeSessionIds.map(id => (0, _axios.default)({
|
|
261
243
|
url: `http://${this.host}:${this.systemPort}/session/${id}`,
|
|
262
244
|
method: 'DELETE'
|
|
263
245
|
})));
|
|
264
246
|
await _bluebird.default.delay(1000);
|
|
265
247
|
} else {
|
|
266
|
-
|
|
248
|
+
this.log.debug('No obsolete sessions have been detected');
|
|
267
249
|
}
|
|
268
250
|
} catch (e) {
|
|
269
|
-
|
|
251
|
+
this.log.debug(`No obsolete sessions have been detected (${e.message})`);
|
|
270
252
|
}
|
|
271
253
|
}
|
|
272
254
|
|
|
@@ -279,9 +261,7 @@ class EspressoRunner {
|
|
|
279
261
|
}
|
|
280
262
|
|
|
281
263
|
cmd.push(`${TEST_APK_PKG}/androidx.test.runner.AndroidJUnitRunner`);
|
|
282
|
-
|
|
283
|
-
_logger.default.info(`Starting Espresso Server v${_package.version} with cmd: adb ${cmd.join(' ')}`);
|
|
284
|
-
|
|
264
|
+
this.log.info(`Starting Espresso Server v${_package.version} with cmd: adb ${cmd.join(' ')}`);
|
|
285
265
|
let hasSocketError = false;
|
|
286
266
|
this.jwproxy.instrumentationState = {
|
|
287
267
|
exited: false,
|
|
@@ -289,8 +269,7 @@ class EspressoRunner {
|
|
|
289
269
|
};
|
|
290
270
|
this.instProcess = this.adb.createSubProcess(cmd);
|
|
291
271
|
this.instProcess.on('exit', (code, signal) => {
|
|
292
|
-
|
|
293
|
-
|
|
272
|
+
this.log.info(`Instrumentation process exited with code ${code} from signal ${signal}`);
|
|
294
273
|
this.jwproxy.instrumentationState.exited = true;
|
|
295
274
|
});
|
|
296
275
|
this.instProcess.on('output', (stdout, stderr) => {
|
|
@@ -300,7 +279,7 @@ class EspressoRunner {
|
|
|
300
279
|
return;
|
|
301
280
|
}
|
|
302
281
|
|
|
303
|
-
|
|
282
|
+
this.log.debug(`[Instrumentation] ${line.trim()}`);
|
|
304
283
|
|
|
305
284
|
if (line.toLowerCase().includes('java.net.socketexception')) {
|
|
306
285
|
hasSocketError = true;
|
|
@@ -310,15 +289,14 @@ class EspressoRunner {
|
|
|
310
289
|
});
|
|
311
290
|
const timer = new _support.timing.Timer().start();
|
|
312
291
|
await this.instProcess.start(0);
|
|
313
|
-
|
|
314
|
-
_logger.default.info(`Waiting up to ${this.serverLaunchTimeout}ms for Espresso server to be online`);
|
|
292
|
+
this.log.info(`Waiting up to ${this.serverLaunchTimeout}ms for Espresso server to be online`);
|
|
315
293
|
|
|
316
294
|
try {
|
|
317
295
|
await (0, _asyncbox.waitForCondition)(async () => {
|
|
318
296
|
if (hasSocketError) {
|
|
319
|
-
|
|
297
|
+
this.log.errorAndThrow(`Espresso server has failed to start due to an unexpected exception. ` + `Make sure the 'INTERNET' permission is requested in the Android manifest of your ` + `application under test (<uses-permission android:name="android.permission.INTERNET" />)`);
|
|
320
298
|
} else if (this.jwproxy.instrumentationState.exited) {
|
|
321
|
-
|
|
299
|
+
this.log.errorAndThrow(`Espresso server process has been unexpectedly terminated. ` + `Check the Appium server log and the logcat output for more details`);
|
|
322
300
|
}
|
|
323
301
|
|
|
324
302
|
try {
|
|
@@ -333,16 +311,14 @@ class EspressoRunner {
|
|
|
333
311
|
});
|
|
334
312
|
} catch (e) {
|
|
335
313
|
if (/Condition unmet/.test(e.message)) {
|
|
336
|
-
|
|
314
|
+
this.log.errorAndThrow(`Timed out waiting for Espresso server to be ` + `online within ${this.serverLaunchTimeout}ms. The timeout value could be ` + `customized using 'espressoServerLaunchTimeout' capability`);
|
|
337
315
|
}
|
|
338
316
|
|
|
339
317
|
throw e;
|
|
340
318
|
}
|
|
341
319
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
_logger.default.info('Starting the session');
|
|
345
|
-
|
|
320
|
+
this.log.info(`Espresso server is online. ` + `The initialization process took ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
321
|
+
this.log.info('Starting the session');
|
|
346
322
|
await this.jwproxy.command('/session', 'POST', {
|
|
347
323
|
capabilities: {
|
|
348
324
|
firstMatch: [caps],
|
|
@@ -354,17 +330,16 @@ class EspressoRunner {
|
|
|
354
330
|
|
|
355
331
|
async recordTargetAppPackage() {
|
|
356
332
|
await this.adb.shell([`echo "${this.appPackage}" > "${TARGET_PACKAGE_CONTAINER}"`]);
|
|
357
|
-
|
|
358
|
-
_logger.default.info(`Recorded the target application package '${this.appPackage}' to ${TARGET_PACKAGE_CONTAINER}`);
|
|
333
|
+
this.log.info(`Recorded the target application package '${this.appPackage}' to ${TARGET_PACKAGE_CONTAINER}`);
|
|
359
334
|
}
|
|
360
335
|
|
|
361
336
|
async deleteSession() {
|
|
362
|
-
|
|
337
|
+
this.log.debug('Deleting Espresso server session');
|
|
363
338
|
|
|
364
339
|
try {
|
|
365
340
|
await this.jwproxy.command('/', 'DELETE');
|
|
366
341
|
} catch (err) {
|
|
367
|
-
|
|
342
|
+
this.log.warn(`Did not get confirmation Espresso deleteSession worked; ` + `Error was: ${err}`);
|
|
368
343
|
}
|
|
369
344
|
|
|
370
345
|
if (this.instProcess && this.instProcess.isRunning) {
|
|
@@ -379,4 +354,4 @@ var _default = EspressoRunner;
|
|
|
379
354
|
exports.default = _default;require('source-map-support').install();
|
|
380
355
|
|
|
381
356
|
|
|
382
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9lc3ByZXNzby1ydW5uZXIuanMiXSwibmFtZXMiOlsiVEVTVF9TRVJWRVJfUk9PVCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiVEVTVF9BUEtfUEtHIiwiUkVRVUlSRURfUEFSQU1TIiwiRVNQUkVTU09fU0VSVkVSX0xBVU5DSF9USU1FT1VUX01TIiwiVEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSIiwiRXNwcmVzc29Qcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiY3Jhc2hlZCIsImV4aXRlZCIsImluc3RydW1lbnRhdGlvblN0YXRlIiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIkVzcHJlc3NvUnVubmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwicmVxIiwidXRpbCIsImhhc1ZhbHVlIiwiRXJyb3IiLCJqd3Byb3h5Iiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJzeXN0ZW1Qb3J0IiwiYmFzZSIsImtlZXBBbGl2ZSIsInByb3h5UmVxUmVzIiwiYmluZCIsImNvbW1hbmQiLCJtb2RTZXJ2ZXJOYW1lIiwiZnMiLCJzYW5pdGl6ZU5hbWUiLCJ2ZXJzaW9uIiwiYXBwUGFja2FnZSIsImFkYiIsImN1ckRldmljZUlkIiwicmVwbGFjZW1lbnQiLCJtb2RTZXJ2ZXJQYXRoIiwidG1wRGlyIiwic2hvd0dyYWRsZUxvZyIsImVzcHJlc3NvQnVpbGRDb25maWciLCJzZXJ2ZXJMYXVuY2hUaW1lb3V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJ1c2VLZXlzdG9yZSIsImtleXN0b3JlUGF0aCIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwic2lnbmluZ0NvbmZpZyIsImtleXN0b3JlRmlsZSIsImlzQXBwUGFja2FnZUNoYW5nZWQiLCJmaWxlRXhpc3RzIiwibG9nZ2VyIiwiZGVidWciLCJwcmV2aW91c0FwcFBhY2thZ2UiLCJzaGVsbCIsInRyaW0iLCJpbnN0YWxsU2VydmVyIiwiYXBwU3RhdGUiLCJnZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZSIsInNob3VsZFVuaW5zdGFsbEFwcCIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsImluY2x1ZGVzIiwic2hvdWxkSW5zdGFsbEFwcCIsIk5PVF9JTlNUQUxMRUQiLCJpbmZvIiwidW5pbnN0YWxsQXBrIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJpbnN0YWxsIiwicmVwbGFjZSIsInRpbWVvdXQiLCJlcnJvckFuZFRocm93IiwiaW5zdGFsbFRlc3RBcGsiLCJyZWJ1aWxkIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJleGlzdHMiLCJ1bmxpbmsiLCJidWlsZE5ld01vZFNlcnZlciIsImlzU2lnbmVkIiwiY2hlY2tBcGtDZXJ0Iiwic2lnbiIsImJ1aWxkQ29uZmlndXJhdGlvbiIsImJ1aWxkQ29uZmlndXJhdGlvblN0ciIsInJlYWRGaWxlIiwiSlNPTiIsInBhcnNlIiwiZSIsImVycm9yIiwiZGlyTmFtZSIsInNlcnZlclBhdGgiLCJyaW1yYWYiLCJTZXJ2ZXJCdWlsZGVyIiwidGVzdEFwcFBhY2thZ2UiLCJidWlsZCIsImFwa1BhdGgiLCJjb3B5RmlsZSIsImNsZWFudXBTZXNzaW9uTGVmdG92ZXJzIiwidmFsdWUiLCJkYXRhIiwiYWN0aXZlU2Vzc2lvbklkcyIsIm1hcCIsInNlc3MiLCJpZCIsImxlbmd0aCIsInN0cmluZ2lmeSIsIkIiLCJhbGwiLCJkZWxheSIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbWQiLCJwcm9jZXNzIiwiZW52IiwiRVNQUkVTU09fSkFWQV9ERUJVRyIsIl8iLCJpc0Jvb2xlYW4iLCJwdXNoIiwiam9pbiIsImhhc1NvY2tldEVycm9yIiwiaW5zdFByb2Nlc3MiLCJjcmVhdGVTdWJQcm9jZXNzIiwib24iLCJjb2RlIiwic2lnbmFsIiwic3Rkb3V0Iiwic3RkZXJyIiwibGluZSIsImlzRW1wdHkiLCJ0b0xvd2VyQ2FzZSIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsIndhaXRNcyIsImludGVydmFsTXMiLCJ0ZXN0IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJjYXBhYmlsaXRpZXMiLCJmaXJzdE1hdGNoIiwiYWx3YXlzTWF0Y2giLCJyZWNvcmRUYXJnZXRBcHBQYWNrYWdlIiwiZGVsZXRlU2Vzc2lvbiIsImlzUnVubmluZyIsInN0b3AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsZ0JBQWdCLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsU0FBYixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxpQkFBcEMsQ0FBekI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLCtCQUFyQjs7QUFDQSxNQUFNQyxlQUFlLEdBQUcsQ0FDdEIsS0FEc0IsRUFFdEIsUUFGc0IsRUFHdEIsTUFIc0IsRUFJdEIsWUFKc0IsRUFLdEIsWUFMc0IsRUFNdEIsWUFOc0IsRUFPdEIsc0JBUHNCLENBQXhCOztBQVNBLE1BQU1DLGlDQUFpQyxHQUFHLEtBQTFDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcscUNBQWpDOztBQUVBLE1BQU1DLGFBQU4sU0FBNEJDLG1CQUE1QixDQUFvQztBQUNoQixRQUFaQyxZQUFZLENBQUVDLEdBQUYsRUFBT0MsTUFBUCxFQUFlQyxJQUFJLEdBQUcsSUFBdEIsRUFBNEI7QUFDNUMsVUFBTTtBQUFDQyxNQUFBQSxPQUFEO0FBQVVDLE1BQUFBO0FBQVYsUUFBb0IsS0FBS0Msb0JBQS9COztBQUNBLFFBQUlELE1BQUosRUFBWTtBQUNWLFlBQU0sSUFBSUUsbUJBQU9DLG1CQUFYLENBQWdDLElBQUdOLE1BQU8sSUFBR0QsR0FBSSxpREFBbEIsR0FDbEMs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QTFELENBQWYsQ0FBTjs7QUFDQXFELG9CQUFPZSxJQUFQLENBQWEsNENBQTJDLEtBQUtuQyxVQUFXLFFBQU9qQyx3QkFBeUIsRUFBeEc7QUFDRDs7QUFFa0IsUUFBYm9KLGFBQWEsR0FBSTtBQUNyQi9GLG9CQUFPQyxLQUFQLENBQWEsa0NBQWI7O0FBR0EsUUFBSTtBQUNGLFlBQU0sS0FBS25DLE9BQUwsQ0FBYVMsT0FBYixDQUFxQixHQUFyQixFQUEwQixRQUExQixDQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU8wQyxHQUFQLEVBQVk7QUFDWmpCLHNCQUFPa0IsSUFBUCxDQUFhLDBEQUFELEdBQ1AsY0FBYUQsR0FBSSxFQUR0QjtBQUVEOztBQUVELFFBQUksS0FBS3NELFdBQUwsSUFBb0IsS0FBS0EsV0FBTCxDQUFpQnlCLFNBQXpDLEVBQW9EO0FBQ2xELFlBQU0sS0FBS3pCLFdBQUwsQ0FBaUIwQixJQUFqQixFQUFOO0FBQ0Q7QUFDRjs7QUF6U2tCOzs7ZUE2U04xSSxjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBTZXJ2ZXJCdWlsZGVyLCBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgfSBmcm9tICcuL3NlcnZlci1idWlsZGVyJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIG1rZGlycCwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby11bnJlc29sdmVkXG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29weUdyYWRsZVByb2plY3RSZWN1cnNpdmVseSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuXG5jb25zdCBURVNUX1NFUlZFUl9ST09UID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2VzcHJlc3NvLXNlcnZlcicpO1xuY29uc3QgVEVTVF9BUEtfUEtHID0gJ2lvLmFwcGl1bS5lc3ByZXNzb3NlcnZlci50ZXN0JztcbmNvbnN0IFJFUVVJUkVEX1BBUkFNUyA9IFtcbiAgJ2FkYicsXG4gICd0bXBEaXInLFxuICAnaG9zdCcsXG4gICdzeXN0ZW1Qb3J0JyxcbiAgJ2RldmljZVBvcnQnLFxuICAnYXBwUGFja2FnZScsXG4gICdmb3JjZUVzcHJlc3NvUmVidWlsZCcsXG5dO1xuY29uc3QgRVNQUkVTU09fU0VSVkVSX0xBVU5DSF9USU1FT1VUX01TID0gNDUwMDA7XG5jb25zdCBUQVJHRVRfUEFDS0FHRV9DT05UQUlORVIgPSAnL2RhdGEvbG9jYWwvdG1wL2VzcHJlc3NvLmFwcHBhY2thZ2UnO1xuXG5jbGFzcyBFc3ByZXNzb1Byb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgY29uc3Qge2NyYXNoZWQsIGV4aXRlZH0gPSB0aGlzLmluc3RydW1lbnRhdGlvblN0YXRlO1xuICAgIGlmIChleGl0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihgJyR7bWV0aG9kfSAke3VybH0nIGNhbm5vdCBiZSBwcm94aWVkIHRvIEVzcHJlc3NvIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICBgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyAke2NyYXNoZWQgPyAnY3Jhc2hlZCcgOiAnYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZCd9LiBgICtcbiAgICAgICAgYENoZWNrIHRoZSBBcHBpdW0gc2VydmVyIGxvZyBhbmQgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlsc2ApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBFc3ByZXNzb1J1bm5lciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRVUlSRURfUEFSQU1TKSB7XG4gICAgICBpZiAoIW9wdHMgfHwgIXV0aWwuaGFzVmFsdWUob3B0c1tyZXFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiAnJHtyZXF9JyBpcyByZXF1aXJlZCFgKTtcbiAgICAgIH1cbiAgICAgIHRoaXNbcmVxXSA9IG9wdHNbcmVxXTtcbiAgICB9XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEVzcHJlc3NvUHJveHkoe1xuICAgICAgc2VydmVyOiB0aGlzLmhvc3QsXG4gICAgICBwb3J0OiB0aGlzLnN5c3RlbVBvcnQsXG4gICAgICBiYXNlOiAnJyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUgPSB7XG4gICAgICBleGl0ZWQ6IGZhbHNlLFxuICAgICAgY3Jhc2hlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZFNlcnZlck5hbWUgPSBmcy5zYW5pdGl6ZU5hbWUoYCR7VEVTVF9BUEtfUEtHfV8ke3ZlcnNpb259XyR7dGhpcy5hcHBQYWNrYWdlfV8ke3RoaXMuYWRiLmN1ckRldmljZUlkfS5hcGtgLCB7XG4gICAgICByZXBsYWNlbWVudDogJy0nLFxuICAgIH0pO1xuICAgIHRoaXMubW9kU2VydmVyUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLnRtcERpciwgbW9kU2VydmVyTmFtZSk7XG4gICAgdGhpcy5zaG93R3JhZGxlTG9nID0gb3B0cy5zaG93R3JhZGxlTG9nO1xuICAgIHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZyA9IG9wdHMuZXNwcmVzc29CdWlsZENvbmZpZztcblxuICAgIHRoaXMuc2VydmVyTGF1bmNoVGltZW91dCA9IG9wdHMuc2VydmVyTGF1bmNoVGltZW91dCB8fCBFU1BSRVNTT19TRVJWRVJfTEFVTkNIX1RJTUVPVVRfTVM7XG4gICAgdGhpcy5hbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBvcHRzLmFuZHJvaWRJbnN0YWxsVGltZW91dDtcblxuICAgIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UgPSBvcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlO1xuXG4gICAgLy8gRXNwcmVzc28gU2VydmVyIGFwcCBuZWVkcyB0byBiZSBzaWduZWQgd2l0aCBzYW1lIGtleVN0b3JlIGFzIGFwcFBhY2thZ2VcbiAgICBpZiAob3B0cy51c2VLZXlzdG9yZSAmJiBvcHRzLmtleXN0b3JlUGF0aCAmJiBvcHRzLmtleXN0b3JlUGFzc3dvcmQgJiYgb3B0cy5rZXlBbGlhcyAmJiBvcHRzLmtleVBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNpZ25pbmdDb25maWcgPSBidWlsZFNlcnZlclNpZ25pbmdDb25maWcoe1xuICAgICAgICBrZXlzdG9yZUZpbGU6IG9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAgICBrZXlzdG9yZVBhc3N3b3JkOiBvcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICAgIGtleUFsaWFzOiBvcHRzLmtleUFsaWFzLFxuICAgICAgICBrZXlQYXNzd29yZDogb3B0cy5rZXlQYXNzd29yZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2lnbmluZ0NvbmZpZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNBcHBQYWNrYWdlQ2hhbmdlZCAoKSB7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5maWxlRXhpc3RzKFRBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUikpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnVGhlIHByZXZpb3VzIHRhcmdldCBhcHBsaWNhdGlvbiBwYWNrYWdlIGlzIHVua25vd24nKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91c0FwcFBhY2thZ2UgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydjYXQnLCBUQVJHRVRfUEFDS0FHRV9DT05UQUlORVJdKSkudHJpbSgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIHByZXZpb3VzIHRhcmdldCBhcHBsaWNhdGlvbiBwYWNrYWdlIHdhcyAnJHtwcmV2aW91c0FwcFBhY2thZ2V9Jy4gYCArXG4gICAgICBgVGhlIGN1cnJlbnQgcGFja2FnZSBpcyAnJHt0aGlzLmFwcFBhY2thZ2V9J2ApO1xuICAgIHJldHVybiBwcmV2aW91c0FwcFBhY2thZ2UgIT09IHRoaXMuYXBwUGFja2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyBFc3ByZXNzbyBzZXJ2ZXIgYXBrIG9uIHRvIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IuXG4gICAqIEVhY2ggYWRiIGNvbW1hbmQgdXNlcyBkZWZhdWx0IHRpbWVvdXQgYnkgdGhlbS5cbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXIgKCkge1xuICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUodGhpcy5tb2RTZXJ2ZXJQYXRoLCBURVNUX0FQS19QS0cpO1xuXG4gICAgY29uc3Qgc2hvdWxkVW5pbnN0YWxsQXBwID0gW1xuICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRFxuICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgIGNvbnN0IHNob3VsZEluc3RhbGxBcHAgPSBzaG91bGRVbmluc3RhbGxBcHAgfHwgW1xuICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRFxuICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuXG4gICAgaWYgKHNob3VsZFVuaW5zdGFsbEFwcCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFVuaW5zdGFsbGluZyBFc3ByZXNzbyBUZXN0IFNlcnZlciBhcGsgZnJvbSB0aGUgdGFyZ2V0IGRldmljZSAocGtnOiAnJHtURVNUX0FQS19QS0d9JylgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFcnJvciB1bmluc3RhbGxpbmcgJyR7VEVTVF9BUEtfUEtHfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEluc3RhbGxBcHApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBJbnN0YWxsaW5nIEVzcHJlc3NvIFRlc3QgU2VydmVyIGFwayBmcm9tIHRoZSB0YXJnZXQgZGV2aWNlIChwYXRoOiAnJHt0aGlzLm1vZFNlcnZlclBhdGh9JylgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwodGhpcy5tb2RTZXJ2ZXJQYXRoLCB7IHJlcGxhY2U6IGZhbHNlLCB0aW1lb3V0OiB0aGlzLmFuZHJvaWRJbnN0YWxsVGltZW91dCB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYEluc3RhbGxlZCBFc3ByZXNzbyBUZXN0IFNlcnZlciBhcGsgJyR7dGhpcy5tb2RTZXJ2ZXJQYXRofScgKHBrZzogJyR7VEVTVF9BUEtfUEtHfScpYCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENhbm5vdCBpbnN0YWxsICcke3RoaXMubW9kU2VydmVyUGF0aH0nIGJlY2F1c2Ugb2YgJyR7ZXJyLm1lc3NhZ2V9J2ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxUZXN0QXBrICgpIHtcbiAgICBsZXQgcmVidWlsZCA9IHRoaXMuZm9yY2VFc3ByZXNzb1JlYnVpbGQ7XG4gICAgaWYgKHJlYnVpbGQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgJ2ZvcmNlRXNwcmVzc29SZWJ1aWxkJyBjYXBhYmlsaXR5IGlzIGVuYWJsZWRgKTtcbiAgICB9IGVsc2UgaWYgKGF3YWl0IHRoaXMuaXNBcHBQYWNrYWdlQ2hhbmdlZCgpKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgRm9yY2luZyBFc3ByZXNzbyBzZXJ2ZXIgcmVidWlsZCBiZWNhdXNlIG9mIGNoYW5nZWQgYXBwbGljYXRpb24gcGFja2FnZWApO1xuICAgICAgcmVidWlsZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJlYnVpbGQgJiYgYXdhaXQgZnMuZXhpc3RzKHRoaXMubW9kU2VydmVyUGF0aCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRGVsZXRpbmcgdGhlIG9ic29sZXRlIEVzcHJlc3NvIHNlcnZlciBwYWNrYWdlICcke3RoaXMubW9kU2VydmVyUGF0aH0nYCk7XG4gICAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5tb2RTZXJ2ZXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMubW9kU2VydmVyUGF0aCkpKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkTmV3TW9kU2VydmVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzU2lnbmVkID0gYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KHRoaXMubW9kU2VydmVyUGF0aCwgVEVTVF9BUEtfUEtHKTtcbiAgICBpZiAoIWlzU2lnbmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaWduKHRoaXMubW9kU2VydmVyUGF0aCk7XG4gICAgfVxuICAgIGlmICgocmVidWlsZCB8fCAhaXNTaWduZWQpICYmIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhURVNUX0FQS19QS0cpKSB7XG4gICAgICBsb2dnZXIuaW5mbygnVW5pbnN0YWxsZWQgdGhlIG9ic29sZXRlIEVzcHJlc3NvIHNlcnZlciBwYWNrYWdlIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0Jyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbnN0YWxsU2VydmVyKCk7XG4gIH1cblxuICBhc3luYyBidWlsZE5ld01vZFNlcnZlciAoKSB7XG4gICAgbGV0IGJ1aWxkQ29uZmlndXJhdGlvbiA9IHt9O1xuICAgIGlmICh0aGlzLmVzcHJlc3NvQnVpbGRDb25maWcpIHtcbiAgICAgIGxldCBidWlsZENvbmZpZ3VyYXRpb25TdHI7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZykpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYExvYWRpbmcgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZnJvbSAnJHt0aGlzLmVzcHJlc3NvQnVpbGRDb25maWd9J2ApO1xuICAgICAgICBidWlsZENvbmZpZ3VyYXRpb25TdHIgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLmVzcHJlc3NvQnVpbGRDb25maWcsICd1dGY4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuaW5mbyhgTG9hZGluZyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiBmcm9tICdlc3ByZXNzb0J1aWxkQ29uZmlnJyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvblN0ciA9IHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9IEpTT04ucGFyc2UoYnVpbGRDb25maWd1cmF0aW9uU3RyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdDYW5ub3QgcGFyc2UgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gSlNPTicsIGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaXJOYW1lID0gZnMuc2FuaXRpemVOYW1lKGBlc3ByZXNzby1zZXJ2ZXItJHt0aGlzLmFkYi5jdXJEZXZpY2VJZH1gLCB7XG4gICAgICByZXBsYWNlbWVudDogJy0nLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlcnZlclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy50bXBEaXIsIGRpck5hbWUpO1xuICAgIGxvZ2dlci5pbmZvKGBCdWlsZGluZyBlc3ByZXNzbyBzZXJ2ZXIgaW4gJyR7c2VydmVyUGF0aH0nYCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBUaGUgYnVpbGQgZm9sZGVyIHJvb3QgY291bGQgYmUgY3VzdG9taXplZCBieSBjaGFuZ2luZyB0aGUgJ3RtcERpcicgY2FwYWJpbGl0eWApO1xuICAgIGF3YWl0IGZzLnJpbXJhZihzZXJ2ZXJQYXRoKTtcbiAgICBhd2FpdCBta2RpcnAoc2VydmVyUGF0aCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBDb3B5aW5nIGVzcHJlc3NvIHNlcnZlciB0ZW1wbGF0ZSBmcm9tICgnJHtURVNUX1NFUlZFUl9ST09UfScgdG8gJyR7c2VydmVyUGF0aH0nKWApO1xuICAgIGF3YWl0IGNvcHlHcmFkbGVQcm9qZWN0UmVjdXJzaXZlbHkoVEVTVF9TRVJWRVJfUk9PVCwgc2VydmVyUGF0aCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdCdWxkaW5nIGVzcHJlc3NvIHNlcnZlcicpO1xuICAgIGF3YWl0IG5ldyBTZXJ2ZXJCdWlsZGVyKHtcbiAgICAgIHNlcnZlclBhdGgsIGJ1aWxkQ29uZmlndXJhdGlvbixcbiAgICAgIHNob3dHcmFkbGVMb2c6IHRoaXMuc2hvd0dyYWRsZUxvZyxcbiAgICAgIHRlc3RBcHBQYWNrYWdlOiB0aGlzLmFwcFBhY2thZ2UsXG4gICAgICBzaWduaW5nQ29uZmlnOiB0aGlzLnNpZ25pbmdDb25maWdcbiAgICB9KS5idWlsZCgpO1xuICAgIGNvbnN0IGFwa1BhdGggPSBwYXRoLnJlc29sdmUoc2VydmVyUGF0aCwgJ2FwcCcsICdidWlsZCcsICdvdXRwdXRzJywgJ2FwaycsICdhbmRyb2lkVGVzdCcsICdkZWJ1ZycsICdhcHAtZGVidWctYW5kcm9pZFRlc3QuYXBrJyk7XG4gICAgbG9nZ2VyLmRlYnVnKGBDb3B5aW5nIGJ1aWx0IGFwayBmcm9tICcke2Fwa1BhdGh9JyB0byAnJHt0aGlzLm1vZFNlcnZlclBhdGh9J2ApO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKGFwa1BhdGgsIHRoaXMubW9kU2VydmVyUGF0aCk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwU2Vzc2lvbkxlZnRvdmVycyAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnMnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vc2Vzc2lvbnNgLFxuICAgICAgICB0aW1lb3V0OiA1MDAsXG4gICAgICB9KSkuZGF0YTtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZHMgPSB2YWx1ZS5tYXAoKHNlc3MpID0+IHNlc3MuaWQpO1xuICAgICAgaWYgKGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBvYnNvbGV0ZSBzZXNzaW9ucyBhcmUgc3RpbGwgcnVubmluZzogJHtKU09OLnN0cmluZ2lmeShhY3RpdmVTZXNzaW9uSWRzKX1gKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDbGVhbmluZyB1cCB0aGUgb2Jzb2xldGUgc2Vzc2lvbnMnKTtcbiAgICAgICAgYXdhaXQgQi5hbGwoYWN0aXZlU2Vzc2lvbklkcy5tYXAoKGlkKSA9PlxuICAgICAgICAgIGF4aW9zKHtcbiAgICAgICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb24vJHtpZH1gLFxuICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgICB9KVxuICAgICAgICApKTtcbiAgICAgICAgLy8gTGV0IGFsbCBzZXNzaW9ucyB0byBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ05vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uIChjYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwU2Vzc2lvbkxlZnRvdmVycygpO1xuXG4gICAgY29uc3QgY21kID0gW1xuICAgICAgJ3NoZWxsJyxcbiAgICAgICdhbScsICdpbnN0cnVtZW50JyxcbiAgICAgICctdycsXG4gICAgICAnLWUnLCAnZGVidWcnLCBwcm9jZXNzLmVudi5FU1BSRVNTT19KQVZBX0RFQlVHID09PSAndHJ1ZScsXG4gICAgICAnLWUnLCAnZGlzYWJsZUFuYWx5dGljcycsIHRydWUsIC8vIFRvIGF2b2lkIHVuZXhwZWN0ZWQgZXJyb3IgYnkgZ29vZ2xlIGFuYWx5dGljc1xuICAgIF07XG5cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBjbWQucHVzaChgJHtURVNUX0FQS19QS0d9L2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcmApO1xuXG4gICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIEVzcHJlc3NvIFNlcnZlciB2JHt2ZXJzaW9ufSB3aXRoIGNtZDogYWRiICR7Y21kLmpvaW4oJyAnKX1gKTtcblxuICAgIGxldCBoYXNTb2NrZXRFcnJvciA9IGZhbHNlO1xuICAgIC8vIHN0YXJ0IHRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2Vzc1xuICAgIHRoaXMuandwcm94eS5pbnN0cnVtZW50YXRpb25TdGF0ZSA9IHtcbiAgICAgIGV4aXRlZDogZmFsc2UsXG4gICAgICBjcmFzaGVkOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMuaW5zdFByb2Nlc3MgPSB0aGlzLmFkYi5jcmVhdGVTdWJQcm9jZXNzKGNtZCk7XG4gICAgdGhpcy5pbnN0UHJvY2Vzcy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGBJbnN0cnVtZW50YXRpb24gcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0gZnJvbSBzaWduYWwgJHtzaWduYWx9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUuZXhpdGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmluc3RQcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBzdGRvdXQgfHwgc3RkZXJyO1xuICAgICAgaWYgKF8uaXNFbXB0eShsaW5lLnRyaW0oKSkpIHtcbiAgICAgICAgLy8gRG8gbm90IHByaW50IGVtcHR5IGxpbmVzIGludG8gdGhlIHN5c3RlbSBsb2dcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoYFtJbnN0cnVtZW50YXRpb25dICR7bGluZS50cmltKCl9YCk7XG4gICAgICAvLyBBICdTb2NrZXRFeGNlcHRpb24nIGluZGljYXRlcyB0aGF0IHdlIGNvdWxkbid0IGNvbm5lY3QgdG8gdGhlIEVzcHJlc3NvIHNlcnZlcixcbiAgICAgIC8vIGJlY2F1c2UgdGhlIElOVEVSTkVUIHBlcm1pc3Npb24gaXMgbm90IHNldFxuICAgICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnamF2YS5uZXQuc29ja2V0ZXhjZXB0aW9uJykpIHtcbiAgICAgICAgaGFzU29ja2V0RXJyb3IgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdQcm9jZXNzIGNyYXNoZWQnKSkge1xuICAgICAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUuY3Jhc2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGF3YWl0IHRoaXMuaW5zdFByb2Nlc3Muc3RhcnQoMCk7XG4gICAgbG9nZ2VyLmluZm8oYFdhaXRpbmcgdXAgdG8gJHt0aGlzLnNlcnZlckxhdW5jaFRpbWVvdXR9bXMgZm9yIEVzcHJlc3NvIHNlcnZlciB0byBiZSBvbmxpbmVgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChoYXNTb2NrZXRFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBFc3ByZXNzbyBzZXJ2ZXIgaGFzIGZhaWxlZCB0byBzdGFydCBkdWUgdG8gYW4gdW5leHBlY3RlZCBleGNlcHRpb24uIGAgK1xuICAgICAgICAgICAgYE1ha2Ugc3VyZSB0aGUgJ0lOVEVSTkVUJyBwZXJtaXNzaW9uIGlzIHJlcXVlc3RlZCBpbiB0aGUgQW5kcm9pZCBtYW5pZmVzdCBvZiB5b3VyIGAgK1xuICAgICAgICAgICAgYGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgKDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPVwiYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUXCIgLz4pYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5qd3Byb3h5Lmluc3RydW1lbnRhdGlvblN0YXRlLmV4aXRlZCkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBFc3ByZXNzbyBzZXJ2ZXIgcHJvY2VzcyBoYXMgYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICBgQ2hlY2sgdGhlIEFwcGl1bSBzZXJ2ZXIgbG9nIGFuZCB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IHRoaXMuc2VydmVyTGF1bmNoVGltZW91dCxcbiAgICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKC9Db25kaXRpb24gdW5tZXQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgVGltZWQgb3V0IHdhaXRpbmcgZm9yIEVzcHJlc3NvIHNlcnZlciB0byBiZSBgICtcbiAgICAgICAgICBgb25saW5lIHdpdGhpbiAke3RoaXMuc2VydmVyTGF1bmNoVGltZW91dH1tcy4gVGhlIHRpbWVvdXQgdmFsdWUgY291bGQgYmUgYCArXG4gICAgICAgICAgYGN1c3RvbWl6ZWQgdXNpbmcgJ2VzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYEVzcHJlc3NvIHNlcnZlciBpcyBvbmxpbmUuIGAgK1xuICAgICAgYFRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHRvb2sgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBsb2dnZXIuaW5mbygnU3RhcnRpbmcgdGhlIHNlc3Npb24nKTtcblxuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFtjYXBzXSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHt9XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5yZWNvcmRUYXJnZXRBcHBQYWNrYWdlKCk7XG4gIH1cblxuICBhc3luYyByZWNvcmRUYXJnZXRBcHBQYWNrYWdlICgpIHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbYGVjaG8gXCIke3RoaXMuYXBwUGFja2FnZX1cIiA+IFwiJHtUQVJHRVRfUEFDS0FHRV9DT05UQUlORVJ9XCJgXSk7XG4gICAgbG9nZ2VyLmluZm8oYFJlY29yZGVkIHRoZSB0YXJnZXQgYXBwbGljYXRpb24gcGFja2FnZSAnJHt0aGlzLmFwcFBhY2thZ2V9JyB0byAke1RBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUn1gKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgRXNwcmVzc28gc2VydmVyIHNlc3Npb24nKTtcbiAgICAvLyByZWx5IG9uIGp3cHJveHkncyBpbnRlbGxpZ2VuY2UgdG8ga25vdyB3aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYW5kXG4gICAgLy8gZGVsZXRlIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihgRGlkIG5vdCBnZXQgY29uZmlybWF0aW9uIEVzcHJlc3NvIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnN0UHJvY2VzcyAmJiB0aGlzLmluc3RQcm9jZXNzLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5pbnN0UHJvY2Vzcy5zdG9wKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEVzcHJlc3NvUnVubmVyLCBSRVFVSVJFRF9QQVJBTVMsIFRFU1RfQVBLX1BLRyB9O1xuZXhwb3J0IGRlZmF1bHQgRXNwcmVzc29SdW5uZXI7XG4iXSwiZmlsZSI6ImxpYi9lc3ByZXNzby1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
357
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9lc3ByZXNzby1ydW5uZXIuanMiXSwibmFtZXMiOlsiVEVTVF9TRVJWRVJfUk9PVCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiVEVTVF9BUEtfUEtHIiwiUkVRVUlSRURfUEFSQU1TIiwiRVNQUkVTU09fU0VSVkVSX0xBVU5DSF9USU1FT1VUX01TIiwiVEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSIiwiRXNwcmVzc29Qcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiY3Jhc2hlZCIsImV4aXRlZCIsImluc3RydW1lbnRhdGlvblN0YXRlIiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIkVzcHJlc3NvUnVubmVyIiwiY29uc3RydWN0b3IiLCJsb2ciLCJvcHRzIiwicmVxIiwidXRpbCIsImhhc1ZhbHVlIiwiRXJyb3IiLCJqd3Byb3h5Iiwic2VydmVyIiwiaG9zdCIsInBvcnQiLCJzeXN0ZW1Qb3J0IiwiYmFzZSIsImtlZXBBbGl2ZSIsInByb3h5UmVxUmVzIiwiYmluZCIsImNvbW1hbmQiLCJtb2RTZXJ2ZXJOYW1lIiwiZnMiLCJzYW5pdGl6ZU5hbWUiLCJ2ZXJzaW9uIiwiYXBwUGFja2FnZSIsImFkYiIsImN1ckRldmljZUlkIiwicmVwbGFjZW1lbnQiLCJtb2RTZXJ2ZXJQYXRoIiwidG1wRGlyIiwic2hvd0dyYWRsZUxvZyIsImVzcHJlc3NvQnVpbGRDb25maWciLCJzZXJ2ZXJMYXVuY2hUaW1lb3V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJ1c2VLZXlzdG9yZSIsImtleXN0b3JlUGF0aCIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwic2lnbmluZ0NvbmZpZyIsImtleXN0b3JlRmlsZSIsImlzQXBwUGFja2FnZUNoYW5nZWQiLCJmaWxlRXhpc3RzIiwiZGVidWciLCJwcmV2aW91c0FwcFBhY2thZ2UiLCJzaGVsbCIsInRyaW0iLCJpbnN0YWxsU2VydmVyIiwiYXBwU3RhdGUiLCJnZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZSIsInNob3VsZFVuaW5zdGFsbEFwcCIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsImluY2x1ZGVzIiwic2hvdWxkSW5zdGFsbEFwcCIsIk5PVF9JTlNUQUxMRUQiLCJpbmZvIiwidW5pbnN0YWxsQXBrIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJpbnN0YWxsIiwicmVwbGFjZSIsInRpbWVvdXQiLCJlcnJvckFuZFRocm93IiwiaW5zdGFsbFRlc3RBcGsiLCJyZWJ1aWxkIiwiZm9yY2VFc3ByZXNzb1JlYnVpbGQiLCJleGlzdHMiLCJ1bmxpbmsiLCJidWlsZE5ld01vZFNlcnZlciIsImlzU2lnbmVkIiwiY2hlY2tBcGtDZXJ0Iiwic2lnbiIsImJ1aWxkQ29uZmlndXJhdGlvbiIsImJ1aWxkQ29uZmlndXJhdGlvblN0ciIsInJlYWRGaWxlIiwiSlNPTiIsInBhcnNlIiwiZSIsImVycm9yIiwiZGlyTmFtZSIsInNlcnZlclBhdGgiLCJyaW1yYWYiLCJTZXJ2ZXJCdWlsZGVyIiwidGVzdEFwcFBhY2thZ2UiLCJidWlsZCIsImFwa1BhdGgiLCJjb3B5RmlsZSIsImNsZWFudXBTZXNzaW9uTGVmdG92ZXJzIiwidmFsdWUiLCJkYXRhIiwiYWN0aXZlU2Vzc2lvbklkcyIsIm1hcCIsInNlc3MiLCJpZCIsImxlbmd0aCIsInN0cmluZ2lmeSIsIkIiLCJhbGwiLCJkZWxheSIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbWQiLCJwcm9jZXNzIiwiZW52IiwiRVNQUkVTU09fSkFWQV9ERUJVRyIsIl8iLCJpc0Jvb2xlYW4iLCJwdXNoIiwiam9pbiIsImhhc1NvY2tldEVycm9yIiwiaW5zdFByb2Nlc3MiLCJjcmVhdGVTdWJQcm9jZXNzIiwib24iLCJjb2RlIiwic2lnbmFsIiwic3Rkb3V0Iiwic3RkZXJyIiwibGluZSIsImlzRW1wdHkiLCJ0b0xvd2VyQ2FzZSIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsIndhaXRNcyIsImludGVydmFsTXMiLCJ0ZXN0IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJjYXBhYmlsaXRpZXMiLCJmaXJzdE1hdGNoIiwiYWx3YXlzTWF0Y2giLCJyZWNvcmRUYXJnZXRBcHBQYWNrYWdlIiwiZGVsZXRlU2Vzc2lvbiIsImlzUnVubmluZyIsInN0b3AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsZ0JBQWdCLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsU0FBYixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxpQkFBcEMsQ0FBekI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLCtCQUFyQjs7QUFDQSxNQUFNQyxlQUFlLEdBQUcsQ0FDdEIsS0FEc0IsRUFFdEIsUUFGc0IsRUFHdEIsTUFIc0IsRUFJdEIsWUFKc0IsRUFLdEIsWUFMc0IsRUFNdEIsWUFOc0IsRUFPdEIsc0JBUHNCLENBQXhCOztBQVNBLE1BQU1DLGlDQUFpQyxHQUFHLEtBQTFDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcscUNBQWpDOztBQUVBLE1BQU1DLGFBQU4sU0FBNEJDLG1CQUE1QixDQUFvQztBQUNoQixRQUFaQyxZQUFZLENBQUVDLEdBQUYsRUFBT0MsTUFBUCxFQUFlQyxJQUFJLEdBQUcsSUFBdEIsRUFBNEI7QUFDNUMsVUFBTTtBQUFDQyxNQUFBQSxPQUFEO0FBQVVDLE1BQUFBO0FBQVYsUUFBb0IsS0FBS0Msb0JBQS9COztBQUNBLFFBQUlELE1BQUosRUFBWTtBQUNWLFlBQU0sSUFBSUUsbUJBQU9DLG1CQUFYLENBQWdDLElBQUdOLE1BQU8sSUFBR0QsR0FBSSxpREFBbEIsR0FDbEMsbUNBQWtDRyxP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QGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgU2VydmVyQnVpbGRlciwgYnVpbGRTZXJ2ZXJTaWduaW5nQ29uZmlnIH0gZnJvbSAnLi9zZXJ2ZXItYnVpbGRlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZzLCB1dGlsLCBta2RpcnAsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGNvcHlHcmFkbGVQcm9qZWN0UmVjdXJzaXZlbHkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cblxuY29uc3QgVEVTVF9TRVJWRVJfUk9PVCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsICdlc3ByZXNzby1zZXJ2ZXInKTtcbmNvbnN0IFRFU1RfQVBLX1BLRyA9ICdpby5hcHBpdW0uZXNwcmVzc29zZXJ2ZXIudGVzdCc7XG5jb25zdCBSRVFVSVJFRF9QQVJBTVMgPSBbXG4gICdhZGInLFxuICAndG1wRGlyJyxcbiAgJ2hvc3QnLFxuICAnc3lzdGVtUG9ydCcsXG4gICdkZXZpY2VQb3J0JyxcbiAgJ2FwcFBhY2thZ2UnLFxuICAnZm9yY2VFc3ByZXNzb1JlYnVpbGQnLFxuXTtcbmNvbnN0IEVTUFJFU1NPX1NFUlZFUl9MQVVOQ0hfVElNRU9VVF9NUyA9IDQ1MDAwO1xuY29uc3QgVEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSID0gJy9kYXRhL2xvY2FsL3RtcC9lc3ByZXNzby5hcHBwYWNrYWdlJztcblxuY2xhc3MgRXNwcmVzc29Qcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGNvbnN0IHtjcmFzaGVkLCBleGl0ZWR9ID0gdGhpcy5pbnN0cnVtZW50YXRpb25TdGF0ZTtcbiAgICBpZiAoZXhpdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBFc3ByZXNzbyBzZXJ2ZXIgYmVjYXVzZSBgICtcbiAgICAgICAgYHRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBoYXMgJHtjcmFzaGVkID8gJ2NyYXNoZWQnIDogJ2JlZW4gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQnfS4gYCArXG4gICAgICAgIGBDaGVjayB0aGUgQXBwaXVtIHNlcnZlciBsb2cgYW5kIHRoZSBsb2djYXQgb3V0cHV0IGZvciBtb3JlIGRldGFpbHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLnByb3h5Q29tbWFuZCh1cmwsIG1ldGhvZCwgYm9keSk7XG4gIH1cbn1cblxuY2xhc3MgRXNwcmVzc29SdW5uZXIge1xuICBjb25zdHJ1Y3RvciAobG9nLCBvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRVUlSRURfUEFSQU1TKSB7XG4gICAgICBpZiAoIW9wdHMgfHwgIXV0aWwuaGFzVmFsdWUob3B0c1tyZXFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiAnJHtyZXF9JyBpcyByZXF1aXJlZCFgKTtcbiAgICAgIH1cbiAgICAgIHRoaXNbcmVxXSA9IG9wdHNbcmVxXTtcbiAgICB9XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IEVzcHJlc3NvUHJveHkoe1xuICAgICAgbG9nLFxuICAgICAgc2VydmVyOiB0aGlzLmhvc3QsXG4gICAgICBwb3J0OiB0aGlzLnN5c3RlbVBvcnQsXG4gICAgICBiYXNlOiAnJyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUgPSB7XG4gICAgICBleGl0ZWQ6IGZhbHNlLFxuICAgICAgY3Jhc2hlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZFNlcnZlck5hbWUgPSBmcy5zYW5pdGl6ZU5hbWUoYCR7VEVTVF9BUEtfUEtHfV8ke3ZlcnNpb259XyR7dGhpcy5hcHBQYWNrYWdlfV8ke3RoaXMuYWRiLmN1ckRldmljZUlkfS5hcGtgLCB7XG4gICAgICByZXBsYWNlbWVudDogJy0nLFxuICAgIH0pO1xuICAgIHRoaXMubW9kU2VydmVyUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLnRtcERpciwgbW9kU2VydmVyTmFtZSk7XG4gICAgdGhpcy5zaG93R3JhZGxlTG9nID0gb3B0cy5zaG93R3JhZGxlTG9nO1xuICAgIHRoaXMuZXNwcmVzc29CdWlsZENvbmZpZyA9IG9wdHMuZXNwcmVzc29CdWlsZENvbmZpZztcblxuICAgIHRoaXMuc2VydmVyTGF1bmNoVGltZW91dCA9IG9wdHMuc2VydmVyTGF1bmNoVGltZW91dCB8fCBFU1BSRVNTT19TRVJWRVJfTEFVTkNIX1RJTUVPVVRfTVM7XG4gICAgdGhpcy5hbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBvcHRzLmFuZHJvaWRJbnN0YWxsVGltZW91dDtcblxuICAgIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UgPSBvcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlO1xuXG4gICAgLy8gRXNwcmVzc28gU2VydmVyIGFwcCBuZWVkcyB0byBiZSBzaWduZWQgd2l0aCBzYW1lIGtleVN0b3JlIGFzIGFwcFBhY2thZ2VcbiAgICBpZiAob3B0cy51c2VLZXlzdG9yZSAmJiBvcHRzLmtleXN0b3JlUGF0aCAmJiBvcHRzLmtleXN0b3JlUGFzc3dvcmQgJiYgb3B0cy5rZXlBbGlhcyAmJiBvcHRzLmtleVBhc3N3b3JkKSB7XG4gICAgICB0aGlzLnNpZ25pbmdDb25maWcgPSBidWlsZFNlcnZlclNpZ25pbmdDb25maWcoe1xuICAgICAgICBrZXlzdG9yZUZpbGU6IG9wdHMua2V5c3RvcmVQYXRoLFxuICAgICAgICBrZXlzdG9yZVBhc3N3b3JkOiBvcHRzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICAgIGtleUFsaWFzOiBvcHRzLmtleUFsaWFzLFxuICAgICAgICBrZXlQYXNzd29yZDogb3B0cy5rZXlQYXNzd29yZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2lnbmluZ0NvbmZpZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNBcHBQYWNrYWdlQ2hhbmdlZCAoKSB7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5maWxlRXhpc3RzKFRBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdUaGUgcHJldmlvdXMgdGFyZ2V0IGFwcGxpY2F0aW9uIHBhY2thZ2UgaXMgdW5rbm93bicpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzQXBwUGFja2FnZSA9IChhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2NhdCcsIFRBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUl0pKS50cmltKCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFRoZSBwcmV2aW91cyB0YXJnZXQgYXBwbGljYXRpb24gcGFja2FnZSB3YXMgJyR7cHJldmlvdXNBcHBQYWNrYWdlfScuIGAgK1xuICAgICAgYFRoZSBjdXJyZW50IHBhY2thZ2UgaXMgJyR7dGhpcy5hcHBQYWNrYWdlfSdgKTtcbiAgICByZXR1cm4gcHJldmlvdXNBcHBQYWNrYWdlICE9PSB0aGlzLmFwcFBhY2thZ2U7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgRXNwcmVzc28gc2VydmVyIGFwayBvbiB0byB0aGUgZGV2aWNlIG9yIGVtdWxhdG9yLlxuICAgKiBFYWNoIGFkYiBjb21tYW5kIHVzZXMgZGVmYXVsdCB0aW1lb3V0IGJ5IHRoZW0uXG4gICAqL1xuICBhc3luYyBpbnN0YWxsU2VydmVyICgpIHtcbiAgICBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlKHRoaXMubW9kU2VydmVyUGF0aCwgVEVTVF9BUEtfUEtHKTtcblxuICAgIGNvbnN0IHNob3VsZFVuaW5zdGFsbEFwcCA9IFtcbiAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk9MREVSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRURcbiAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICBjb25zdCBzaG91bGRJbnN0YWxsQXBwID0gc2hvdWxkVW5pbnN0YWxsQXBwIHx8IFtcbiAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRURcbiAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcblxuICAgIGlmIChzaG91bGRVbmluc3RhbGxBcHApIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVuaW5zdGFsbGluZyBFc3ByZXNzbyBUZXN0IFNlcnZlciBhcGsgZnJvbSB0aGUgdGFyZ2V0IGRldmljZSAocGtnOiAnJHtURVNUX0FQS19QS0d9JylgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhURVNUX0FQS19QS0cpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYEVycm9yIHVuaW5zdGFsbGluZyAnJHtURVNUX0FQS19QS0d9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkSW5zdGFsbEFwcCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgSW5zdGFsbGluZyBFc3ByZXNzbyBUZXN0IFNlcnZlciBhcGsgZnJvbSB0aGUgdGFyZ2V0IGRldmljZSAocGF0aDogJyR7dGhpcy5tb2RTZXJ2ZXJQYXRofScpYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKHRoaXMubW9kU2VydmVyUGF0aCwgeyByZXBsYWNlOiBmYWxzZSwgdGltZW91dDogdGhpcy5hbmRyb2lkSW5zdGFsbFRpbWVvdXQgfSk7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYEluc3RhbGxlZCBFc3ByZXNzbyBUZXN0IFNlcnZlciBhcGsgJyR7dGhpcy5tb2RTZXJ2ZXJQYXRofScgKHBrZzogJyR7VEVTVF9BUEtfUEtHfScpYCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGluc3RhbGwgJyR7dGhpcy5tb2RTZXJ2ZXJQYXRofScgYmVjYXVzZSBvZiAnJHtlcnIubWVzc2FnZX0nYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5zdGFsbFRlc3RBcGsgKCkge1xuICAgIGxldCByZWJ1aWxkID0gdGhpcy5mb3JjZUVzcHJlc3NvUmVidWlsZDtcbiAgICBpZiAocmVidWlsZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYCdmb3JjZUVzcHJlc3NvUmVidWlsZCcgY2FwYWJpbGl0eSBpcyBlbmFibGVkYCk7XG4gICAgfSBlbHNlIGlmIChhd2FpdCB0aGlzLmlzQXBwUGFja2FnZUNoYW5nZWQoKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgRm9yY2luZyBFc3ByZXNzbyBzZXJ2ZXIgcmVidWlsZCBiZWNhdXNlIG9mIGNoYW5nZWQgYXBwbGljYXRpb24gcGFja2FnZWApO1xuICAgICAgcmVidWlsZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJlYnVpbGQgJiYgYXdhaXQgZnMuZXhpc3RzKHRoaXMubW9kU2VydmVyUGF0aCkpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBEZWxldGluZyB0aGUgb2Jzb2xldGUgRXNwcmVzc28gc2VydmVyIHBhY2thZ2UgJyR7dGhpcy5tb2RTZXJ2ZXJQYXRofSdgKTtcbiAgICAgIGF3YWl0IGZzLnVubGluayh0aGlzLm1vZFNlcnZlclBhdGgpO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5tb2RTZXJ2ZXJQYXRoKSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGROZXdNb2RTZXJ2ZXIoKTtcbiAgICB9XG4gICAgY29uc3QgaXNTaWduZWQgPSBhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQodGhpcy5tb2RTZXJ2ZXJQYXRoLCBURVNUX0FQS19QS0cpO1xuICAgIGlmICghaXNTaWduZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNpZ24odGhpcy5tb2RTZXJ2ZXJQYXRoKTtcbiAgICB9XG4gICAgaWYgKChyZWJ1aWxkIHx8ICFpc1NpZ25lZCkgJiYgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKFRFU1RfQVBLX1BLRykpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1VuaW5zdGFsbGVkIHRoZSBvYnNvbGV0ZSBFc3ByZXNzbyBzZXJ2ZXIgcGFja2FnZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCcpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5zdGFsbFNlcnZlcigpO1xuICB9XG5cbiAgYXN5bmMgYnVpbGROZXdNb2RTZXJ2ZXIgKCkge1xuICAgIGxldCBidWlsZENvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICBpZiAodGhpcy5lc3ByZXNzb0J1aWxkQ29uZmlnKSB7XG4gICAgICBsZXQgYnVpbGRDb25maWd1cmF0aW9uU3RyO1xuICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLmVzcHJlc3NvQnVpbGRDb25maWcpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYExvYWRpbmcgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZnJvbSAnJHt0aGlzLmVzcHJlc3NvQnVpbGRDb25maWd9J2ApO1xuICAgICAgICBidWlsZENvbmZpZ3VyYXRpb25TdHIgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLmVzcHJlc3NvQnVpbGRDb25maWcsICd1dGY4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBMb2FkaW5nIHRoZSBidWlsZCBjb25maWd1cmF0aW9uIGZyb20gJ2VzcHJlc3NvQnVpbGRDb25maWcnIGNhcGFiaWxpdHlgKTtcbiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uU3RyID0gdGhpcy5lc3ByZXNzb0J1aWxkQ29uZmlnO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gSlNPTi5wYXJzZShidWlsZENvbmZpZ3VyYXRpb25TdHIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcignQ2Fubm90IHBhcnNlIHRoZSBidWlsZCBjb25maWd1cmF0aW9uIEpTT04nLCBlKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGlyTmFtZSA9IGZzLnNhbml0aXplTmFtZShgZXNwcmVzc28tc2VydmVyLSR7dGhpcy5hZGIuY3VyRGV2aWNlSWR9YCwge1xuICAgICAgcmVwbGFjZW1lbnQ6ICctJyxcbiAgICB9KTtcbiAgICBjb25zdCBzZXJ2ZXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMudG1wRGlyLCBkaXJOYW1lKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBCdWlsZGluZyBlc3ByZXNzbyBzZXJ2ZXIgaW4gJyR7c2VydmVyUGF0aH0nYCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFRoZSBidWlsZCBmb2xkZXIgcm9vdCBjb3VsZCBiZSBjdXN0b21pemVkIGJ5IGNoYW5naW5nIHRoZSAndG1wRGlyJyBjYXBhYmlsaXR5YCk7XG4gICAgYXdhaXQgZnMucmltcmFmKHNlcnZlclBhdGgpO1xuICAgIGF3YWl0IG1rZGlycChzZXJ2ZXJQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQ29weWluZyBlc3ByZXNzbyBzZXJ2ZXIgdGVtcGxhdGUgZnJvbSAoJyR7VEVTVF9TRVJWRVJfUk9PVH0nIHRvICcke3NlcnZlclBhdGh9JylgKTtcbiAgICBhd2FpdCBjb3B5R3JhZGxlUHJvamVjdFJlY3Vyc2l2ZWx5KFRFU1RfU0VSVkVSX1JPT1QsIHNlcnZlclBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdCdWxkaW5nIGVzcHJlc3NvIHNlcnZlcicpO1xuICAgIGF3YWl0IG5ldyBTZXJ2ZXJCdWlsZGVyKHRoaXMubG9nLCB7XG4gICAgICBzZXJ2ZXJQYXRoLCBidWlsZENvbmZpZ3VyYXRpb24sXG4gICAgICBzaG93R3JhZGxlTG9nOiB0aGlzLnNob3dHcmFkbGVMb2csXG4gICAgICB0ZXN0QXBwUGFja2FnZTogdGhpcy5hcHBQYWNrYWdlLFxuICAgICAgc2lnbmluZ0NvbmZpZzogdGhpcy5zaWduaW5nQ29uZmlnXG4gICAgfSkuYnVpbGQoKTtcbiAgICBjb25zdCBhcGtQYXRoID0gcGF0aC5yZXNvbHZlKHNlcnZlclBhdGgsICdhcHAnLCAnYnVpbGQnLCAnb3V0cHV0cycsICdhcGsnLCAnYW5kcm9pZFRlc3QnLCAnZGVidWcnLCAnYXBwLWRlYnVnLWFuZHJvaWRUZXN0LmFwaycpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBDb3B5aW5nIGJ1aWx0IGFwayBmcm9tICcke2Fwa1BhdGh9JyB0byAnJHt0aGlzLm1vZFNlcnZlclBhdGh9J2ApO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKGFwa1BhdGgsIHRoaXMubW9kU2VydmVyUGF0aCk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwU2Vzc2lvbkxlZnRvdmVycyAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1BlcmZvcm1pbmcgY2xlYW51cCBvZiBhdXRvbWF0aW9uIGxlZnRvdmVycycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS9zZXNzaW9uc2AsXG4gICAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIH0pKS5kYXRhO1xuICAgICAgY29uc3QgYWN0aXZlU2Vzc2lvbklkcyA9IHZhbHVlLm1hcCgoc2VzcykgPT4gc2Vzcy5pZCk7XG4gICAgICBpZiAoYWN0aXZlU2Vzc2lvbklkcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgb2Jzb2xldGUgc2Vzc2lvbnMgYXJlIHN0aWxsIHJ1bm5pbmc6ICR7SlNPTi5zdHJpbmdpZnkoYWN0aXZlU2Vzc2lvbklkcyl9YCk7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdDbGVhbmluZyB1cCB0aGUgb2Jzb2xldGUgc2Vzc2lvbnMnKTtcbiAgICAgICAgYXdhaXQgQi5hbGwoYWN0aXZlU2Vzc2lvbklkcy5tYXAoKGlkKSA9PlxuICAgICAgICAgIGF4aW9zKHtcbiAgICAgICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb24vJHtpZH1gLFxuICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgICB9KVxuICAgICAgICApKTtcbiAgICAgICAgLy8gTGV0IGFsbCBzZXNzaW9ucyB0byBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYE5vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2Vzc2lvbiAoY2Fwcykge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cFNlc3Npb25MZWZ0b3ZlcnMoKTtcblxuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdzaGVsbCcsXG4gICAgICAnYW0nLCAnaW5zdHJ1bWVudCcsXG4gICAgICAnLXcnLFxuICAgICAgJy1lJywgJ2RlYnVnJywgcHJvY2Vzcy5lbnYuRVNQUkVTU09fSkFWQV9ERUJVRyA9PT0gJ3RydWUnLFxuICAgICAgJy1lJywgJ2Rpc2FibGVBbmFseXRpY3MnLCB0cnVlLCAvLyBUbyBhdm9pZCB1bmV4cGVjdGVkIGVycm9yIGJ5IGdvb2dsZSBhbmFseXRpY3NcbiAgICBdO1xuXG4gICAgaWYgKF8uaXNCb29sZWFuKHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UpKSB7XG4gICAgICBjbWQucHVzaCgnLWUnLCAnRElTQUJMRV9TVVBQUkVTU19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTJywgdGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSk7XG4gICAgfVxuXG4gICAgY21kLnB1c2goYCR7VEVTVF9BUEtfUEtHfS9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJgKTtcblxuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nIEVzcHJlc3NvIFNlcnZlciB2JHt2ZXJzaW9ufSB3aXRoIGNtZDogYWRiICR7Y21kLmpvaW4oJyAnKX1gKTtcblxuICAgIGxldCBoYXNTb2NrZXRFcnJvciA9IGZhbHNlO1xuICAgIC8vIHN0YXJ0IHRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2Vzc1xuICAgIHRoaXMuandwcm94eS5pbnN0cnVtZW50YXRpb25TdGF0ZSA9IHtcbiAgICAgIGV4aXRlZDogZmFsc2UsXG4gICAgICBjcmFzaGVkOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMuaW5zdFByb2Nlc3MgPSB0aGlzLmFkYi5jcmVhdGVTdWJQcm9jZXNzKGNtZCk7XG4gICAgdGhpcy5pbnN0UHJvY2Vzcy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIHRoaXMubG9nLmluZm8oYEluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSBmcm9tIHNpZ25hbCAke3NpZ25hbH1gKTtcbiAgICAgIHRoaXMuandwcm94eS5pbnN0cnVtZW50YXRpb25TdGF0ZS5leGl0ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuaW5zdFByb2Nlc3Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgICBpZiAoXy5pc0VtcHR5KGxpbmUudHJpbSgpKSkge1xuICAgICAgICAvLyBEbyBub3QgcHJpbnQgZW1wdHkgbGluZXMgaW50byB0aGUgc3lzdGVtIGxvZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBbSW5zdHJ1bWVudGF0aW9uXSAke2xpbmUudHJpbSgpfWApO1xuICAgICAgLy8gQSAnU29ja2V0RXhjZXB0aW9uJyBpbmRpY2F0ZXMgdGhhdCB3ZSBjb3VsZG4ndCBjb25uZWN0IHRvIHRoZSBFc3ByZXNzbyBzZXJ2ZXIsXG4gICAgICAvLyBiZWNhdXNlIHRoZSBJTlRFUk5FVCBwZXJtaXNzaW9uIGlzIG5vdCBzZXRcbiAgICAgIGlmIChsaW5lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2phdmEubmV0LnNvY2tldGV4Y2VwdGlvbicpKSB7XG4gICAgICAgIGhhc1NvY2tldEVycm9yID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobGluZS5pbmNsdWRlcygnUHJvY2VzcyBjcmFzaGVkJykpIHtcbiAgICAgICAgdGhpcy5qd3Byb3h5Lmluc3RydW1lbnRhdGlvblN0YXRlLmNyYXNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmluc3RQcm9jZXNzLnN0YXJ0KDApO1xuICAgIHRoaXMubG9nLmluZm8oYFdhaXRpbmcgdXAgdG8gJHt0aGlzLnNlcnZlckxhdW5jaFRpbWVvdXR9bXMgZm9yIEVzcHJlc3NvIHNlcnZlciB0byBiZSBvbmxpbmVgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChoYXNTb2NrZXRFcnJvcikge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYEVzcHJlc3NvIHNlcnZlciBoYXMgZmFpbGVkIHRvIHN0YXJ0IGR1ZSB0byBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4gYCArXG4gICAgICAgICAgICBgTWFrZSBzdXJlIHRoZSAnSU5URVJORVQnIHBlcm1pc3Npb24gaXMgcmVxdWVzdGVkIGluIHRoZSBBbmRyb2lkIG1hbmlmZXN0IG9mIHlvdXIgYCArXG4gICAgICAgICAgICBgYXBwbGljYXRpb24gdW5kZXIgdGVzdCAoPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9XCJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVRcIiAvPilgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmp3cHJveHkuaW5zdHJ1bWVudGF0aW9uU3RhdGUuZXhpdGVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgRXNwcmVzc28gc2VydmVyIHByb2Nlc3MgaGFzIGJlZW4gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgYENoZWNrIHRoZSBBcHBpdW0gc2VydmVyIGxvZyBhbmQgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlsc2ApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiB0aGlzLnNlcnZlckxhdW5jaFRpbWVvdXQsXG4gICAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICgvQ29uZGl0aW9uIHVubWV0Ly50ZXN0KGUubWVzc2FnZSkpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGltZWQgb3V0IHdhaXRpbmcgZm9yIEVzcHJlc3NvIHNlcnZlciB0byBiZSBgICtcbiAgICAgICAgICBgb25saW5lIHdpdGhpbiAke3RoaXMuc2VydmVyTGF1bmNoVGltZW91dH1tcy4gVGhlIHRpbWVvdXQgdmFsdWUgY291bGQgYmUgYCArXG4gICAgICAgICAgYGN1c3RvbWl6ZWQgdXNpbmcgJ2VzcHJlc3NvU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgdGhpcy5sb2cuaW5mbyhgRXNwcmVzc28gc2VydmVyIGlzIG9ubGluZS4gYCArXG4gICAgICBgVGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgdG9vayAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIHRoaXMubG9nLmluZm8oJ1N0YXJ0aW5nIHRoZSBzZXNzaW9uJyk7XG5cbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBmaXJzdE1hdGNoOiBbY2Fwc10sXG4gICAgICAgIGFsd2F5c01hdGNoOiB7fVxuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMucmVjb3JkVGFyZ2V0QXBwUGFja2FnZSgpO1xuICB9XG5cbiAgYXN5bmMgcmVjb3JkVGFyZ2V0QXBwUGFja2FnZSAoKSB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoW2BlY2hvIFwiJHt0aGlzLmFwcFBhY2thZ2V9XCIgPiBcIiR7VEFSR0VUX1BBQ0tBR0VfQ09OVEFJTkVSfVwiYF0pO1xuICAgIHRoaXMubG9nLmluZm8oYFJlY29yZGVkIHRoZSB0YXJnZXQgYXBwbGljYXRpb24gcGFja2FnZSAnJHt0aGlzLmFwcFBhY2thZ2V9JyB0byAke1RBUkdFVF9QQUNLQUdFX0NPTlRBSU5FUn1gKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBFc3ByZXNzbyBzZXJ2ZXIgc2Vzc2lvbicpO1xuICAgIC8vIHJlbHkgb24gandwcm94eSdzIGludGVsbGlnZW5jZSB0byBrbm93IHdoYXQgd2UncmUgdGFsa2luZyBhYm91dCBhbmRcbiAgICAvLyBkZWxldGUgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnLycsICdERUxFVEUnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYERpZCBub3QgZ2V0IGNvbmZpcm1hdGlvbiBFc3ByZXNzbyBkZWxldGVTZXNzaW9uIHdvcmtlZDsgYCArXG4gICAgICAgICAgYEVycm9yIHdhczogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaW5zdFByb2Nlc3MgJiYgdGhpcy5pbnN0UHJvY2Vzcy5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5zdFByb2Nlc3Muc3RvcCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBFc3ByZXNzb1J1bm5lciwgUkVRVUlSRURfUEFSQU1TLCBURVNUX0FQS19QS0cgfTtcbmV4cG9ydCBkZWZhdWx0IEVzcHJlc3NvUnVubmVyO1xuIl0sImZpbGUiOiJsaWIvZXNwcmVzc28tcnVubmVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
@@ -17,8 +17,6 @@ var _support = require("@appium/support");
|
|
|
17
17
|
|
|
18
18
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
19
19
|
|
|
20
|
-
var _logger = _interopRequireDefault(require("./logger"));
|
|
21
|
-
|
|
22
20
|
var _path = _interopRequireDefault(require("path"));
|
|
23
21
|
|
|
24
22
|
var _os = require("os");
|
|
@@ -31,11 +29,9 @@ const GRADLE_URL_TEMPLATE = 'https\\://services.gradle.org/distributions/gradle-
|
|
|
31
29
|
exports.GRADLE_URL_TEMPLATE = GRADLE_URL_TEMPLATE;
|
|
32
30
|
const GRADLE_MAX_ERROR_LOG_LINES = 15;
|
|
33
31
|
const DEPENDENCY_PROP_NAMES = ['additionalAppDependencies', 'additionalAndroidTestDependencies'];
|
|
34
|
-
const VERSION_KEYS = [GRADLE_VERSION_KEY, 'androidGradlePlugin', 'compileSdk', 'buildTools', 'minSdk', 'targetSdk', 'kotlin', 'sourceCompatibility', 'targetCompatibility', 'jvmTarget'];
|
|
32
|
+
const VERSION_KEYS = [GRADLE_VERSION_KEY, 'androidGradlePlugin', 'compileSdk', 'buildTools', 'minSdk', 'targetSdk', 'kotlin', 'sourceCompatibility', 'targetCompatibility', 'jvmTarget', 'composeVersion'];
|
|
35
33
|
exports.VERSION_KEYS = VERSION_KEYS;
|
|
36
34
|
|
|
37
|
-
const gradleLog = _support.logger.getLogger('Gradle');
|
|
38
|
-
|
|
39
35
|
function buildServerSigningConfig(args) {
|
|
40
36
|
return {
|
|
41
37
|
zipAlign: true,
|
|
@@ -47,7 +43,8 @@ function buildServerSigningConfig(args) {
|
|
|
47
43
|
}
|
|
48
44
|
|
|
49
45
|
class ServerBuilder {
|
|
50
|
-
constructor(args = {}) {
|
|
46
|
+
constructor(log, args = {}) {
|
|
47
|
+
this.log = log;
|
|
51
48
|
this.serverPath = args.serverPath;
|
|
52
49
|
this.showGradleLog = args.showGradleLog;
|
|
53
50
|
const buildConfiguration = args.buildConfiguration || {};
|
|
@@ -56,7 +53,7 @@ class ServerBuilder {
|
|
|
56
53
|
if (VERSION_KEYS.includes(key)) {
|
|
57
54
|
acc[key] = value;
|
|
58
55
|
} else {
|
|
59
|
-
|
|
56
|
+
log.warn(`Got unexpected '${key}' in toolsVersion block of the build configuration`);
|
|
60
57
|
}
|
|
61
58
|
|
|
62
59
|
return acc;
|
|
@@ -79,7 +76,7 @@ class ServerBuilder {
|
|
|
79
76
|
}
|
|
80
77
|
|
|
81
78
|
getCommand() {
|
|
82
|
-
const cmd = _support.system.isWindows() ? 'gradlew.bat' : '
|
|
79
|
+
const cmd = _support.system.isWindows() ? 'gradlew.bat' : _path.default.resolve(this.serverPath, 'gradlew');
|
|
83
80
|
|
|
84
81
|
const buildProperty = (key, value) => value ? `-P${key}=${value}` : null;
|
|
85
82
|
|
|
@@ -153,8 +150,7 @@ class ServerBuilder {
|
|
|
153
150
|
continue;
|
|
154
151
|
}
|
|
155
152
|
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
this.log.info(`Adding the following ${propName} to build.gradle.kts: ${deps}`);
|
|
158
154
|
configuration = (0, _utils.updateDependencyLines)(configuration, propName, deps);
|
|
159
155
|
}
|
|
160
156
|
|
|
@@ -166,9 +162,7 @@ class ServerBuilder {
|
|
|
166
162
|
cmd,
|
|
167
163
|
args
|
|
168
164
|
} = this.getCommand();
|
|
169
|
-
|
|
170
|
-
_logger.default.debug(`Beginning build with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.serverPath}'`);
|
|
171
|
-
|
|
165
|
+
this.log.debug(`Beginning build with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.serverPath}'`);
|
|
172
166
|
const gradlebuild = new _teen_process.SubProcess(cmd, args, {
|
|
173
167
|
cwd: this.serverPath,
|
|
174
168
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -176,15 +170,13 @@ class ServerBuilder {
|
|
|
176
170
|
});
|
|
177
171
|
let buildLastLines = [];
|
|
178
172
|
const logMsg = `Output from Gradle ${this.showGradleLog ? 'will' : 'will not'} be logged`;
|
|
179
|
-
|
|
180
|
-
_logger.default.debug(`${logMsg}. To change this, use 'showGradleLog' desired capability`);
|
|
181
|
-
|
|
173
|
+
this.log.debug(`${logMsg}. To change this, use 'showGradleLog' desired capability`);
|
|
182
174
|
gradlebuild.on('stream-line', line => {
|
|
183
175
|
if (this.showGradleLog) {
|
|
184
176
|
if (line.startsWith('[STDERR]')) {
|
|
185
|
-
|
|
177
|
+
this.log.warn(`[Gradle] ${line}`);
|
|
186
178
|
} else {
|
|
187
|
-
|
|
179
|
+
this.log.info(`[Gradle] ${line}`);
|
|
188
180
|
}
|
|
189
181
|
}
|
|
190
182
|
|
|
@@ -200,8 +192,7 @@ class ServerBuilder {
|
|
|
200
192
|
await gradlebuild.join();
|
|
201
193
|
} catch (err) {
|
|
202
194
|
let msg = `Unable to build Espresso server - ${err.message}\n` + `Gradle error message:${_os.EOL}${buildLastLines}`;
|
|
203
|
-
|
|
204
|
-
_logger.default.errorAndThrow(msg);
|
|
195
|
+
this.log.errorAndThrow(msg);
|
|
205
196
|
}
|
|
206
197
|
}
|
|
207
198
|
|
|
@@ -212,4 +203,4 @@ var _default = ServerBuilder;
|
|
|
212
203
|
exports.default = _default;require('source-map-support').install();
|
|
213
204
|
|
|
214
205
|
|
|
215
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJuYW1lcyI6WyJHUkFETEVfVkVSU0lPTl9LRVkiLCJHUkFETEVfVVJMX1BSRUZJWCIsIkdSQURMRV9VUkxfVEVNUExBVEUiLCJHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyIsIkRFUEVOREVOQ1lfUFJPUF9OQU1FUyIsIlZFUlNJT05fS0VZUyIsImdyYWRsZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyIsImFyZ3MiLCJ6aXBBbGlnbiIsImtleXN0b3JlRmlsZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiU2VydmVyQnVpbGRlciIsImNvbnN0cnVjdG9yIiwic2VydmVyUGF0aCIsInNob3dHcmFkbGVMb2ciLCJidWlsZENvbmZpZ3VyYXRpb24iLCJ2ZXJzaW9uQ29uZmlndXJhdGlvbiIsInRvb2xzVmVyc2lvbnMiLCJzZXJ2ZXJWZXJzaW9ucyIsIl8iLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImtleSIsImluY2x1ZGVzIiwibG9nIiwid2FybiIsInRlc3RBcHBQYWNrYWdlIiwic2lnbmluZ0NvbmZpZyIsInByb3BOYW1lIiwiYnVpbGQiLCJzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiIsImluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMiLCJydW5CdWlsZFByb2Nlc3MiLCJnZXRDb21tYW5kIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiYnVpbGRQcm9wZXJ0eSIsImZpbHRlciIsIm1hcCIsInNlcnZlclZlcnNpb24iLCJncmFkbGVQcm9wZXJ0eSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJCb29sZWFuIiwicHVzaCIsImtleXMiLCJ1cHBlckZpcnN0IiwiayIsInYiLCJ2ZXJzaW9uIiwicHJvcGVydGllc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsIm9yaWdpbmFsUHJvcGVydGllcyIsImZzIiwicmVhZEZpbGUiLCJuZXdQcm9wZXJ0aWVzIiwidXBkYXRlR3JhZGxlRGlzdFVybCIsIndyaXRlRmlsZSIsInByb3BlcnRpZXNDb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImhhc0FkZGl0aW9uYWxEZXBzIiwiaXNBcnJheSIsIkVycm9yIiwiaXNFbXB0eSIsImxpbmUiLCJ0cmltIiwiZGVwIiwidGVzdCIsImJ1aWxkUGF0aCIsImNvbmZpZ3VyYXRpb24iLCJwcmVmaXgiLCJkZXBzIiwiaW5mbyIsImRlYnVnIiwiam9pbiIsImdyYWRsZWJ1aWxkIiwiU3ViUHJvY2VzcyIsImN3ZCIsInN0ZGlvIiwid2luZG93c1ZlcmJhdGltQXJndW1lbnRzIiwiYnVpbGRMYXN0TGluZXMiLCJsb2dNc2ciLCJvbiIsInN0YXJ0c1dpdGgiLCJFT0wiLCJsZW5ndGgiLCJzdGFydCIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxrQkFBMUI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvRUFBNUI7O0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUFDLDJCQUFELEVBQThCLG1DQUE5QixDQUE5QjtBQUVBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsa0JBRG1CLEVBRW5CLHFCQUZtQixFQUduQixZQUhtQixFQUluQixZQUptQixFQUtuQixRQUxtQixFQU1uQixXQU5tQixFQU9uQixRQVBtQixFQVFuQixxQkFSbUIsRUFTbkIscUJBVG1CLEVBVW5CLFdBVm1CLENBQXJCOzs7QUFhQSxNQUFNTSxTQUFTLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLFFBQWpCLENBQWxCOztBQUVBLFNBQVNDLHdCQUFULENBQW1DQyxJQUFu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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCBzeXN0ZW0gfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyB1cGRhdGVEZXBlbmRlbmN5TGluZXMgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgR1JBRExFX1ZFUlNJT05fS0VZID0gJ2dyYWRsZSc7XG5jb25zdCBHUkFETEVfVVJMX1BSRUZJWCA9ICdkaXN0cmlidXRpb25Vcmw9JztcbmNvbnN0IEdSQURMRV9VUkxfVEVNUExBVEUgPSAnaHR0cHNcXFxcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS1WRVJTSU9OLWFsbC56aXAnO1xuY29uc3QgR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMgPSAxNTtcbmNvbnN0IERFUEVOREVOQ1lfUFJPUF9OQU1FUyA9IFsnYWRkaXRpb25hbEFwcERlcGVuZGVuY2llcycsICdhZGRpdGlvbmFsQW5kcm9pZFRlc3REZXBlbmRlbmNpZXMnXTtcblxuY29uc3QgVkVSU0lPTl9LRVlTID0gW1xuICBHUkFETEVfVkVSU0lPTl9LRVksXG4gICdhbmRyb2lkR3JhZGxlUGx1Z2luJyxcbiAgJ2NvbXBpbGVTZGsnLFxuICAnYnVpbGRUb29scycsXG4gICdtaW5TZGsnLFxuICAndGFyZ2V0U2RrJyxcbiAgJ2tvdGxpbicsXG4gICdzb3VyY2VDb21wYXRpYmlsaXR5JyxcbiAgJ3RhcmdldENvbXBhdGliaWxpdHknLFxuICAnanZtVGFyZ2V0J1xuXTtcblxuY29uc3QgZ3JhZGxlTG9nID0gbG9nZ2VyLmdldExvZ2dlcignR3JhZGxlJyk7XG5cbmZ1bmN0aW9uIGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyAoYXJncykge1xuICByZXR1cm4ge1xuICAgIHppcEFsaWduOiB0cnVlLFxuICAgIGtleXN0b3JlRmlsZTogYXJncy5rZXlzdG9yZUZpbGUsXG4gICAga2V5c3RvcmVQYXNzd29yZDogYXJncy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzOiBhcmdzLmtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkOiBhcmdzLmtleVBhc3N3b3JkXG4gIH07XG59XG5cbmNsYXNzIFNlcnZlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5zZXJ2ZXJQYXRoID0gYXJncy5zZXJ2ZXJQYXRoO1xuICAgIHRoaXMuc2hvd0dyYWRsZUxvZyA9IGFyZ3Muc2hvd0dyYWRsZUxvZztcblxuICAgIGNvbnN0IGJ1aWxkQ29uZmlndXJhdGlvbiA9IGFyZ3MuYnVpbGRDb25maWd1cmF0aW9uIHx8IHt9O1xuXG4gICAgY29uc3QgdmVyc2lvbkNvbmZpZ3VyYXRpb24gPSBidWlsZENvbmZpZ3VyYXRpb24udG9vbHNWZXJzaW9ucyB8fCB7fTtcbiAgICB0aGlzLnNlcnZlclZlcnNpb25zID0gXy5yZWR1Y2UodmVyc2lvbkNvbmZpZ3VyYXRpb24sIChhY2MsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmIChWRVJTSU9OX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oYEdvdCB1bmV4cGVjdGVkICcke2tleX0nIGluIHRvb2xzVmVyc2lvbiBibG9jayBvZiB0aGUgYnVpbGQgY29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICB0aGlzLnRlc3RBcHBQYWNrYWdlID0gYXJncy50ZXN0QXBwUGFja2FnZTtcbiAgICB0aGlzLnNpZ25pbmdDb25maWcgPSBhcmdzLnNpZ25pbmdDb25maWc7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIERFUEVOREVOQ1lfUFJPUF9OQU1FUykge1xuICAgICAgdGhpc1twcm9wTmFtZV0gPSBidWlsZENvbmZpZ3VyYXRpb25bcHJvcE5hbWVdIHx8IFtdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1aWxkICgpIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXJWZXJzaW9uc1tHUkFETEVfVkVSU0lPTl9LRVldKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldEdyYWRsZVdyYXBwZXJWZXJzaW9uKHRoaXMuc2VydmVyVmVyc2lvbnNbR1JBRExFX1ZFUlNJT05fS0VZXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbnNlcnRBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJ1bkJ1aWxkUHJvY2VzcygpO1xuICB9XG5cbiAgZ2V0Q29tbWFuZCAoKSB7XG4gICAgY29uc3QgY21kID0gc3lzdGVtLmlzV2luZG93cygpID8gJ2dyYWRsZXcuYmF0JyA6ICcuL2dyYWRsZXcnO1xuICAgIGNvbnN0IGJ1aWxkUHJvcGVydHkgPSAoa2V5LCB2YWx1ZSkgPT4gdmFsdWUgPyBgLVAke2tleX09JHt2YWx1ZX1gIDogbnVsbDtcbiAgICBsZXQgYXJncyA9IFZFUlNJT05fS0VZU1xuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IEdSQURMRV9WRVJTSU9OX0tFWSlcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gdGhpcy5zZXJ2ZXJWZXJzaW9uc1trZXldO1xuICAgICAgICBjb25zdCBncmFkbGVQcm9wZXJ0eSA9IGBhcHBpdW0ke2tleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gO1xuICAgICAgICByZXR1cm4gYnVpbGRQcm9wZXJ0eShncmFkbGVQcm9wZXJ0eSwgc2VydmVyVmVyc2lvbik7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmICh0aGlzLnNpZ25pbmdDb25maWcpIHtcbiAgICAgIGFyZ3MucHVzaCguLi4oXG4gICAgICAgIF8ua2V5cyh0aGlzLnNpZ25pbmdDb25maWcpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gW2BhcHBpdW0ke18udXBwZXJGaXJzdChrZXkpfWAsIHRoaXMuc2lnbmluZ0NvbmZpZ1trZXldXSlcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBidWlsZFByb3BlcnR5KGssIHYpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXN0QXBwUGFja2FnZSkge1xuICAgICAgYXJncy5wdXNoKGJ1aWxkUHJvcGVydHkoJ2FwcGl1bVRhcmdldFBhY2thZ2UnLCB0aGlzLnRlc3RBcHBQYWNrYWdlKSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnYXBwOmFzc2VtYmxlQW5kcm9pZFRlc3QnKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIHNldEdyYWRsZVdyYXBwZXJWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgY29uc3QgcHJvcGVydGllc1BhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnZ3JhZGxlJywgJ3dyYXBwZXInLCAnZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcycpO1xuICAgIGNvbnN0IG9yaWdpbmFsUHJvcGVydGllcyA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BlcnRpZXNQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG5ld1Byb3BlcnRpZXMgPSB0aGlzLnVwZGF0ZUdyYWRsZURpc3RVcmwob3JpZ2luYWxQcm9wZXJ0aWVzLCB2ZXJzaW9uKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocHJvcGVydGllc1BhdGgsIG5ld1Byb3BlcnRpZXMsICd1dGY4Jyk7XG4gIH1cblxuICB1cGRhdGVHcmFkbGVEaXN0VXJsIChwcm9wZXJ0aWVzQ29udGVudCwgdmVyc2lvbikge1xuICAgIHJldHVybiBwcm9wZXJ0aWVzQ29udGVudC5yZXBsYWNlKFxuICAgICAgbmV3IFJlZ0V4cChgXigke18uZXNjYXBlUmVnRXhwKEdSQURMRV9VUkxfUFJFRklYKX0pLiskYCwgJ2dtJyksXG4gICAgICBgJDEke0dSQURMRV9VUkxfVEVNUExBVEUucmVwbGFjZSgnVkVSU0lPTicsIHZlcnNpb24pfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcyAoKSB7XG4gICAgbGV0IGhhc0FkZGl0aW9uYWxEZXBzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHRoaXNbcHJvcE5hbWVdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3Byb3BOYW1lfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eSh0aGlzW3Byb3BOYW1lXS5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzW3Byb3BOYW1lXSkge1xuICAgICAgICBpZiAoL1tcXHMnXFxcXCRdLy50ZXN0KGRlcCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpbmdsZSBxdW90ZXMsIGRvbGxhciBjaGFyYWN0ZXJzIGFuZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMnICtcbiAgICAgICAgICAgIGAgYXJlIGRpc2FsbG93ZWQgaW4gYWRkaXRpb25hbCBkZXBlbmRlbmNpZXM6ICR7ZGVwfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBoYXNBZGRpdGlvbmFsRGVwcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaGFzQWRkaXRpb25hbERlcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnYXBwJywgJ2J1aWxkLmdyYWRsZS5rdHMnKTtcbiAgICBsZXQgY29uZmlndXJhdGlvbiA9IGF3YWl0IGZzLnJlYWRGaWxlKGJ1aWxkUGF0aCwgJ3V0ZjgnKTtcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIERFUEVOREVOQ1lfUFJPUF9OQU1FUykge1xuICAgICAgY29uc3QgcHJlZml4ID0gcHJvcE5hbWUgPT09IERFUEVOREVOQ1lfUFJPUF9OQU1FU1swXVxuICAgICAgICA/ICdpbXBsZW1lbnRhdGlvbidcbiAgICAgICAgOiAnYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbic7XG4gICAgICBjb25zdCBkZXBzID0gdGhpc1twcm9wTmFtZV1cbiAgICAgICAgLmZpbHRlcigobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgICAgICAubWFwKChsaW5lKSA9PiBgJHtwcmVmaXh9KFwiJHtsaW5lfVwiKWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkZXBzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbG9nLmluZm8oYEFkZGluZyB0aGUgZm9sbG93aW5nICR7cHJvcE5hbWV9IHRvIGJ1aWxkLmdyYWRsZS5rdHM6ICR7ZGVwc31gKTtcbiAgICAgIGNvbmZpZ3VyYXRpb24gPSB1cGRhdGVEZXBlbmRlbmN5TGluZXMoY29uZmlndXJhdGlvbiwgcHJvcE5hbWUsIGRlcHMpO1xuICAgIH1cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYnVpbGRQYXRoLCBjb25maWd1cmF0aW9uLCAndXRmOCcpO1xuICB9XG5cbiAgYXN5bmMgcnVuQnVpbGRQcm9jZXNzICgpIHtcbiAgICBjb25zdCB7Y21kLCBhcmdzfSA9IHRoaXMuZ2V0Q29tbWFuZCgpO1xuICAgIGxvZy5kZWJ1ZyhgQmVnaW5uaW5nIGJ1aWxkIHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgIGBpbiBkaXJlY3RvcnkgJyR7dGhpcy5zZXJ2ZXJQYXRofSdgKTtcbiAgICBjb25zdCBncmFkbGVidWlsZCA9IG5ldyBTdWJQcm9jZXNzKGNtZCwgYXJncywge1xuICAgICAgY3dkOiB0aGlzLnNlcnZlclBhdGgsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgICB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IHRydWVcbiAgICB9KTtcbiAgICBsZXQgYnVpbGRMYXN0TGluZXMgPSBbXTtcblxuICAgIGNvbnN0IGxvZ01zZyA9IGBPdXRwdXQgZnJvbSBHcmFkbGUgJHt0aGlzLnNob3dHcmFkbGVMb2cgPyAnd2lsbCcgOiAnd2lsbCBub3QnfSBiZSBsb2dnZWRgO1xuICAgIGxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93R3JhZGxlTG9nJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgICBncmFkbGVidWlsZC5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0dyYWRsZUxvZykge1xuICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCdbU1RERVJSXScpKSB7XG4gICAgICAgICAgZ3JhZGxlTG9nLndhcm4obGluZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JhZGxlTG9nLmluZm8obGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1aWxkTGFzdExpbmVzLnB1c2goYCR7RU9MfSR7bGluZX1gKTtcbiAgICAgIGlmIChidWlsZExhc3RMaW5lcy5sZW5ndGggPiBHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUykge1xuICAgICAgICBidWlsZExhc3RMaW5lcyA9IGJ1aWxkTGFzdExpbmVzLnNsaWNlKC1HUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ3JhZGxlYnVpbGQuc3RhcnQoKTtcbiAgICAgIGF3YWl0IGdyYWRsZWJ1aWxkLmpvaW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxldCBtc2cgPSBgVW5hYmxlIHRvIGJ1aWxkIEVzcHJlc3NvIHNlcnZlciAtICR7ZXJyLm1lc3NhZ2V9XFxuYCArXG4gICAgICAgIGBHcmFkbGUgZXJyb3IgbWVzc2FnZToke0VPTH0ke2J1aWxkTGFzdExpbmVzfWA7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBTZXJ2ZXJCdWlsZGVyLCBWRVJTSU9OX0tFWVMsIEdSQURMRV9VUkxfVEVNUExBVEUsIGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyB9O1xuZXhwb3J0IGRlZmF1bHQgU2VydmVyQnVpbGRlcjtcbiJdLCJmaWxlIjoibGliL3NlcnZlci1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
206
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJuYW1lcyI6WyJHUkFETEVfVkVSU0lPTl9LRVkiLCJHUkFETEVfVVJMX1BSRUZJWCIsIkdSQURMRV9VUkxfVEVNUExBVEUiLCJHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyIsIkRFUEVOREVOQ1lfUFJPUF9OQU1FUyIsIlZFUlNJT05fS0VZUyIsImJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyIsImFyZ3MiLCJ6aXBBbGlnbiIsImtleXN0b3JlRmlsZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiU2VydmVyQnVpbGRlciIsImNvbnN0cnVjdG9yIiwibG9nIiwic2VydmVyUGF0aCIsInNob3dHcmFkbGVMb2ciLCJidWlsZENvbmZpZ3VyYXRpb24iLCJ2ZXJzaW9uQ29uZmlndXJhdGlvbiIsInRvb2xzVmVyc2lvbnMiLCJzZXJ2ZXJWZXJzaW9ucyIsIl8iLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImtleSIsImluY2x1ZGVzIiwid2FybiIsInRlc3RBcHBQYWNrYWdlIiwic2lnbmluZ0NvbmZpZyIsInByb3BOYW1lIiwiYnVpbGQiLCJzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiIsImluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMiLCJydW5CdWlsZFByb2Nlc3MiLCJnZXRDb21tYW5kIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwicGF0aCIsInJlc29sdmUiLCJidWlsZFByb3BlcnR5IiwiZmlsdGVyIiwibWFwIiwic2VydmVyVmVyc2lvbiIsImdyYWRsZVByb3BlcnR5IiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsIkJvb2xlYW4iLCJwdXNoIiwia2V5cyIsInVwcGVyRmlyc3QiLCJrIiwidiIsInZlcnNpb24iLCJwcm9wZXJ0aWVzUGF0aCIsIm9yaWdpbmFsUHJvcGVydGllcyIsImZzIiwicmVhZEZpbGUiLCJuZXdQcm9wZXJ0aWVzIiwidXBkYXRlR3JhZGxlRGlzdFVybCIsIndyaXRlRmlsZSIsInByb3BlcnRpZXNDb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImhhc0FkZGl0aW9uYWxEZXBzIiwiaXNBcnJheSIsIkVycm9yIiwiaXNFbXB0eSIsImxpbmUiLCJ0cmltIiwiZGVwIiwidGVzdCIsImJ1aWxkUGF0aCIsImNvbmZpZ3VyYXRpb24iLCJwcmVmaXgiLCJkZXBzIiwiaW5mbyIsImRlYnVnIiwiam9pbiIsImdyYWRsZWJ1aWxkIiwiU3ViUHJvY2VzcyIsImN3ZCIsInN0ZGlvIiwid2luZG93c1ZlcmJhdGltQXJndW1lbnRzIiwiYnVpbGRMYXN0TGluZXMiLCJsb2dNc2ciLCJvbiIsInN0YXJ0c1dpdGgiLCJFT0wiLCJsZW5ndGgiLCJzdGFydCIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxrQkFBMUI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvRUFBNUI7O0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUFDLDJCQUFELEVBQThCLG1DQUE5QixDQUE5QjtBQUVBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsa0JBRG1CLEVBRW5CLHFCQUZtQixFQUduQixZQUhtQixFQUluQixZQUptQixFQUtuQixRQUxtQixFQU1uQixXQU5tQixFQU9uQixRQVBtQixFQVFuQixxQkFSbUIsRUFTbkIscUJBVG1CLEVBVW5CLFdBVm1CLEVBV25CLGdCQVhtQixDQUFyQjs7O0FBY0EsU0FBU00sd0JBQVQsQ0FBbUNDLElBQW5DLEVBQXlDO0FBQ3ZDLFNBQU87QUFDTEMsSUFBQUEsUUFBUSxFQUFFLElBREw7QUFFTEMsSUFBQUEsWUFBWSxFQUFFRixJQUFJLENBQUNF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LFdBQUt6RSxHQUFMLENBQVNtRixhQUFULENBQXVCRixHQUF2QjtBQUNEO0FBQ0Y7O0FBM0ppQjs7O2VBK0pMbkYsYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHN5c3RlbSB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyB1cGRhdGVEZXBlbmRlbmN5TGluZXMgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgR1JBRExFX1ZFUlNJT05fS0VZID0gJ2dyYWRsZSc7XG5jb25zdCBHUkFETEVfVVJMX1BSRUZJWCA9ICdkaXN0cmlidXRpb25Vcmw9JztcbmNvbnN0IEdSQURMRV9VUkxfVEVNUExBVEUgPSAnaHR0cHNcXFxcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS1WRVJTSU9OLWFsbC56aXAnO1xuY29uc3QgR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMgPSAxNTtcbmNvbnN0IERFUEVOREVOQ1lfUFJPUF9OQU1FUyA9IFsnYWRkaXRpb25hbEFwcERlcGVuZGVuY2llcycsICdhZGRpdGlvbmFsQW5kcm9pZFRlc3REZXBlbmRlbmNpZXMnXTtcblxuY29uc3QgVkVSU0lPTl9LRVlTID0gW1xuICBHUkFETEVfVkVSU0lPTl9LRVksXG4gICdhbmRyb2lkR3JhZGxlUGx1Z2luJyxcbiAgJ2NvbXBpbGVTZGsnLFxuICAnYnVpbGRUb29scycsXG4gICdtaW5TZGsnLFxuICAndGFyZ2V0U2RrJyxcbiAgJ2tvdGxpbicsXG4gICdzb3VyY2VDb21wYXRpYmlsaXR5JyxcbiAgJ3RhcmdldENvbXBhdGliaWxpdHknLFxuICAnanZtVGFyZ2V0JyxcbiAgJ2NvbXBvc2VWZXJzaW9uJ1xuXTtcblxuZnVuY3Rpb24gYnVpbGRTZXJ2ZXJTaWduaW5nQ29uZmlnIChhcmdzKSB7XG4gIHJldHVybiB7XG4gICAgemlwQWxpZ246IHRydWUsXG4gICAga2V5c3RvcmVGaWxlOiBhcmdzLmtleXN0b3JlRmlsZSxcbiAgICBrZXlzdG9yZVBhc3N3b3JkOiBhcmdzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXM6IGFyZ3Mua2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQ6IGFyZ3Mua2V5UGFzc3dvcmRcbiAgfTtcbn1cblxuY2xhc3MgU2VydmVyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yIChsb2csIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuc2VydmVyUGF0aCA9IGFyZ3Muc2VydmVyUGF0aDtcbiAgICB0aGlzLnNob3dHcmFkbGVMb2cgPSBhcmdzLnNob3dHcmFkbGVMb2c7XG5cbiAgICBjb25zdCBidWlsZENvbmZpZ3VyYXRpb24gPSBhcmdzLmJ1aWxkQ29uZmlndXJhdGlvbiB8fCB7fTtcblxuICAgIGNvbnN0IHZlcnNpb25Db25maWd1cmF0aW9uID0gYnVpbGRDb25maWd1cmF0aW9uLnRvb2xzVmVyc2lvbnMgfHwge307XG4gICAgdGhpcy5zZXJ2ZXJWZXJzaW9ucyA9IF8ucmVkdWNlKHZlcnNpb25Db25maWd1cmF0aW9uLCAoYWNjLCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAoVkVSU0lPTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGBHb3QgdW5leHBlY3RlZCAnJHtrZXl9JyBpbiB0b29sc1ZlcnNpb24gYmxvY2sgb2YgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgdGhpcy50ZXN0QXBwUGFja2FnZSA9IGFyZ3MudGVzdEFwcFBhY2thZ2U7XG4gICAgdGhpcy5zaWduaW5nQ29uZmlnID0gYXJncy5zaWduaW5nQ29uZmlnO1xuXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIHRoaXNbcHJvcE5hbWVdID0gYnVpbGRDb25maWd1cmF0aW9uW3Byb3BOYW1lXSB8fCBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBidWlsZCAoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyVmVyc2lvbnNbR1JBRExFX1ZFUlNJT05fS0VZXSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRHcmFkbGVXcmFwcGVyVmVyc2lvbih0aGlzLnNlcnZlclZlcnNpb25zW0dSQURMRV9WRVJTSU9OX0tFWV0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcygpO1xuXG4gICAgYXdhaXQgdGhpcy5ydW5CdWlsZFByb2Nlc3MoKTtcbiAgfVxuXG4gIGdldENvbW1hbmQgKCkge1xuICAgIGNvbnN0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKSA/ICdncmFkbGV3LmJhdCcgOiBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnZ3JhZGxldycpO1xuICAgIGNvbnN0IGJ1aWxkUHJvcGVydHkgPSAoa2V5LCB2YWx1ZSkgPT4gdmFsdWUgPyBgLVAke2tleX09JHt2YWx1ZX1gIDogbnVsbDtcbiAgICBsZXQgYXJncyA9IFZFUlNJT05fS0VZU1xuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IEdSQURMRV9WRVJTSU9OX0tFWSlcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gdGhpcy5zZXJ2ZXJWZXJzaW9uc1trZXldO1xuICAgICAgICBjb25zdCBncmFkbGVQcm9wZXJ0eSA9IGBhcHBpdW0ke2tleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gO1xuICAgICAgICByZXR1cm4gYnVpbGRQcm9wZXJ0eShncmFkbGVQcm9wZXJ0eSwgc2VydmVyVmVyc2lvbik7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmICh0aGlzLnNpZ25pbmdDb25maWcpIHtcbiAgICAgIGFyZ3MucHVzaCguLi4oXG4gICAgICAgIF8ua2V5cyh0aGlzLnNpZ25pbmdDb25maWcpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gW2BhcHBpdW0ke18udXBwZXJGaXJzdChrZXkpfWAsIHRoaXMuc2lnbmluZ0NvbmZpZ1trZXldXSlcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBidWlsZFByb3BlcnR5KGssIHYpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXN0QXBwUGFja2FnZSkge1xuICAgICAgYXJncy5wdXNoKGJ1aWxkUHJvcGVydHkoJ2FwcGl1bVRhcmdldFBhY2thZ2UnLCB0aGlzLnRlc3RBcHBQYWNrYWdlKSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnYXBwOmFzc2VtYmxlQW5kcm9pZFRlc3QnKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIHNldEdyYWRsZVdyYXBwZXJWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgY29uc3QgcHJvcGVydGllc1BhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnZ3JhZGxlJywgJ3dyYXBwZXInLCAnZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcycpO1xuICAgIGNvbnN0IG9yaWdpbmFsUHJvcGVydGllcyA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BlcnRpZXNQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG5ld1Byb3BlcnRpZXMgPSB0aGlzLnVwZGF0ZUdyYWRsZURpc3RVcmwob3JpZ2luYWxQcm9wZXJ0aWVzLCB2ZXJzaW9uKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocHJvcGVydGllc1BhdGgsIG5ld1Byb3BlcnRpZXMsICd1dGY4Jyk7XG4gIH1cblxuICB1cGRhdGVHcmFkbGVEaXN0VXJsIChwcm9wZXJ0aWVzQ29udGVudCwgdmVyc2lvbikge1xuICAgIHJldHVybiBwcm9wZXJ0aWVzQ29udGVudC5yZXBsYWNlKFxuICAgICAgbmV3IFJlZ0V4cChgXigke18uZXNjYXBlUmVnRXhwKEdSQURMRV9VUkxfUFJFRklYKX0pLiskYCwgJ2dtJyksXG4gICAgICBgJDEke0dSQURMRV9VUkxfVEVNUExBVEUucmVwbGFjZSgnVkVSU0lPTicsIHZlcnNpb24pfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcyAoKSB7XG4gICAgbGV0IGhhc0FkZGl0aW9uYWxEZXBzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHRoaXNbcHJvcE5hbWVdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3Byb3BOYW1lfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eSh0aGlzW3Byb3BOYW1lXS5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzW3Byb3BOYW1lXSkge1xuICAgICAgICBpZiAoL1tcXHMnXFxcXCRdLy50ZXN0KGRlcCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpbmdsZSBxdW90ZXMsIGRvbGxhciBjaGFyYWN0ZXJzIGFuZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMnICtcbiAgICAgICAgICAgIGAgYXJlIGRpc2FsbG93ZWQgaW4gYWRkaXRpb25hbCBkZXBlbmRlbmNpZXM6ICR7ZGVwfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBoYXNBZGRpdGlvbmFsRGVwcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaGFzQWRkaXRpb25hbERlcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnYXBwJywgJ2J1aWxkLmdyYWRsZS5rdHMnKTtcbiAgICBsZXQgY29uZmlndXJhdGlvbiA9IGF3YWl0IGZzLnJlYWRGaWxlKGJ1aWxkUGF0aCwgJ3V0ZjgnKTtcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIERFUEVOREVOQ1lfUFJPUF9OQU1FUykge1xuICAgICAgY29uc3QgcHJlZml4ID0gcHJvcE5hbWUgPT09IERFUEVOREVOQ1lfUFJPUF9OQU1FU1swXVxuICAgICAgICA/ICdpbXBsZW1lbnRhdGlvbidcbiAgICAgICAgOiAnYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbic7XG4gICAgICBjb25zdCBkZXBzID0gdGhpc1twcm9wTmFtZV1cbiAgICAgICAgLmZpbHRlcigobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgICAgICAubWFwKChsaW5lKSA9PiBgJHtwcmVmaXh9KFwiJHtsaW5lfVwiKWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkZXBzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuaW5mbyhgQWRkaW5nIHRoZSBmb2xsb3dpbmcgJHtwcm9wTmFtZX0gdG8gYnVpbGQuZ3JhZGxlLmt0czogJHtkZXBzfWApO1xuICAgICAgY29uZmlndXJhdGlvbiA9IHVwZGF0ZURlcGVuZGVuY3lMaW5lcyhjb25maWd1cmF0aW9uLCBwcm9wTmFtZSwgZGVwcyk7XG4gICAgfVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShidWlsZFBhdGgsIGNvbmZpZ3VyYXRpb24sICd1dGY4Jyk7XG4gIH1cblxuICBhc3luYyBydW5CdWlsZFByb2Nlc3MgKCkge1xuICAgIGNvbnN0IHtjbWQsIGFyZ3N9ID0gdGhpcy5nZXRDb21tYW5kKCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEJlZ2lubmluZyBidWlsZCB3aXRoIGNvbW1hbmQgJyR7Y21kfSAke2FyZ3Muam9pbignICcpfScgYCArXG4gICAgICBgaW4gZGlyZWN0b3J5ICcke3RoaXMuc2VydmVyUGF0aH0nYCk7XG4gICAgY29uc3QgZ3JhZGxlYnVpbGQgPSBuZXcgU3ViUHJvY2VzcyhjbWQsIGFyZ3MsIHtcbiAgICAgIGN3ZDogdGhpcy5zZXJ2ZXJQYXRoLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiB0cnVlXG4gICAgfSk7XG4gICAgbGV0IGJ1aWxkTGFzdExpbmVzID0gW107XG5cbiAgICBjb25zdCBsb2dNc2cgPSBgT3V0cHV0IGZyb20gR3JhZGxlICR7dGhpcy5zaG93R3JhZGxlTG9nID8gJ3dpbGwnIDogJ3dpbGwgbm90J30gYmUgbG9nZ2VkYDtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93R3JhZGxlTG9nJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgICBncmFkbGVidWlsZC5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0dyYWRsZUxvZykge1xuICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCdbU1RERVJSXScpKSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihgW0dyYWRsZV0gJHtsaW5lfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFtHcmFkbGVdICR7bGluZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVpbGRMYXN0TGluZXMucHVzaChgJHtFT0x9JHtsaW5lfWApO1xuICAgICAgaWYgKGJ1aWxkTGFzdExpbmVzLmxlbmd0aCA+IEdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTKSB7XG4gICAgICAgIGJ1aWxkTGFzdExpbmVzID0gYnVpbGRMYXN0TGluZXMuc2xpY2UoLUdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBncmFkbGVidWlsZC5zdGFydCgpO1xuICAgICAgYXdhaXQgZ3JhZGxlYnVpbGQuam9pbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gYnVpbGQgRXNwcmVzc28gc2VydmVyIC0gJHtlcnIubWVzc2FnZX1cXG5gICtcbiAgICAgICAgYEdyYWRsZSBlcnJvciBtZXNzYWdlOiR7RU9MfSR7YnVpbGRMYXN0TGluZXN9YDtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VydmVyQnVpbGRlciwgVkVSU0lPTl9LRVlTLCBHUkFETEVfVVJMX1RFTVBMQVRFLCBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgfTtcbmV4cG9ydCBkZWZhdWx0IFNlcnZlckJ1aWxkZXI7XG4iXSwiZmlsZSI6ImxpYi9zZXJ2ZXItYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|