appium-android-driver 5.0.4 → 5.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/build/lib/commands/actions.js +16 -20
  2. package/build/lib/commands/app-management.js +10 -18
  3. package/build/lib/commands/context.js +43 -56
  4. package/build/lib/commands/coverage.js +2 -6
  5. package/build/lib/commands/element.js +3 -9
  6. package/build/lib/commands/emu-console.js +3 -5
  7. package/build/lib/commands/execute.js +3 -6
  8. package/build/lib/commands/file-actions.js +22 -29
  9. package/build/lib/commands/general.js +18 -30
  10. package/build/lib/commands/ime.js +8 -21
  11. package/build/lib/commands/network.js +14 -27
  12. package/build/lib/commands/performance.js +3 -6
  13. package/build/lib/commands/recordscreen.js +27 -38
  14. package/build/lib/commands/shell.js +6 -7
  15. package/build/lib/commands/streamscreen.js +29 -43
  16. package/build/lib/commands/system-bars.js +10 -16
  17. package/build/lib/commands/touch.js +4 -10
  18. package/build/lib/driver.js +36 -60
  19. package/build/lib/webview-helpers.js +3 -3
  20. package/lib/commands/actions.js +18 -19
  21. package/lib/commands/app-management.js +10 -11
  22. package/lib/commands/context.js +33 -34
  23. package/lib/commands/coverage.js +1 -4
  24. package/lib/commands/element.js +2 -3
  25. package/lib/commands/emu-console.js +2 -2
  26. package/lib/commands/execute.js +2 -3
  27. package/lib/commands/file-actions.js +31 -25
  28. package/lib/commands/general.js +16 -18
  29. package/lib/commands/ime.js +7 -8
  30. package/lib/commands/network.js +15 -16
  31. package/lib/commands/performance.js +2 -3
  32. package/lib/commands/recordscreen.js +23 -22
  33. package/lib/commands/shell.js +6 -6
  34. package/lib/commands/streamscreen.js +22 -23
  35. package/lib/commands/system-bars.js +11 -10
  36. package/lib/commands/touch.js +3 -4
  37. package/lib/driver.js +35 -36
  38. package/lib/webview-helpers.js +3 -1
  39. package/package.json +2 -2
@@ -13,8 +13,6 @@ var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
14
  var _support = require("@appium/support");
15
15
 
16
- var _logger = _interopRequireDefault(require("../logger"));
17
-
18
16
  var _teen_process = require("teen_process");
19
17
 
20
18
  var _portscanner = require("portscanner");
@@ -95,7 +93,7 @@ async function verifyStreamingRequirements(adb) {
95
93
  await _bluebird.default.all(moduleCheckPromises);
96
94
  }
97
95
 
98
- async function getDeviceInfo(adb) {
96
+ async function getDeviceInfo(adb, log = null) {
99
97
  const output = await adb.shell(['dumpsys', 'display']);
100
98
  const result = {};
101
99
 
@@ -103,8 +101,7 @@ async function getDeviceInfo(adb) {
103
101
  const match = pattern.exec(output);
104
102
 
105
103
  if (!match) {
106
- _logger.default.debug(output);
107
-
104
+ log === null || log === void 0 ? void 0 : log.debug(output);
108
105
  throw new Error(`Cannot parse the device ${key} from the adb command output. ` + `Check the server log for more details.`);
109
106
  }
110
107
 
@@ -115,7 +112,7 @@ async function getDeviceInfo(adb) {
115
112
  return result;
116
113
  }
117
114
 
118
- async function initDeviceStreamingProc(adb, deviceInfo, opts = {}) {
115
+ async function initDeviceStreamingProc(adb, log, deviceInfo, opts = {}) {
119
116
  const {
120
117
  width,
121
118
  height,
@@ -137,7 +134,7 @@ async function initDeviceStreamingProc(adb, deviceInfo, opts = {}) {
137
134
  const adbArgs = [...adb.executable.defaultArgs, 'exec-out', `while true; do ${screenRecordCmd} -; done`];
138
135
  const deviceStreaming = (0, _child_process.spawn)(adb.executable.path, adbArgs);
139
136
  deviceStreaming.on('exit', (code, signal) => {
140
- _logger.default.debug(`Device streaming process exited with code ${code}, signal ${signal}`);
137
+ log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);
141
138
  });
142
139
  let isStarted = false;
143
140
  const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);
@@ -161,14 +158,13 @@ async function initDeviceStreamingProc(adb, deviceInfo, opts = {}) {
161
158
  deviceStreaming.stdout.on('data', startupListener);
162
159
 
163
160
  try {
164
- _logger.default.info(`Starting device streaming: ${_support.util.quote([adb.executable.path, ...adbArgs])}`);
165
-
161
+ log.info(`Starting device streaming: ${_support.util.quote([adb.executable.path, ...adbArgs])}`);
166
162
  await (0, _asyncbox.waitForCondition)(() => isStarted, {
167
163
  waitMs: STREAMING_STARTUP_TIMEOUT_MS,
168
164
  intervalMs: 300
169
165
  });
170
166
  } catch (e) {
171
- _logger.default.errorAndThrow(`Cannot start the screen streaming process. Original error: ${e.message}`);
167
+ log.errorAndThrow(`Cannot start the screen streaming process. Original error: ${e.message}`);
172
168
  } finally {
173
169
  deviceStreaming.stderr.removeListener('data', errorsListener);
174
170
  deviceStreaming.stdout.removeListener('data', startupListener);
@@ -177,7 +173,7 @@ async function initDeviceStreamingProc(adb, deviceInfo, opts = {}) {
177
173
  return deviceStreaming;
178
174
  }
179
175
 
180
- async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, opts = {}) {
176
+ async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, log, opts = {}) {
181
177
  const {
182
178
  width,
183
179
  height,
@@ -192,7 +188,7 @@ async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, opts = {})
192
188
  stdio: [deviceStreamingProc.stdout, 'pipe', 'pipe']
193
189
  });
194
190
  gstreamerPipeline.on('exit', (code, signal) => {
195
- _logger.default.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);
191
+ log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);
196
192
  });
197
193
  const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);
198
194
 
@@ -206,8 +202,7 @@ async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, opts = {})
206
202
  let didFail = false;
207
203
 
208
204
  try {
209
- _logger.default.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);
210
-
205
+ log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);
211
206
  await gstreamerPipeline.start(0);
212
207
  await (0, _asyncbox.waitForCondition)(async () => {
213
208
  try {
@@ -221,8 +216,7 @@ async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, opts = {})
221
216
  });
222
217
  } catch (e) {
223
218
  didFail = true;
224
-
225
- _logger.default.errorAndThrow(`Cannot start the screen streaming pipeline. Original error: ${e.message}`);
219
+ log.errorAndThrow(`Cannot start the screen streaming pipeline. Original error: ${e.message}`);
226
220
  } finally {
227
221
  if (!logPipelineDetails || didFail) {
228
222
  gstreamerPipeline.removeListener('output', gstOutputListener);
@@ -256,24 +250,22 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
256
250
  }
257
251
 
258
252
  if (!_lodash.default.isEmpty(this._screenStreamingProps)) {
259
- _logger.default.info(`The screen streaming session is already running. ` + `Stop it first in order to start a new one.`);
260
-
253
+ this.log.info(`The screen streaming session is already running. ` + `Stop it first in order to start a new one.`);
261
254
  return;
262
255
  }
263
256
 
264
257
  if ((await (0, _portscanner.checkPortStatus)(port, host)) === 'open') {
265
- _logger.default.info(`The port #${port} at ${host} is busy. ` + `Assuming the screen streaming is already running`);
266
-
258
+ this.log.info(`The port #${port} at ${host} is busy. ` + `Assuming the screen streaming is already running`);
267
259
  return;
268
260
  }
269
261
 
270
262
  if ((await (0, _portscanner.checkPortStatus)(tcpPort, TCP_HOST)) === 'open') {
271
- _logger.default.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` + `Make sure there are no leftovers from previous sessions.`);
263
+ this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` + `Make sure there are no leftovers from previous sessions.`);
272
264
  }
273
265
 
274
266
  this._screenStreamingProps = null;
275
- const deviceInfo = await getDeviceInfo(this.adb);
276
- const deviceStreamingProc = await initDeviceStreamingProc(this.adb, deviceInfo, {
267
+ const deviceInfo = await getDeviceInfo(this.adb, this.log);
268
+ const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {
277
269
  width,
278
270
  height,
279
271
  bitRate
@@ -281,7 +273,7 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
281
273
  let gstreamerPipeline;
282
274
 
283
275
  try {
284
- gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, {
276
+ gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {
285
277
  width,
286
278
  height,
287
279
  quality,
@@ -303,18 +295,16 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
303
295
  try {
304
296
  await new _bluebird.default((resolve, reject) => {
305
297
  mjpegSocket = _net.default.createConnection(tcpPort, TCP_HOST, () => {
306
- _logger.default.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);
307
-
298
+ this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);
308
299
  mjpegServer = _http.default.createServer((req, res) => {
309
300
  const remoteAddress = extractRemoteAddress(req);
310
301
 
311
302
  const currentPathname = _url.default.parse(req.url).pathname;
312
303
 
313
- _logger.default.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` + `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);
304
+ this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` + `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);
314
305
 
315
306
  if (pathname && currentPathname !== pathname) {
316
- _logger.default.info('Rejecting the broadcast request since it does not match the given pathname');
317
-
307
+ this.log.info('Rejecting the broadcast request since it does not match the given pathname');
318
308
  res.writeHead(404, {
319
309
  Connection: 'close',
320
310
  'Content-Type': 'text/plain; charset=utf-8'
@@ -324,8 +314,7 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
324
314
  return;
325
315
  }
326
316
 
327
- _logger.default.info('Starting MJPEG broadcast');
328
-
317
+ this.log.info('Starting MJPEG broadcast');
329
318
  res.writeHead(200, {
330
319
  'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',
331
320
  Pragma: 'no-cache',
@@ -335,23 +324,20 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
335
324
  mjpegSocket.pipe(res);
336
325
  });
337
326
  mjpegServer.on('error', e => {
338
- _logger.default.warn(e);
339
-
327
+ this.log.warn(e);
340
328
  reject(e);
341
329
  });
342
330
  mjpegServer.on('close', () => {
343
- _logger.default.debug(`MJPEG server at http://${host}:${port} has been closed`);
331
+ this.log.debug(`MJPEG server at http://${host}:${port} has been closed`);
344
332
  });
345
333
  mjpegServer.on('listening', () => {
346
- _logger.default.info(`Successfully started MJPEG server at http://${host}:${port}`);
347
-
334
+ this.log.info(`Successfully started MJPEG server at http://${host}:${port}`);
348
335
  resolve();
349
336
  });
350
337
  mjpegServer.listen(port, host);
351
338
  });
352
339
  mjpegSocket.on('error', e => {
353
- _logger.default.error(e);
354
-
340
+ this.log.error(e);
355
341
  reject(e);
356
342
  });
357
343
  }).timeout(STREAMING_STARTUP_TIMEOUT_MS, `Cannot connect to the streaming server within ${STREAMING_STARTUP_TIMEOUT_MS}ms`);
@@ -386,7 +372,7 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
386
372
  commands.mobileStopScreenStreaming = async function mobileStopScreenStreaming() {
387
373
  if (_lodash.default.isEmpty(this._screenStreamingProps)) {
388
374
  if (!_lodash.default.isUndefined(this._screenStreamingProps)) {
389
- _logger.default.debug(`Screen streaming is not running. There is nothing to stop`);
375
+ this.log.debug(`Screen streaming is not running. There is nothing to stop`);
390
376
  }
391
377
 
392
378
  return;
@@ -414,17 +400,17 @@ commands.mobileStopScreenStreaming = async function mobileStopScreenStreaming()
414
400
  try {
415
401
  await gstreamerPipeline.stop('SIGINT');
416
402
  } catch (e) {
417
- _logger.default.warn(e);
403
+ this.log.warn(e);
418
404
 
419
405
  try {
420
406
  await gstreamerPipeline.stop('SIGKILL');
421
407
  } catch (e1) {
422
- _logger.default.error(e1);
408
+ this.log.error(e1);
423
409
  }
424
410
  }
425
411
  }
426
412
 
427
- _logger.default.info(`Successfully terminated the screen streaming MJPEG server`);
413
+ this.log.info(`Successfully terminated the screen streaming MJPEG server`);
428
414
  } finally {
429
415
  this._screenStreamingProps = null;
430
416
  }
@@ -434,4 +420,4 @@ var _default = commands;
434
420
  exports.default = _default;require('source-map-support').install();
435
421
 
436
422
 
437
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJSRUNPUkRJTkdfSU5URVJWQUxfU0VDIiwiU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIkdTVFJFQU1FUl9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJHU1RfSU5TUEVDVF9CSU5BUlkiLCJSRVFVSVJFRF9HU1RfUExVR0lOUyIsImF2ZGVjX2gyNjQiLCJoMjY0cGFyc2UiLCJqcGVnZW5jIiwidGNwc2VydmVyc2luayIsIm11bHRpcGFydG11eCIsIlNDUkVFTlJFQ09SRF9CSU5BUlkiLCJHU1RfVFVUT1JJQUxfVVJMIiwiREVGQVVMVF9IT1NUIiwiVENQX0hPU1QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX1FVQUxJVFkiLCJERUZBVUxUX0JJVFJBVEUiLCJCT1VOREFSWV9TVFJJTkciLCJBREJfU0NSRUVOX1NUUkVBTUlOR19GRUFUVVJFIiwiY3JlYXRlU3RyZWFtaW5nTG9nZ2VyIiwic3RyZWFtTmFtZSIsInVkaWQiLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJfIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJvbWlzc2lvbiIsInZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyIsImFkYiIsInRyaW0iLCJzaGVsbCIsIkVycm9yIiwiZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyIsImJpbmFyeU5hbWUiLCJwdXNoIiwiZnMiLCJ3aGljaCIsImUiLCJCIiwiYWxsIiwibW9kdWxlQ2hlY2tQcm9taXNlcyIsIm5hbWUiLCJtb2ROYW1lIiwidG9QYWlycyIsInN0ZG91dCIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJsb2ciLCJkZWJ1ZyIsInBhcnNlSW50IiwiY3VyRGV2aWNlSWQiLCJpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyIsImRldmljZUluZm8iLCJvcHRzIiwid2lkdGgiLCJoZWlnaHQiLCJiaXRSYXRlIiwiYWRqdXN0ZWRXaWR0aCIsImFkanVzdGVkSGVpZ2h0IiwiYWRqdXN0ZWRCaXRyYXRlIiwic2NyZWVuUmVjb3JkQ21kIiwiYWRiQXJncyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImRldmljZVN0cmVhbWluZyIsInBhdGgiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJpc1N0YXJ0ZWQiLCJkZXZpY2VTdHJlYW1pbmdMb2dnZXIiLCJlcnJvcnNMaXN0ZW5lciIsImNodW5rIiwic3RkZXJyIiwidG9TdHJpbmciLCJzdGFydHVwTGlzdGVuZXIiLCJpc0VtcHR5IiwiaW5mbyIsInV0aWwiLCJxdW90ZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsInJlbW92ZUxpc3RlbmVyIiwiaW5pdEdzdHJlYW1lclBpcGVsaW5lIiwiZGV2aWNlU3RyZWFtaW5nUHJvYyIsInF1YWxpdHkiLCJ0Y3BQb3J0IiwiY29uc2lkZXJSb3RhdGlvbiIsImxvZ1BpcGVsaW5lRGV0YWlscyIsImdzdHJlYW1lclBpcGVsaW5lIiwiU3ViUHJvY2VzcyIsIk1hdGgiLCJtYXgiLCJmcHMiLCJzdGRpbyIsImdzdHJlYW1lckxvZ2dlciIsImdzdE91dHB1dExpc3RlbmVyIiwiZGlkRmFpbCIsInJlcCIsInN0YXJ0IiwiaWduIiwiZXh0cmFjdFJlbW90ZUFkZHJlc3MiLCJyZXEiLCJoZWFkZXJzIiwic29ja2V0IiwicmVtb3RlQWRkcmVzcyIsImNvbm5lY3Rpb24iLCJtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyIsIm9wdGlvbnMiLCJlbnN1cmVGZWF0dXJlRW5hYmxlZCIsImhvc3QiLCJwb3J0IiwicGF0aG5hbWUiLCJpc1VuZGVmaW5lZCIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsImtpbGwiLCJtanBlZ1NvY2tldCIsIm1qcGVnU2VydmVyIiwicmVzb2x2ZSIsInJlamVjdCIsIm5ldCIsImNyZWF0ZUNvbm5lY3Rpb24iLCJodHRwIiwiY3JlYXRlU2VydmVyIiwicmVzIiwiY3VycmVudFBhdGhuYW1lIiwidXJsIiwicGFyc2UiLCJ3cml0ZUhlYWQiLCJDb25uZWN0aW9uIiwid3JpdGUiLCJlbmQiLCJQcmFnbWEiLCJwaXBlIiwid2FybiIsImxpc3RlbiIsImVycm9yIiwidGltZW91dCIsImlzUnVubmluZyIsInN0b3AiLCJkZXN0cm95IiwibGlzdGVuaW5nIiwiY2xvc2UiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwiZTEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBL0I7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxJQUFyQztBQUNBLE1BQU1DLGdCQUFnQixHQUFJLGlCQUFnQkMsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUEzRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFJLGtCQUFpQkYsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUE5RTtBQUNBLE1BQU1FLG9CQUFvQixHQUFHO0FBQzNCQyxFQUFBQSxVQUFVLEVBQUUsV0FEZTtBQUUzQkMsRUFBQUEsU0FBUyxFQUFFLGlCQUZnQjtBQUczQkMsRUFBQUEsT0FBTyxFQUFFLGtCQUhrQjtBQUkzQkMsRUFBQUEsYUFBYSxFQUFFLGtCQUpZO0FBSzNCQyxFQUFBQSxZQUFZLEVBQUU7QUFMYSxDQUE3QjtBQU9BLE1BQU1DLG1CQUFtQixHQUFHLGNBQTVCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsdUVBQXpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLFdBQXJCO0FBQ0EsTUFBTUMsUUFBUSxHQUFHLFdBQWpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEVBQXhCO0FBQ0EsTUFBTUMsZUFBZSxHQUFH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TTRELGlCQUFpQixDQUFDa0QsSUFBbEIsQ0FBdUIsU0FBdkIsQ0FBTjtBQUNELFNBRkQsQ0FFRSxPQUFPSyxFQUFQLEVBQVc7QUFDWG5HLDBCQUFJMkYsS0FBSixDQUFVUSxFQUFWO0FBQ0Q7QUFDRjtBQUNGOztBQUNEbkcsb0JBQUk4QixJQUFKLENBQVUsMkRBQVY7QUFDRCxHQXJCRCxTQXFCVTtBQUNSLFNBQUt1QyxxQkFBTCxHQUE2QixJQUE3QjtBQUNEO0FBQ0YsQ0F2Q0Q7O2VBMENlOUgsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgc3lzdGVtLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgZXhlYywgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBjaGVja1BvcnRTdGF0dXMgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBSRUNPUkRJTkdfSU5URVJWQUxfU0VDID0gNTtcbmNvbnN0IFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMgPSA1MDAwO1xuY29uc3QgR1NUUkVBTUVSX0JJTkFSWSA9IGBnc3QtbGF1bmNoLTEuMCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbmNvbnN0IEdTVF9JTlNQRUNUX0JJTkFSWSA9IGBnc3QtaW5zcGVjdC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBSRVFVSVJFRF9HU1RfUExVR0lOUyA9IHtcbiAgYXZkZWNfaDI2NDogJ2dzdC1saWJhdicsXG4gIGgyNjRwYXJzZTogJ2dzdC1wbHVnaW5zLWJhZCcsXG4gIGpwZWdlbmM6ICdnc3QtcGx1Z2lucy1nb29kJyxcbiAgdGNwc2VydmVyc2luazogJ2dzdC1wbHVnaW5zLWJhc2UnLFxuICBtdWx0aXBhcnRtdXg6ICdnc3QtcGx1Z2lucy1nb29kJyxcbn07XG5jb25zdCBTQ1JFRU5SRUNPUkRfQklOQVJZID0gJ3NjcmVlbnJlY29yZCc7XG5jb25zdCBHU1RfVFVUT1JJQUxfVVJMID0gJ2h0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kb2N1bWVudGF0aW9uL2luc3RhbGxpbmcvaW5kZXguaHRtbCc7XG5jb25zdCBERUZBVUxUX0hPU1QgPSAnMTI3LjAuMC4xJztcbmNvbnN0IFRDUF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA4MDkzO1xuY29uc3QgREVGQVVMVF9RVUFMSVRZID0gNzA7XG5jb25zdCBERUZBVUxUX0JJVFJBVEUgPSA0MDAwMDAwOyAvLyA0IE1icHNcbmNvbnN0IEJPVU5EQVJZX1NUUklORyA9ICctLTJhZTk3NDY4ODdmMTcwYjhjZjdjMjcxMDQ3Y2UzMTRjJztcblxuY29uc3QgQURCX1NDUkVFTl9TVFJFQU1JTkdfRkVBVFVSRSA9ICdhZGJfc2NyZWVuX3N0cmVhbWluZyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmVhbWluZ0xvZ2dlciAoc3RyZWFtTmFtZSwgdWRpZCkge1xuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihgJHtzdHJlYW1OYW1lfUBgICsgXy50cnVuY2F0ZSh1ZGlkLCB7XG4gICAgbGVuZ3RoOiA4LFxuICAgIG9taXNzaW9uOiAnJyxcbiAgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdHJlYW1pbmdSZXF1aXJlbWVudHMgKGFkYikge1xuICBpZiAoIV8udHJpbShhd2FpdCBhZGIuc2hlbGwoWyd3aGljaCcsIFNDUkVFTlJFQ09SRF9CSU5BUlldKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJlcXVpcmVkICcke1NDUkVFTlJFQ09SRF9CSU5BUll9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RgKTtcbiAgfVxuXG4gIGNvbnN0IGdzdHJlYW1lckNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBiaW5hcnlOYW1lIG9mIFtHU1RSRUFNRVJfQklOQVJZLCBHU1RfSU5TUEVDVF9CSU5BUlldKSB7XG4gICAgZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53aGljaChiaW5hcnlOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJyR7YmluYXJ5TmFtZX0nIGJpbmFyeSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBQQVRIIG9uIHRoZSBob3N0IHN5c3RlbS4gYCArXG4gICAgICAgICAgYFNlZSAke0dTVF9UVVRPUklBTF9VUkx9IGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGluc3RhbGwgaXQuYCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwoZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyk7XG5cbiAgY29uc3QgbW9kdWxlQ2hlY2tQcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBtb2ROYW1lXSBvZiBfLnRvUGFpcnMoUkVRVUlSRURfR1NUX1BMVUdJTlMpKSB7XG4gICAgbW9kdWxlQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR1NUX0lOU1BFQ1RfQklOQVJZLCBbbmFtZV0pO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKHN0ZG91dCwgbW9kTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgcmVxdWlyZWQgR1N0cmVhbWVyIHBsdWdpbiAnJHtuYW1lfScgZnJvbSAnJHttb2ROYW1lfScgbW9kdWxlIGlzIG5vdCBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKG1vZHVsZUNoZWNrUHJvbWlzZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvIChhZGIpIHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLnNoZWxsKFsnZHVtcHN5cycsICdkaXNwbGF5J10pO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBwYXR0ZXJuXSBvZiBbXG4gICAgWyd3aWR0aCcsIC9cXGJkZXZpY2VXaWR0aD0oXFxkKykvXSxcbiAgICBbJ2hlaWdodCcsIC9cXGJkZXZpY2VIZWlnaHQ9KFxcZCspL10sXG4gICAgWydmcHMnLCAvXFxiZnBzPShcXGQrKS9dLFxuICBdKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMob3V0cHV0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBkZXZpY2UgJHtrZXl9IGZyb20gdGhlIGFkYiBjb21tYW5kIG91dHB1dC4gYCArXG4gICAgICAgIGBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzLmApO1xuICAgIH1cbiAgICByZXN1bHRba2V5XSA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gIH1cbiAgcmVzdWx0LnVkaWQgPSBhZGIuY3VyRGV2aWNlSWQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXREZXZpY2VTdHJlYW1pbmdQcm9jIChhZGIsIGRldmljZUluZm8sIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gIH0gPSBvcHRzO1xuICBjb25zdCBhZGp1c3RlZFdpZHRoID0gcGFyc2VJbnQod2lkdGgsIDEwKSB8fCBkZXZpY2VJbmZvLndpZHRoO1xuICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IHBhcnNlSW50KGhlaWdodCwgMTApIHx8IGRldmljZUluZm8uaGVpZ2h0O1xuICBjb25zdCBhZGp1c3RlZEJpdHJhdGUgPSBwYXJzZUludChiaXRSYXRlLCAxMCkgfHwgREVGQVVMVF9CSVRSQVRFO1xuICBsZXQgc2NyZWVuUmVjb3JkQ21kID0gU0NSRUVOUkVDT1JEX0JJTkFSWSArXG4gICAgYCAtLW91dHB1dC1mb3JtYXQ9aDI2NGAgK1xuICAgIC8vIDUgc2Vjb25kcyBpcyBmaW5lIHRvIGRldGVjdCByb3RhdGlvbiBjaGFuZ2VzXG4gICAgYCAtLXRpbWUtbGltaXQ9JHtSRUNPUkRJTkdfSU5URVJWQUxfU0VDfWA7XG4gIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLXNpemU9JHthZGp1c3RlZFdpZHRofXgke2FkanVzdGVkSGVpZ2h0fWA7XG4gIH1cbiAgaWYgKGJpdFJhdGUpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLWJpdC1yYXRlPSR7YWRqdXN0ZWRCaXRyYXRlfWA7XG4gIH1cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnZXhlYy1vdXQnLFxuICAgIC8vIFRoZSBsb29wIGlzIHJlcXVpcmVkLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIG1heGltdW0gcmVjb3JkIGR1cmF0aW9uXG4gICAgLy8gZm9yIHNjcmVlbnJlY29yZCBpcyBhbHdheXMgbGltaXRlZFxuICAgIGB3aGlsZSB0cnVlOyBkbyAke3NjcmVlblJlY29yZENtZH0gLTsgZG9uZWAsXG4gIF07XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZyA9IHNwYXduKGFkYi5leGVjdXRhYmxlLnBhdGgsIGFkYkFyZ3MpO1xuICBkZXZpY2VTdHJlYW1pbmcub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgbG9nLmRlYnVnKGBEZXZpY2Ugc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuXG4gIGxldCBpc1N0YXJ0ZWQgPSBmYWxzZTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nTG9nZ2VyID0gY3JlYXRlU3RyZWFtaW5nTG9nZ2VyKFNDUkVFTlJFQ09SRF9CSU5BUlksIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGVycm9yc0xpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgY29uc3Qgc3RkZXJyID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICBpZiAoXy50cmltKHN0ZGVycikpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ0xvZ2dlci5kZWJ1ZyhzdGRlcnIpO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5vbignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcblxuICBjb25zdCBzdGFydHVwTGlzdGVuZXIgPSAoY2h1bmspID0+IHtcbiAgICBpZiAoIWlzU3RhcnRlZCkge1xuICAgICAgaXNTdGFydGVkID0gIV8uaXNFbXB0eShjaHVuayk7XG4gICAgfVxuICB9O1xuICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0Lm9uKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyBkZXZpY2Ugc3RyZWFtaW5nOiAke3V0aWwucXVvdGUoW2FkYi5leGVjdXRhYmxlLnBhdGgsIC4uLmFkYkFyZ3NdKX1gKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IGlzU3RhcnRlZCwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHByb2Nlc3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3RkZXJyLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgZXJyb3JzTGlzdGVuZXIpO1xuICAgIGRldmljZVN0cmVhbWluZy5zdGRvdXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBzdGFydHVwTGlzdGVuZXIpO1xuICB9XG4gIHJldHVybiBkZXZpY2VTdHJlYW1pbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXRHc3RyZWFtZXJQaXBlbGluZSAoZGV2aWNlU3RyZWFtaW5nUHJvYywgZGV2aWNlSW5mbywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcXVhbGl0eSxcbiAgICB0Y3BQb3J0LFxuICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgZ3N0cmVhbWVyUGlwZWxpbmUgPSBuZXcgU3ViUHJvY2VzcyhHU1RSRUFNRVJfQklOQVJZLCBbXG4gICAgJy12JyxcbiAgICAnZmRzcmMnLCAnZmQ9MCcsXG4gICAgJyEnLCAndmlkZW8veC1oMjY0LCcgK1xuICAgICAgYHdpZHRoPSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkV2lkdGh9LGAgK1xuICAgICAgYGhlaWdodD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZEhlaWdodH0sYCArXG4gICAgICBgZnJhbWVyYXRlPSR7ZGV2aWNlSW5mby5mcHN9LzEsYCArXG4gICAgICAnYnl0ZS1zdHJlYW09dHJ1ZScsXG4gICAgJyEnLCAnaDI2NHBhcnNlJyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdhdmRlY19oMjY0JyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdqcGVnZW5jJywgYHF1YWxpdHk9JHtxdWFsaXR5fWAsXG4gICAgJyEnLCAnbXVsdGlwYXJ0bXV4JywgYGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWAsXG4gICAgJyEnLCAndGNwc2VydmVyc2luaycsIGBob3N0PSR7VENQX0hPU1R9YCwgYHBvcnQ9JHt0Y3BQb3J0fWAsXG4gIF0sIHtcbiAgICBzdGRpbzogW2RldmljZVN0cmVhbWluZ1Byb2Muc3Rkb3V0LCAncGlwZScsICdwaXBlJ11cbiAgfSk7XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgUGlwZWxpbmUgc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuICBjb25zdCBnc3RyZWFtZXJMb2dnZXIgPSBjcmVhdGVTdHJlYW1pbmdMb2dnZXIoJ2dzdCcsIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGdzdE91dHB1dExpc3RlbmVyID0gKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgaWYgKF8udHJpbShzdGRlcnIgfHwgc3Rkb3V0KSkge1xuICAgICAgZ3N0cmVhbWVyTG9nZ2VyLmRlYnVnKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgbGV0IGRpZEZhaWwgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgR1N0cmVhbWVyIHBpcGVsaW5lOiAke2dzdHJlYW1lclBpcGVsaW5lLnJlcH1gKTtcbiAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdGFydCgwKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJztcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGlkRmFpbCA9IHRydWU7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHBpcGVsaW5lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFsb2dQaXBlbGluZURldGFpbHMgfHwgZGlkRmFpbCkge1xuICAgICAgZ3N0cmVhbWVyUGlwZWxpbmUucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdzdHJlYW1lclBpcGVsaW5lO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UmVtb3RlQWRkcmVzcyAocmVxKSB7XG4gIHJldHVybiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ11cbiAgICB8fCByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24uc29ja2V0LnJlbW90ZUFkZHJlc3M7XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIHdpZHRoIG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIHNjYWxlZCBoZWlnaHQgb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiBoZWlnaHQgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIGJpdHMgcGVyIHNlY29uZC5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQwMDAwMDAgKDQgTWIvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaG9zdCBbMTI3LjAuMC4xXSAtIFRoZSBJUCBhZGRyZXNzL2hvc3QgbmFtZSB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogWW91IGNhbiBzZXQgaXQgdG8gYDAuMC4wLjBgIHRvIHRyaWdnZXIgdGhlIGJyb2FkY2FzdCBvbiBhbGwgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgSFRUUCByZXF1ZXN0IHBhdGggdGhlIE1KUEVHIHNlcnZlciBzaG91bGQgYmUgYXZhaWxhYmxlIG9uLlxuICogSWYgdW5zZXQgdGhlbiBhbnkgcGF0aG5hbWUgb24gdGhlIGdpdmVuIGBob3N0YC9gcG9ydGAgY29tYmluYXRpb24gd2lsbCB3b3JrLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gKiBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggYSBzaW5nbGUgc2xhc2g6IGAvYFxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0Y3BQb3J0IFs4MDk0XSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgaW50ZXJuYWwgVENQIE1KUEVHIGJyb2FkY2FzdCBvbi5cbiAqIFRoaXMgdHlwZSBvZiBicm9hZGNhc3QgYWx3YXlzIHN0YXJ0cyBvbiB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChgMTI3LjAuMC4xYCkuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHBvcnQgWzgwOTNdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHF1YWxpdHkgWzcwXSAtIFRoZSBxdWFsaXR5IHZhbHVlIGZvciB0aGUgc3RyZWFtZWQgSlBFRyBpbWFnZXMuXG4gKiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW4gcmFuZ2UgWzEsIDEwMF0sIHdoZXJlIDEwMCBpcyB0aGUgYmVzdCBxdWFsaXR5LlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gY29uc2lkZXJSb3RhdGlvbiBbZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCB0aGVuIEdTdHJlYW1lciBwaXBlbGluZSB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzdWx0aW5nIGltYWdlcyB0byBwcm9wZXJseSBmaXQgaW1hZ2VzIGluIGJvdGggbGFuZHNjYXBlIGFuZFxuICogcG9ydHJhaXQgb3JpZW50YXRpb25zLiBTZXQgaXQgdG8gYHRydWVgIGlmIHRoZSBkZXZpY2Ugcm90YXRpb24gaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBzYW1lIGR1cmluZyB0aGVcbiAqIGJyb2FkY2FzdGluZyBzZXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gbG9nUGlwZWxpbmVEZXRhaWxzIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBHU3RyZWFtZXIgcGlwZWxpbmUgZXZlbnRzIGludG9cbiAqIHRoZSBzdGFuZGFyZCBsb2cgb3V0cHV0LiBNaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyBkZXZpY2Ugc2NyZWVuIGJyb2FkY2FzdCBieSBjcmVhdGluZyBNSlBFRyBzZXJ2ZXIuXG4gKiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBoYXZlIG5vIGVmZmVjdCB1bmxlc3MgdGhlIHByZXZpb3VzIHN0cmVhbWluZ1xuICogc2Vzc2lvbiBpcyBzdG9wcGVkLlxuICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB0aGUgYGFkYl9zY3JlZW5fc3RyZWFtaW5nYCBmZWF0dXJlIGlzXG4gKiBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHN0cmVhbWluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yXG4gKiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBob3N0IHN5c3RlbSBvclxuICogdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgKG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgIHBvcnQgPSBERUZBVUxUX1BPUlQsXG4gICAgcGF0aG5hbWUsXG4gICAgdGNwUG9ydCA9IERFRkFVTFRfUE9SVCArIDEsXG4gICAgcXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWSxcbiAgICBjb25zaWRlclJvdGF0aW9uID0gZmFsc2UsXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGF3YWl0IHZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyh0aGlzLmFkYik7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBzY3JlZW4gc3RyZWFtaW5nIHNlc3Npb24gaXMgYWxyZWFkeSBydW5uaW5nLiBgICtcbiAgICAgIGBTdG9wIGl0IGZpcnN0IGluIG9yZGVyIHRvIHN0YXJ0IGEgbmV3IG9uZS5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXMocG9ydCwgaG9zdCkpID09PSAnb3BlbicpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHBvcnQgIyR7cG9ydH0gYXQgJHtob3N0fSBpcyBidXN5LiBgICtcbiAgICAgIGBBc3N1bWluZyB0aGUgc2NyZWVuIHN0cmVhbWluZyBpcyBhbHJlYWR5IHJ1bm5pbmdgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXModGNwUG9ydCwgVENQX0hPU1QpKSA9PT0gJ29wZW4nKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBwb3J0ICMke3RjcFBvcnR9IGF0ICR7VENQX0hPU1R9IGlzIGJ1c3kuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbGVmdG92ZXJzIGZyb20gcHJldmlvdXMgc2Vzc2lvbnMuYCk7XG4gIH1cbiAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuXG4gIGNvbnN0IGRldmljZUluZm8gPSBhd2FpdCBnZXREZXZpY2VJbmZvKHRoaXMuYWRiKTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nUHJvYyA9IGF3YWl0IGluaXREZXZpY2VTdHJlYW1pbmdQcm9jKHRoaXMuYWRiLCBkZXZpY2VJbmZvLCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gIH0pO1xuICBsZXQgZ3N0cmVhbWVyUGlwZWxpbmU7XG4gIHRyeSB7XG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUgPSBhd2FpdCBpbml0R3N0cmVhbWVyUGlwZWxpbmUoZGV2aWNlU3RyZWFtaW5nUHJvYywgZGV2aWNlSW5mbywge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBxdWFsaXR5LFxuICAgICAgdGNwUG9ydCxcbiAgICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxldCBtanBlZ1NvY2tldDtcbiAgbGV0IG1qcGVnU2VydmVyO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1qcGVnU29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24odGNwUG9ydCwgVENQX0hPU1QsICgpID0+IHtcbiAgICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gTUpQRUcgc3RyZWFtIGF0IHRjcDovLyR7VENQX0hPU1R9OiR7dGNwUG9ydH1gKTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdGVBZGRyZXNzID0gZXh0cmFjdFJlbW90ZUFkZHJlc3MocmVxKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aG5hbWUgPSB1cmwucGFyc2UocmVxLnVybCkucGF0aG5hbWU7XG4gICAgICAgICAgbG9nLmluZm8oYEdvdCBhbiBpbmNvbWluZyBzY3JlZW4gYnJhZGNhc3RpbmcgcmVxdWVzdCBmcm9tICR7cmVtb3RlQWRkcmVzc30gYCArXG4gICAgICAgICAgICBgKCR7cmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSB8fCAnVXNlciBBZ2VudCB1bmtub3duJ30pIGF0ICR7Y3VycmVudFBhdGhuYW1lfWApO1xuXG4gICAgICAgICAgaWYgKHBhdGhuYW1lICYmIGN1cnJlbnRQYXRobmFtZSAhPT0gcGF0aG5hbWUpIHtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdSZWplY3RpbmcgdGhlIGJyb2FkY2FzdCByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBwYXRobmFtZScpO1xuICAgICAgICAgICAgcmVzLndyaXRlSGVhZCg0MDQsIHtcbiAgICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLndyaXRlKGAnJHtjdXJyZW50UGF0aG5hbWV9JyBkaWQgbm90IG1hdGNoIGFueSBrbm93biBlbmRwb2ludHNgKTtcbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2cuaW5mbygnU3RhcnRpbmcgTUpQRUcgYnJvYWRjYXN0Jyk7XG4gICAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICAgICdDYWNoZS1Db250cm9sJzogJ25vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAnLFxuICAgICAgICAgICAgUHJhZ21hOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiBgbXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZTsgYm91bmRhcnk9JHtCT1VOREFSWV9TVFJJTkd9YFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWpwZWdTb2NrZXQucGlwZShyZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICBsb2cud2FybihlKTtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fSBoYXMgYmVlbiBjbG9zZWRgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzdGFydGVkIE1KUEVHIHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICAgICAgfSk7XG4gICAgICBtanBlZ1NvY2tldC5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pO1xuICAgIH0pLnRpbWVvdXQoU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGBDYW5ub3QgY29ubmVjdCB0byB0aGUgc3RyZWFtaW5nIHNlcnZlciB3aXRoaW4gJHtTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgpO1xuICAgIH1cbiAgICBpZiAobWpwZWdTb2NrZXQpIHtcbiAgICAgIG1qcGVnU29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU2VydmVyICYmIG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0ge1xuICAgIGRldmljZVN0cmVhbWluZ1Byb2MsXG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUsXG4gICAgbWpwZWdTb2NrZXQsXG4gICAgbWpwZWdTZXJ2ZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIFN0b3Agc2NyZWVuIHN0cmVhbWluZy5cbiAqIElmIG5vIHNjcmVlbiBzdHJlYW1pbmcgc2VydmVyIGhhcyBiZWVuIHN0YXJ0ZWQgdGhlbiBub3RoaW5nIGlzIGRvbmUuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nICgvKiBvcHRpb25zID0ge30gKi8pIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgICBsb2cuZGVidWcoYFNjcmVlbiBzdHJlYW1pbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcGApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgZGV2aWNlU3RyZWFtaW5nUHJvYyxcbiAgICBnc3RyZWFtZXJQaXBlbGluZSxcbiAgICBtanBlZ1NvY2tldCxcbiAgICBtanBlZ1NlcnZlcixcbiAgfSA9IHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzO1xuXG4gIHRyeSB7XG4gICAgbWpwZWdTb2NrZXQuZW5kKCk7XG4gICAgaWYgKG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCdTSUdJTlQnKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHSU5UJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoJ1NJR0tJTEwnKTtcbiAgICAgICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoZTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgdGVybWluYXRlZCB0aGUgc2NyZWVuIHN0cmVhbWluZyBNSlBFRyBzZXJ2ZXJgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
423
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJSRUNPUkRJTkdfSU5URVJWQUxfU0VDIiwiU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIkdTVFJFQU1FUl9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJHU1RfSU5TUEVDVF9CSU5BUlkiLCJSRVFVSVJFRF9HU1RfUExVR0lOUyIsImF2ZGVjX2gyNjQiLCJoMjY0cGFyc2UiLCJqcGVnZW5jIiwidGNwc2VydmVyc2luayIsIm11bHRpcGFydG11eCIsIlNDUkVFTlJFQ09SRF9CSU5BUlkiLCJHU1RfVFVUT1JJQUxfVVJMIiwiREVGQVVMVF9IT1NUIiwiVENQX0hPU1QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX1FVQUxJVFkiLCJERUZBVUxUX0JJVFJBVEUiLCJCT1VOREFSWV9TVFJJTkciLCJBREJfU0NSRUVOX1NUUkVBTUlOR19GRUFUVVJFIiwiY3JlYXRlU3RyZWFtaW5nTG9nZ2VyIiwic3RyZWFtTmFtZSIsInVkaWQiLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJfIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJvbWlzc2lvbiIsInZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyIsImFkYiIsInRyaW0iLCJzaGVsbCIsIkVycm9yIiwiZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyIsImJpbmFyeU5hbWUiLCJwdXNoIiwiZnMiLCJ3aGljaCIsImUiLCJCIiwiYWxsIiwibW9kdWxlQ2hlY2tQcm9taXNlcyIsIm5hbWUiLCJtb2ROYW1lIiwidG9QYWlycyIsInN0ZG91dCIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsImxvZyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsInBhcnNlSW50IiwiY3VyRGV2aWNlSWQiLCJpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyIsImRldmljZUluZm8iLCJvcHRzIiwid2lkdGgiLCJoZWlnaHQiLCJiaXRSYXRlIiwiYWRqdXN0ZWRXaWR0aCIsImFkanVzdGVkSGVpZ2h0IiwiYWRqdXN0ZWRCaXRyYXRlIiwic2NyZWVuUmVjb3JkQ21kIiwiYWRiQXJncyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImRldmljZVN0cmVhbWluZyIsInBhdGgiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJpc1N0YXJ0ZWQiLCJkZXZpY2VTdHJlYW1pbmdMb2dnZXIiLCJlcnJvcnNMaXN0ZW5lciIsImNodW5rIiwic3RkZXJyIiwidG9TdHJpbmciLCJzdGFydHVwTGlzdGVuZXIiLCJpc0VtcHR5IiwiaW5mbyIsInV0aWwiLCJxdW90ZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsInJlbW92ZUxpc3RlbmVyIiwiaW5pdEdzdHJlYW1lclBpcGVsaW5lIiwiZGV2aWNlU3RyZWFtaW5nUHJvYyIsInF1YWxpdHkiLCJ0Y3BQb3J0IiwiY29uc2lkZXJSb3RhdGlvbiIsImxvZ1BpcGVsaW5lRGV0YWlscyIsImdzdHJlYW1lclBpcGVsaW5lIiwiU3ViUHJvY2VzcyIsIk1hdGgiLCJtYXgiLCJmcHMiLCJzdGRpbyIsImdzdHJlYW1lckxvZ2dlciIsImdzdE91dHB1dExpc3RlbmVyIiwiZGlkRmFpbCIsInJlcCIsInN0YXJ0IiwiaWduIiwiZXh0cmFjdFJlbW90ZUFkZHJlc3MiLCJyZXEiLCJoZWFkZXJzIiwic29ja2V0IiwicmVtb3RlQWRkcmVzcyIsImNvbm5lY3Rpb24iLCJtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyIsIm9wdGlvbnMiLCJlbnN1cmVGZWF0dXJlRW5hYmxlZCIsImhvc3QiLCJwb3J0IiwicGF0aG5hbWUiLCJpc1VuZGVmaW5lZCIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsImtpbGwiLCJtanBlZ1NvY2tldCIsIm1qcGVnU2VydmVyIiwicmVzb2x2ZSIsInJlamVjdCIsIm5ldCIsImNyZWF0ZUNvbm5lY3Rpb24iLCJodHRwIiwiY3JlYXRlU2VydmVyIiwicmVzIiwiY3VycmVudFBhdGhuYW1lIiwidXJsIiwicGFyc2UiLCJ3cml0ZUhlYWQiLCJDb25uZWN0aW9uIiwid3JpdGUiLCJlbmQiLCJQcmFnbWEiLCJwaXBlIiwid2FybiIsImxpc3RlbiIsImVycm9yIiwidGltZW91dCIsImlzUnVubmluZyIsInN0b3AiLCJkZXN0cm95IiwibGlzdGVuaW5nIiwiY2xvc2UiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwiZTEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBL0I7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxJQUFyQztBQUNBLE1BQU1DLGdCQUFnQixHQUFJLGlCQUFnQkMsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUEzRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFJLGtCQUFpQkYsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUE5RTtBQUNBLE1BQU1FLG9CQUFvQixHQUFHO0FBQzNCQyxFQUFBQSxVQUFVLEVBQUUsV0FEZTtBQUUzQkMsRUFBQUEsU0FBUyxFQUFFLGlCQUZnQjtBQUczQkMsRUFBQUEsT0FBTyxFQUFFLGtCQUhrQjtBQUkzQkMsRUFBQUEsYUFBYSxFQUFFLGtCQUpZO0FBSzNCQyxFQUFBQSxZQUFZLEVBQUU7QUFMYSxDQUE3QjtBQU9BLE1BQU1DLG1CQUFtQixHQUFHLGNBQTVCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsdUVBQXpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLFdBQXJCO0FBQ0EsTUFBTUMsUUFBUSxHQUFHLFdBQWpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEVBQXhCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLE9BQXhC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QVo7QUFDRDs7QUFDRCxRQUFJMUQsbUJBQW1CLENBQUMrQixJQUFwQixDQUF5QixDQUF6QixDQUFKLEVBQWlDO0FBQy9CL0IsTUFBQUEsbUJBQW1CLENBQUMrQixJQUFwQixDQUF5QixRQUF6QjtBQUNEOztBQUNELFFBQUkxQixpQkFBaUIsQ0FBQ2lELFNBQXRCLEVBQWlDO0FBQy9CLFVBQUk7QUFDRixjQUFNakQsaUJBQWlCLENBQUNrRCxJQUFsQixDQUF1QixRQUF2QixDQUFOO0FBQ0QsT0FGRCxDQUVFLE9BQU85RyxDQUFQLEVBQVU7QUFDVixhQUFLVSxHQUFMLENBQVMrRixJQUFULENBQWN6RyxDQUFkOztBQUNBLFlBQUk7QUFDRixnQkFBTTRELGlCQUFpQixDQUFDa0QsSUFBbEIsQ0FBdUIsU0FBdkIsQ0FBTjtBQUNELFNBRkQsQ0FFRSxPQUFPSyxFQUFQLEVBQVc7QUFDWCxlQUFLekcsR0FBTCxDQUFTaUcsS0FBVCxDQUFlUSxFQUFmO0FBQ0Q7QUFDRjtBQUNGOztBQUNELFNBQUt6RyxHQUFMLENBQVNvQyxJQUFULENBQWUsMkRBQWY7QUFDRCxHQXJCRCxTQXFCVTtBQUNSLFNBQUt1QyxxQkFBTCxHQUE2QixJQUE3QjtBQUNEO0FBQ0YsQ0F2Q0Q7O2VBMENlOUgsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgc3lzdGVtLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYywgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBjaGVja1BvcnRTdGF0dXMgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBSRUNPUkRJTkdfSU5URVJWQUxfU0VDID0gNTtcbmNvbnN0IFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMgPSA1MDAwO1xuY29uc3QgR1NUUkVBTUVSX0JJTkFSWSA9IGBnc3QtbGF1bmNoLTEuMCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbmNvbnN0IEdTVF9JTlNQRUNUX0JJTkFSWSA9IGBnc3QtaW5zcGVjdC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBSRVFVSVJFRF9HU1RfUExVR0lOUyA9IHtcbiAgYXZkZWNfaDI2NDogJ2dzdC1saWJhdicsXG4gIGgyNjRwYXJzZTogJ2dzdC1wbHVnaW5zLWJhZCcsXG4gIGpwZWdlbmM6ICdnc3QtcGx1Z2lucy1nb29kJyxcbiAgdGNwc2VydmVyc2luazogJ2dzdC1wbHVnaW5zLWJhc2UnLFxuICBtdWx0aXBhcnRtdXg6ICdnc3QtcGx1Z2lucy1nb29kJyxcbn07XG5jb25zdCBTQ1JFRU5SRUNPUkRfQklOQVJZID0gJ3NjcmVlbnJlY29yZCc7XG5jb25zdCBHU1RfVFVUT1JJQUxfVVJMID0gJ2h0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kb2N1bWVudGF0aW9uL2luc3RhbGxpbmcvaW5kZXguaHRtbCc7XG5jb25zdCBERUZBVUxUX0hPU1QgPSAnMTI3LjAuMC4xJztcbmNvbnN0IFRDUF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA4MDkzO1xuY29uc3QgREVGQVVMVF9RVUFMSVRZID0gNzA7XG5jb25zdCBERUZBVUxUX0JJVFJBVEUgPSA0MDAwMDAwOyAvLyA0IE1icHNcbmNvbnN0IEJPVU5EQVJZX1NUUklORyA9ICctLTJhZTk3NDY4ODdmMTcwYjhjZjdjMjcxMDQ3Y2UzMTRjJztcblxuY29uc3QgQURCX1NDUkVFTl9TVFJFQU1JTkdfRkVBVFVSRSA9ICdhZGJfc2NyZWVuX3N0cmVhbWluZyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmVhbWluZ0xvZ2dlciAoc3RyZWFtTmFtZSwgdWRpZCkge1xuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihgJHtzdHJlYW1OYW1lfUBgICsgXy50cnVuY2F0ZSh1ZGlkLCB7XG4gICAgbGVuZ3RoOiA4LFxuICAgIG9taXNzaW9uOiAnJyxcbiAgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdHJlYW1pbmdSZXF1aXJlbWVudHMgKGFkYikge1xuICBpZiAoIV8udHJpbShhd2FpdCBhZGIuc2hlbGwoWyd3aGljaCcsIFNDUkVFTlJFQ09SRF9CSU5BUlldKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJlcXVpcmVkICcke1NDUkVFTlJFQ09SRF9CSU5BUll9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RgKTtcbiAgfVxuXG4gIGNvbnN0IGdzdHJlYW1lckNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBiaW5hcnlOYW1lIG9mIFtHU1RSRUFNRVJfQklOQVJZLCBHU1RfSU5TUEVDVF9CSU5BUlldKSB7XG4gICAgZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53aGljaChiaW5hcnlOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJyR7YmluYXJ5TmFtZX0nIGJpbmFyeSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBQQVRIIG9uIHRoZSBob3N0IHN5c3RlbS4gYCArXG4gICAgICAgICAgYFNlZSAke0dTVF9UVVRPUklBTF9VUkx9IGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGluc3RhbGwgaXQuYCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwoZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyk7XG5cbiAgY29uc3QgbW9kdWxlQ2hlY2tQcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBtb2ROYW1lXSBvZiBfLnRvUGFpcnMoUkVRVUlSRURfR1NUX1BMVUdJTlMpKSB7XG4gICAgbW9kdWxlQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR1NUX0lOU1BFQ1RfQklOQVJZLCBbbmFtZV0pO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKHN0ZG91dCwgbW9kTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgcmVxdWlyZWQgR1N0cmVhbWVyIHBsdWdpbiAnJHtuYW1lfScgZnJvbSAnJHttb2ROYW1lfScgbW9kdWxlIGlzIG5vdCBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKG1vZHVsZUNoZWNrUHJvbWlzZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvIChhZGIsIGxvZyA9IG51bGwpIHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLnNoZWxsKFsnZHVtcHN5cycsICdkaXNwbGF5J10pO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBwYXR0ZXJuXSBvZiBbXG4gICAgWyd3aWR0aCcsIC9cXGJkZXZpY2VXaWR0aD0oXFxkKykvXSxcbiAgICBbJ2hlaWdodCcsIC9cXGJkZXZpY2VIZWlnaHQ9KFxcZCspL10sXG4gICAgWydmcHMnLCAvXFxiZnBzPShcXGQrKS9dLFxuICBdKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMob3V0cHV0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2c/LmRlYnVnKG91dHB1dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgZGV2aWNlICR7a2V5fSBmcm9tIHRoZSBhZGIgY29tbWFuZCBvdXRwdXQuIGAgK1xuICAgICAgICBgQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscy5gKTtcbiAgICB9XG4gICAgcmVzdWx0W2tleV0gPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICB9XG4gIHJlc3VsdC51ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyAoYWRiLCBsb2csIGRldmljZUluZm8sIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gIH0gPSBvcHRzO1xuICBjb25zdCBhZGp1c3RlZFdpZHRoID0gcGFyc2VJbnQod2lkdGgsIDEwKSB8fCBkZXZpY2VJbmZvLndpZHRoO1xuICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IHBhcnNlSW50KGhlaWdodCwgMTApIHx8IGRldmljZUluZm8uaGVpZ2h0O1xuICBjb25zdCBhZGp1c3RlZEJpdHJhdGUgPSBwYXJzZUludChiaXRSYXRlLCAxMCkgfHwgREVGQVVMVF9CSVRSQVRFO1xuICBsZXQgc2NyZWVuUmVjb3JkQ21kID0gU0NSRUVOUkVDT1JEX0JJTkFSWSArXG4gICAgYCAtLW91dHB1dC1mb3JtYXQ9aDI2NGAgK1xuICAgIC8vIDUgc2Vjb25kcyBpcyBmaW5lIHRvIGRldGVjdCByb3RhdGlvbiBjaGFuZ2VzXG4gICAgYCAtLXRpbWUtbGltaXQ9JHtSRUNPUkRJTkdfSU5URVJWQUxfU0VDfWA7XG4gIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLXNpemU9JHthZGp1c3RlZFdpZHRofXgke2FkanVzdGVkSGVpZ2h0fWA7XG4gIH1cbiAgaWYgKGJpdFJhdGUpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLWJpdC1yYXRlPSR7YWRqdXN0ZWRCaXRyYXRlfWA7XG4gIH1cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnZXhlYy1vdXQnLFxuICAgIC8vIFRoZSBsb29wIGlzIHJlcXVpcmVkLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIG1heGltdW0gcmVjb3JkIGR1cmF0aW9uXG4gICAgLy8gZm9yIHNjcmVlbnJlY29yZCBpcyBhbHdheXMgbGltaXRlZFxuICAgIGB3aGlsZSB0cnVlOyBkbyAke3NjcmVlblJlY29yZENtZH0gLTsgZG9uZWAsXG4gIF07XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZyA9IHNwYXduKGFkYi5leGVjdXRhYmxlLnBhdGgsIGFkYkFyZ3MpO1xuICBkZXZpY2VTdHJlYW1pbmcub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgbG9nLmRlYnVnKGBEZXZpY2Ugc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuXG4gIGxldCBpc1N0YXJ0ZWQgPSBmYWxzZTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nTG9nZ2VyID0gY3JlYXRlU3RyZWFtaW5nTG9nZ2VyKFNDUkVFTlJFQ09SRF9CSU5BUlksIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGVycm9yc0xpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgY29uc3Qgc3RkZXJyID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICBpZiAoXy50cmltKHN0ZGVycikpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ0xvZ2dlci5kZWJ1ZyhzdGRlcnIpO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5vbignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcblxuICBjb25zdCBzdGFydHVwTGlzdGVuZXIgPSAoY2h1bmspID0+IHtcbiAgICBpZiAoIWlzU3RhcnRlZCkge1xuICAgICAgaXNTdGFydGVkID0gIV8uaXNFbXB0eShjaHVuayk7XG4gICAgfVxuICB9O1xuICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0Lm9uKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyBkZXZpY2Ugc3RyZWFtaW5nOiAke3V0aWwucXVvdGUoW2FkYi5leGVjdXRhYmxlLnBhdGgsIC4uLmFkYkFyZ3NdKX1gKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IGlzU3RhcnRlZCwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHByb2Nlc3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3RkZXJyLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgZXJyb3JzTGlzdGVuZXIpO1xuICAgIGRldmljZVN0cmVhbWluZy5zdGRvdXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBzdGFydHVwTGlzdGVuZXIpO1xuICB9XG4gIHJldHVybiBkZXZpY2VTdHJlYW1pbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXRHc3RyZWFtZXJQaXBlbGluZSAoZGV2aWNlU3RyZWFtaW5nUHJvYywgZGV2aWNlSW5mbywgbG9nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBxdWFsaXR5LFxuICAgIHRjcFBvcnQsXG4gICAgY29uc2lkZXJSb3RhdGlvbixcbiAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gIH0gPSBvcHRzO1xuICBjb25zdCBhZGp1c3RlZFdpZHRoID0gcGFyc2VJbnQod2lkdGgsIDEwKSB8fCBkZXZpY2VJbmZvLndpZHRoO1xuICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IHBhcnNlSW50KGhlaWdodCwgMTApIHx8IGRldmljZUluZm8uaGVpZ2h0O1xuICBjb25zdCBnc3RyZWFtZXJQaXBlbGluZSA9IG5ldyBTdWJQcm9jZXNzKEdTVFJFQU1FUl9CSU5BUlksIFtcbiAgICAnLXYnLFxuICAgICdmZHNyYycsICdmZD0wJyxcbiAgICAnIScsICd2aWRlby94LWgyNjQsJyArXG4gICAgICBgd2lkdGg9JHtjb25zaWRlclJvdGF0aW9uID8gTWF0aC5tYXgoYWRqdXN0ZWRXaWR0aCwgYWRqdXN0ZWRIZWlnaHQpIDogYWRqdXN0ZWRXaWR0aH0sYCArXG4gICAgICBgaGVpZ2h0PSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkSGVpZ2h0fSxgICtcbiAgICAgIGBmcmFtZXJhdGU9JHtkZXZpY2VJbmZvLmZwc30vMSxgICtcbiAgICAgICdieXRlLXN0cmVhbT10cnVlJyxcbiAgICAnIScsICdoMjY0cGFyc2UnLFxuICAgICchJywgJ3F1ZXVlJywgJ2xlYWt5PWRvd25zdHJlYW0nLFxuICAgICchJywgJ2F2ZGVjX2gyNjQnLFxuICAgICchJywgJ3F1ZXVlJywgJ2xlYWt5PWRvd25zdHJlYW0nLFxuICAgICchJywgJ2pwZWdlbmMnLCBgcXVhbGl0eT0ke3F1YWxpdHl9YCxcbiAgICAnIScsICdtdWx0aXBhcnRtdXgnLCBgYm91bmRhcnk9JHtCT1VOREFSWV9TVFJJTkd9YCxcbiAgICAnIScsICd0Y3BzZXJ2ZXJzaW5rJywgYGhvc3Q9JHtUQ1BfSE9TVH1gLCBgcG9ydD0ke3RjcFBvcnR9YCxcbiAgXSwge1xuICAgIHN0ZGlvOiBbZGV2aWNlU3RyZWFtaW5nUHJvYy5zdGRvdXQsICdwaXBlJywgJ3BpcGUnXVxuICB9KTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgbG9nLmRlYnVnKGBQaXBlbGluZSBzdHJlYW1pbmcgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gKTtcbiAgfSk7XG4gIGNvbnN0IGdzdHJlYW1lckxvZ2dlciA9IGNyZWF0ZVN0cmVhbWluZ0xvZ2dlcignZ3N0JywgZGV2aWNlSW5mby51ZGlkKTtcbiAgY29uc3QgZ3N0T3V0cHV0TGlzdGVuZXIgPSAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICBpZiAoXy50cmltKHN0ZGVyciB8fCBzdGRvdXQpKSB7XG4gICAgICBnc3RyZWFtZXJMb2dnZXIuZGVidWcoc3RkZXJyIHx8IHN0ZG91dCk7XG4gICAgfVxuICB9O1xuICBnc3RyZWFtZXJQaXBlbGluZS5vbignb3V0cHV0JywgZ3N0T3V0cHV0TGlzdGVuZXIpO1xuICBsZXQgZGlkRmFpbCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyBHU3RyZWFtZXIgcGlwZWxpbmU6ICR7Z3N0cmVhbWVyUGlwZWxpbmUucmVwfWApO1xuICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0YXJ0KDApO1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBjaGVja1BvcnRTdGF0dXModGNwUG9ydCwgVENQX0hPU1QpKSA9PT0gJ29wZW4nO1xuICAgICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB3YWl0TXM6IFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBpbnRlcnZhbE1zOiAzMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkaWRGYWlsID0gdHJ1ZTtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcbiAgICAgIGBDYW5ub3Qgc3RhcnQgdGhlIHNjcmVlbiBzdHJlYW1pbmcgcGlwZWxpbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIWxvZ1BpcGVsaW5lRGV0YWlscyB8fCBkaWRGYWlsKSB7XG4gICAgICBnc3RyZWFtZXJQaXBlbGluZS5yZW1vdmVMaXN0ZW5lcignb3V0cHV0JywgZ3N0T3V0cHV0TGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3N0cmVhbWVyUGlwZWxpbmU7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RSZW1vdGVBZGRyZXNzIChyZXEpIHtcbiAgcmV0dXJuIHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXVxuICAgIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzc1xuICAgIHx8IHJlcS5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5zb2NrZXQucmVtb3RlQWRkcmVzcztcbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXJ0U2NyZWVuU3RyZWFtaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgc2NhbGVkIHdpZHRoIG9mIHRoZSBkZXZpY2UncyBzY3JlZW4uIElmIHVuc2V0IHRoZW4gdGhlIHNjcmlwdCB3aWxsIGFzc2lnbiBpdFxuICogdG8gdGhlIGFjdHVhbCBzY3JlZW4gd2lkdGggbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgc2NhbGVkIGhlaWdodCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIGhlaWdodCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGJpdFJhdGUgLSBUaGUgdmlkZW8gYml0IHJhdGUgZm9yIHRoZSB2aWRlbywgaW4gYml0cyBwZXIgc2Vjb25kLlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgNDAwMDAwMCAoNCBNYi9zKS4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBob3N0IFsxMjcuMC4wLjFdIC0gVGhlIElQIGFkZHJlc3MvaG9zdCBuYW1lIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBZb3UgY2FuIHNldCBpdCB0byBgMC4wLjAuMGAgdG8gdHJpZ2dlciB0aGUgYnJvYWRjYXN0IG9uIGFsbCBhdmFpbGFibGUgbmV0d29yayBpbnRlcmZhY2VzLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYXRobmFtZSAtIFRoZSBIVFRQIHJlcXVlc3QgcGF0aCB0aGUgTUpQRUcgc2VydmVyIHNob3VsZCBiZSBhdmFpbGFibGUgb24uXG4gKiBJZiB1bnNldCB0aGVuIGFueSBwYXRobmFtZSBvbiB0aGUgZ2l2ZW4gYGhvc3RgL2Bwb3J0YCBjb21iaW5hdGlvbiB3aWxsIHdvcmsuIE5vdGUgdGhhdCB0aGUgdmFsdWVcbiAqIHNob3VsZCBhbHdheXMgc3RhcnQgd2l0aCBhIHNpbmdsZSBzbGFzaDogYC9gXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRjcFBvcnQgWzgwOTRdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBpbnRlcm5hbCBUQ1AgTUpQRUcgYnJvYWRjYXN0IG9uLlxuICogVGhpcyB0eXBlIG9mIGJyb2FkY2FzdCBhbHdheXMgc3RhcnRzIG9uIHRoZSBsb29wYmFjayBpbnRlcmZhY2UgKGAxMjcuMC4wLjFgKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gcG9ydCBbODA5M10gLSBUaGUgcG9ydCBudW1iZXIgdG8gc3RhcnQgdGhlIE1KUEVHIHNlcnZlciBvbi5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gcXVhbGl0eSBbNzBdIC0gVGhlIHF1YWxpdHkgdmFsdWUgZm9yIHRoZSBzdHJlYW1lZCBKUEVHIGltYWdlcy5cbiAqIFRoaXMgbnVtYmVyIHNob3VsZCBiZSBpbiByYW5nZSBbMSwgMTAwXSwgd2hlcmUgMTAwIGlzIHRoZSBiZXN0IHF1YWxpdHkuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBjb25zaWRlclJvdGF0aW9uIFtmYWxzZV0gLSBJZiBzZXQgdG8gYHRydWVgIHRoZW4gR1N0cmVhbWVyIHBpcGVsaW5lIHdpbGxcbiAqIGluY3JlYXNlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSByZXN1bHRpbmcgaW1hZ2VzIHRvIHByb3Blcmx5IGZpdCBpbWFnZXMgaW4gYm90aCBsYW5kc2NhcGUgYW5kXG4gKiBwb3J0cmFpdCBvcmllbnRhdGlvbnMuIFNldCBpdCB0byBgdHJ1ZWAgaWYgdGhlIGRldmljZSByb3RhdGlvbiBpcyBub3QgZ29pbmcgdG8gYmUgdGhlIHNhbWUgZHVyaW5nIHRoZVxuICogYnJvYWRjYXN0aW5nIHNlc3Npb24uXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBsb2dQaXBlbGluZURldGFpbHMgW2ZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIEdTdHJlYW1lciBwaXBlbGluZSBldmVudHMgaW50b1xuICogdGhlIHN0YW5kYXJkIGxvZyBvdXRwdXQuIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICovXG5cbi8qKlxuICogU3RhcnRzIGRldmljZSBzY3JlZW4gYnJvYWRjYXN0IGJ5IGNyZWF0aW5nIE1KUEVHIHNlcnZlci5cbiAqIE11bHRpcGxlIGNhbGxzIHRvIHRoaXMgbWV0aG9kIGhhdmUgbm8gZWZmZWN0IHVubGVzcyB0aGUgcHJldmlvdXMgc3RyZWFtaW5nXG4gKiBzZXNzaW9uIGlzIHN0b3BwZWQuXG4gKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHRoZSBgYWRiX3NjcmVlbl9zdHJlYW1pbmdgIGZlYXR1cmUgaXNcbiAqIGVuYWJsZWQgb24gdGhlIHNlcnZlciBzaWRlLlxuICpcbiAqIEBwYXJhbSB7P1N0YXJ0U2NyZWVuU3RyZWFtaW5nT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzY3JlZW4gc3RyZWFtaW5nIGhhcyBmYWlsZWQgdG8gc3RhcnQgb3JcbiAqIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGhvc3Qgc3lzdGVtIG9yXG4gKiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2ZXIgZmVhdHVyZSBpcyBub3QgZW5hYmxlZC5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyAob3B0aW9ucyA9IHt9KSB7XG4gIHRoaXMuZW5zdXJlRmVhdHVyZUVuYWJsZWQoQURCX1NDUkVFTl9TVFJFQU1JTkdfRkVBVFVSRSk7XG5cbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICAgIGhvc3QgPSBERUZBVUxUX0hPU1QsXG4gICAgcG9ydCA9IERFRkFVTFRfUE9SVCxcbiAgICBwYXRobmFtZSxcbiAgICB0Y3BQb3J0ID0gREVGQVVMVF9QT1JUICsgMSxcbiAgICBxdWFsaXR5ID0gREVGQVVMVF9RVUFMSVRZLFxuICAgIGNvbnNpZGVyUm90YXRpb24gPSBmYWxzZSxcbiAgICBsb2dQaXBlbGluZURldGFpbHMgPSBmYWxzZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgYXdhaXQgdmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzKHRoaXMuYWRiKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgc2NyZWVuIHN0cmVhbWluZyBzZXNzaW9uIGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgU3RvcCBpdCBmaXJzdCBpbiBvcmRlciB0byBzdGFydCBhIG5ldyBvbmUuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHBvcnQsIGhvc3QpKSA9PT0gJ29wZW4nKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIHBvcnQgIyR7cG9ydH0gYXQgJHtob3N0fSBpcyBidXN5LiBgICtcbiAgICAgIGBBc3N1bWluZyB0aGUgc2NyZWVuIHN0cmVhbWluZyBpcyBhbHJlYWR5IHJ1bm5pbmdgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXModGNwUG9ydCwgVENQX0hPU1QpKSA9PT0gJ29wZW4nKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIHBvcnQgIyR7dGNwUG9ydH0gYXQgJHtUQ1BfSE9TVH0gaXMgYnVzeS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZXJlIGFyZSBubyBsZWZ0b3ZlcnMgZnJvbSBwcmV2aW91cyBzZXNzaW9ucy5gKTtcbiAgfVxuICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG5cbiAgY29uc3QgZGV2aWNlSW5mbyA9IGF3YWl0IGdldERldmljZUluZm8odGhpcy5hZGIsIHRoaXMubG9nKTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nUHJvYyA9IGF3YWl0IGluaXREZXZpY2VTdHJlYW1pbmdQcm9jKHRoaXMuYWRiLCB0aGlzLmxvZywgZGV2aWNlSW5mbywge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9KTtcbiAgbGV0IGdzdHJlYW1lclBpcGVsaW5lO1xuICB0cnkge1xuICAgIGdzdHJlYW1lclBpcGVsaW5lID0gYXdhaXQgaW5pdEdzdHJlYW1lclBpcGVsaW5lKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIHRoaXMubG9nLCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHF1YWxpdHksXG4gICAgICB0Y3BQb3J0LFxuICAgICAgY29uc2lkZXJSb3RhdGlvbixcbiAgICAgIGxvZ1BpcGVsaW5lRGV0YWlscyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoMCkpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgpO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG5cbiAgbGV0IG1qcGVnU29ja2V0O1xuICBsZXQgbWpwZWdTZXJ2ZXI7XG4gIHRyeSB7XG4gICAgYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbWpwZWdTb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbih0Y3BQb3J0LCBUQ1BfSE9TVCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIE1KUEVHIHN0cmVhbSBhdCB0Y3A6Ly8ke1RDUF9IT1NUfToke3RjcFBvcnR9YCk7XG4gICAgICAgIG1qcGVnU2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IGV4dHJhY3RSZW1vdGVBZGRyZXNzKHJlcSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhdGhuYW1lID0gdXJsLnBhcnNlKHJlcS51cmwpLnBhdGhuYW1lO1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYEdvdCBhbiBpbmNvbWluZyBzY3JlZW4gYnJhZGNhc3RpbmcgcmVxdWVzdCBmcm9tICR7cmVtb3RlQWRkcmVzc30gYCArXG4gICAgICAgICAgICBgKCR7cmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSB8fCAnVXNlciBBZ2VudCB1bmtub3duJ30pIGF0ICR7Y3VycmVudFBhdGhuYW1lfWApO1xuXG4gICAgICAgICAgaWYgKHBhdGhuYW1lICYmIGN1cnJlbnRQYXRobmFtZSAhPT0gcGF0aG5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1JlamVjdGluZyB0aGUgYnJvYWRjYXN0IHJlcXVlc3Qgc2luY2UgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGdpdmVuIHBhdGhuYW1lJyk7XG4gICAgICAgICAgICByZXMud3JpdGVIZWFkKDQwNCwge1xuICAgICAgICAgICAgICBDb25uZWN0aW9uOiAnY2xvc2UnLFxuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXMud3JpdGUoYCcke2N1cnJlbnRQYXRobmFtZX0nIGRpZCBub3QgbWF0Y2ggYW55IGtub3duIGVuZHBvaW50c2ApO1xuICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1N0YXJ0aW5nIE1KUEVHIGJyb2FkY2FzdCcpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XG4gICAgICAgICAgICAnQ2FjaGUtQ29udHJvbCc6ICduby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wJyxcbiAgICAgICAgICAgIFByYWdtYTogJ25vLWNhY2hlJyxcbiAgICAgICAgICAgIENvbm5lY3Rpb246ICdjbG9zZScsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogYG11bHRpcGFydC94LW1peGVkLXJlcGxhY2U7IGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWBcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1qcGVnU29ja2V0LnBpcGUocmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihlKTtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYE1KUEVHIHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9IGhhcyBiZWVuIGNsb3NlZGApO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgc3RhcnRlZCBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fWApO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgICAgIH0pO1xuICAgICAgbWpwZWdTb2NrZXQub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoZSk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pO1xuICAgIH0pLnRpbWVvdXQoU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGBDYW5ub3QgY29ubmVjdCB0byB0aGUgc3RyZWFtaW5nIHNlcnZlciB3aXRoaW4gJHtTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgpO1xuICAgIH1cbiAgICBpZiAobWpwZWdTb2NrZXQpIHtcbiAgICAgIG1qcGVnU29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU2VydmVyICYmIG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0ge1xuICAgIGRldmljZVN0cmVhbWluZ1Byb2MsXG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUsXG4gICAgbWpwZWdTb2NrZXQsXG4gICAgbWpwZWdTZXJ2ZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIFN0b3Agc2NyZWVuIHN0cmVhbWluZy5cbiAqIElmIG5vIHNjcmVlbiBzdHJlYW1pbmcgc2VydmVyIGhhcyBiZWVuIHN0YXJ0ZWQgdGhlbiBub3RoaW5nIGlzIGRvbmUuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nICgvKiBvcHRpb25zID0ge30gKi8pIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2NyZWVuIHN0cmVhbWluZyBpcyBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBzdG9wYCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLFxuICAgIGdzdHJlYW1lclBpcGVsaW5lLFxuICAgIG1qcGVnU29ja2V0LFxuICAgIG1qcGVnU2VydmVyLFxuICB9ID0gdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHM7XG5cbiAgdHJ5IHtcbiAgICBtanBlZ1NvY2tldC5lbmQoKTtcbiAgICBpZiAobWpwZWdTZXJ2ZXIubGlzdGVuaW5nKSB7XG4gICAgICBtanBlZ1NlcnZlci5jbG9zZSgpO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoJ1NJR0lOVCcpO1xuICAgIH1cbiAgICBpZiAoZ3N0cmVhbWVyUGlwZWxpbmUuaXNSdW5uaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdG9wKCdTSUdJTlQnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdG9wKCdTSUdLSUxMJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IoZTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9nLmluZm8oYFN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkIHRoZSBzY3JlZW4gc3RyZWFtaW5nIE1KUEVHIHNlcnZlcmApO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0gbnVsbDtcbiAgfVxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL3N0cmVhbXNjcmVlbi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -13,8 +13,6 @@ require("source-map-support/register");
13
13
 
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
15
 
16
- var _logger = _interopRequireDefault(require("../logger"));
17
-
18
16
  const WINDOW_TITLE_PATTERN = /^\s+Window\s#\d+\sWindow\{[0-9a-f]+\s\w+\s([\w-]+)\}:$/;
19
17
  const FRAME_PATTERN = /^\s+mFrame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/m;
20
18
  const SURFACE_PATTERN = /^\s+Surface:\sshown=(true|false)/m;
@@ -29,15 +27,14 @@ const DEFAULT_WINDOW_PROPERTIES = {
29
27
  };
30
28
  const commands = {};
31
29
 
32
- function parseWindowProperties(name, props) {
30
+ function parseWindowProperties(name, props, log = null) {
33
31
  const result = _lodash.default.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
34
32
 
35
33
  const propLines = props.join('\n');
36
34
  const frameMatch = FRAME_PATTERN.exec(propLines);
37
35
 
38
36
  if (!frameMatch) {
39
- _logger.default.debug(propLines);
40
-
37
+ log === null || log === void 0 ? void 0 : log.debug(propLines);
41
38
  throw new Error(`Cannot parse the frame size from '${name}' window properties`);
42
39
  }
43
40
 
@@ -50,8 +47,7 @@ function parseWindowProperties(name, props) {
50
47
  const visibilityMatch = SURFACE_PATTERN.exec(propLines);
51
48
 
52
49
  if (!visibilityMatch) {
53
- _logger.default.debug(propLines);
54
-
50
+ log === null || log === void 0 ? void 0 : log.debug(propLines);
55
51
  throw new Error(`Cannot parse the visibility value from '${name}' window properties`);
56
52
  }
57
53
 
@@ -59,7 +55,7 @@ function parseWindowProperties(name, props) {
59
55
  return result;
60
56
  }
61
57
 
62
- function parseWindows(lines) {
58
+ function parseWindows(lines, log = null) {
63
59
  const windows = {};
64
60
  let currentWindowName = null;
65
61
  let windowNameRowIndent = null;
@@ -96,8 +92,7 @@ function parseWindows(lines) {
96
92
  }
97
93
 
98
94
  if (_lodash.default.isEmpty(windows)) {
99
- _logger.default.debug(lines.join('\n'));
100
-
95
+ log === null || log === void 0 ? void 0 : log.debug(lines.join('\n'));
101
96
  throw new Error('Cannot parse any window information from the dumpsys output');
102
97
  }
103
98
 
@@ -108,17 +103,16 @@ function parseWindows(lines) {
108
103
 
109
104
  for (const [name, props] of _lodash.default.toPairs(windows)) {
110
105
  if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {
111
- result.statusBar = parseWindowProperties(name, props);
106
+ result.statusBar = parseWindowProperties(name, props, log);
112
107
  } else if (name.startsWith(NAVIGATION_BAR_WINDOW_NAME_PREFIX)) {
113
- result.navigationBar = parseWindowProperties(name, props);
108
+ result.navigationBar = parseWindowProperties(name, props, log);
114
109
  }
115
110
  }
116
111
 
117
112
  const unmatchedWindows = [['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX], ['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]].filter(([name]) => _lodash.default.isNil(result[name]));
118
113
 
119
114
  for (const [window, namePrefix] of unmatchedWindows) {
120
- _logger.default.info(`No windows have been found whose title matches to ` + `'${namePrefix}'. Assuming it is invisible. ` + `Only the following windows are available: ${_lodash.default.keys(windows)}`);
121
-
115
+ log === null || log === void 0 ? void 0 : log.info(`No windows have been found whose title matches to ` + `'${namePrefix}'. Assuming it is invisible. ` + `Only the following windows are available: ${_lodash.default.keys(windows)}`);
122
116
  result[window] = _lodash.default.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
123
117
  }
124
118
 
@@ -134,11 +128,11 @@ commands.getSystemBars = async function getSystemBars() {
134
128
  throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);
135
129
  }
136
130
 
137
- return parseWindows(stdout);
131
+ return parseWindows(stdout, this.log);
138
132
  };
139
133
 
140
134
  var _default = commands;
141
135
  exports.default = _default;require('source-map-support').install();
142
136
 
143
137
 
144
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zeXN0ZW0tYmFycy5qcyJdLCJuYW1lcyI6WyJXSU5ET1dfVElUTEVfUEFUVEVSTiIsIkZSQU1FX1BBVFRFUk4iLCJTVVJGQUNFX1BBVFRFUk4iLCJTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIk5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIkRFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMiLCJ2aXNpYmxlIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImNvbW1hbmRzIiwicGFyc2VXaW5kb3dQcm9wZXJ0aWVzIiwibmFtZSIsInByb3BzIiwicmVzdWx0IiwiXyIsImNsb25lRGVlcCIsInByb3BMaW5lcyIsImpvaW4iLCJmcmFtZU1hdGNoIiwiZXhlYyIsImxvZyIsImRlYnVnIiwiRXJyb3IiLCJwYXJzZUZsb2F0IiwibGVmdCIsInRvcCIsInZpc2liaWxpdHlNYXRjaCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwid2luZG93TmFtZVJvd0luZGVudCIsImxpbmUiLCJzcGxpdCIsIm1hcCIsInRyaW1FbmQiLCJjdXJyZW50SW5kZW50IiwibGVuZ3RoIiwidHJpbVN0YXJ0IiwiaXNOaWwiLCJtYXRjaCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJ3aW5kb3ciLCJuYW1lUHJlZml4IiwiaW5mbyIsImtleXMiLCJnZXRTeXN0ZW1CYXJzIiwic3Rkb3V0IiwiYWRiIiwic2hlbGwiLCJlIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLHdEQUE3QjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxnRUFBdEI7QUFDQSxNQUFNQyxlQUFlLEdB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cm9tICcuLi9sb2dnZXInO1xuXG5jb25zdCBXSU5ET1dfVElUTEVfUEFUVEVSTiA9IC9eXFxzK1dpbmRvd1xccyNcXGQrXFxzV2luZG93XFx7WzAtOWEtZl0rXFxzXFx3K1xccyhbXFx3LV0rKVxcfTokLztcbmNvbnN0IEZSQU1FX1BBVFRFUk4gPSAvXlxccyttRnJhbWU9XFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdXFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdL207XG5jb25zdCBTVVJGQUNFX1BBVFRFUk4gPSAvXlxccytTdXJmYWNlOlxcc3Nob3duPSh0cnVlfGZhbHNlKS9tO1xuY29uc3QgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnU3RhdHVzQmFyJztcbmNvbnN0IE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCA9ICdOYXZpZ2F0aW9uQmFyJztcbmNvbnN0IERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMgPSB7XG4gIHZpc2libGU6IGZhbHNlLFxuICB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxufTtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXaW5kb3dQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpc2libGUgV2hldGhlciB0aGUgd2luZG93IGlzIHZpc2libGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IFdpbmRvdyB4IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IFdpbmRvdyB5IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaW5kb3cgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgV2luZG93IGhlaWdodFxuICovXG5cbi8qKlxuICogUGFyc2VzIHdpbmRvdyBwcm9wZXJ0aWVzIGZyb20gYWRiIGR1bXBzeXMgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBwYXJzZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvcHMgVGhlIGxpc3Qgb2YgcGFydGljdWxhciB3aW5kb3cgcHJvcGVydHkgbGluZXMuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEByZXR1cm5zIHtXaW5kb3dQcm9wZXJ0aWVzfSBQYXJzZWQgcHJvcGVydGllcyBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gaXNzdWUgd2hpbGUgcGFyc2luZyB0aGUgcHJvcGVydGllcyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIChuYW1lLCBwcm9wcykge1xuICBjb25zdCByZXN1bHQgPSBfLmNsb25lRGVlcChERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTKTtcbiAgY29uc3QgcHJvcExpbmVzID0gcHJvcHMuam9pbignXFxuJyk7XG4gIGNvbnN0IGZyYW1lTWF0Y2ggPSBGUkFNRV9QQVRURVJOLmV4ZWMocHJvcExpbmVzKTtcbiAgaWYgKCFmcmFtZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHByb3BMaW5lcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGZyYW1lIHNpemUgZnJvbSAnJHtuYW1lfScgd2luZG93IHByb3BlcnRpZXNgKTtcbiAgfVxuICByZXN1bHQueCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsxXSk7XG4gIHJlc3VsdC55ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzJdKTtcbiAgY29uc3QgbGVmdCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFszXSk7XG4gIGNvbnN0IHRvcCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFs0XSk7XG4gIHJlc3VsdC53aWR0aCA9IGxlZnQgLSByZXN1bHQueDtcbiAgcmVzdWx0LmhlaWdodCA9IHRvcCAtIHJlc3VsdC55O1xuICBjb25zdCB2aXNpYmlsaXR5TWF0Y2ggPSBTVVJGQUNFX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIXZpc2liaWxpdHlNYXRjaCkge1xuICAgIGxvZy5kZWJ1Zyhwcm9wTGluZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSB2aXNpYmlsaXR5IHZhbHVlIGZyb20gJyR7bmFtZX0nIHdpbmRvdyBwcm9wZXJ0aWVzYCk7XG4gIH1cbiAgcmVzdWx0LnZpc2libGUgPSB2aXNpYmlsaXR5TWF0Y2hbMV0gPT09ICd0cnVlJztcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFyIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpbmRvdyBtYW5hZ2VyIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxpbmVzIE91dHB1dCBmcm9tIGR1bXBzeXMgY29tbWFuZC5cbiAqIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHVuaXQgdGVzdHMgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW5wdXQgZm9ybWF0LlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0d28gaXRlbXMgd2hlcmUga2V5cyBhcmUgc3RhdHVzQmFyIGFuZCBuYXZpZ2F0aW9uQmFyLFxuICogYW5kIHZhbHVlcyBhcmUgY29ycmVzcG9uZGluZyBXaW5kb3dQcm9wZXJ0aWVzIG9iamVjdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyB3aW5kb3cgcHJvcGVydGllcyBjb3VsZCBiZSBwYXJzZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dzIChsaW5lcykge1xuICBjb25zdCB3aW5kb3dzID0ge307XG4gIGxldCBjdXJyZW50V2luZG93TmFtZSA9IG51bGw7XG4gIGxldCB3aW5kb3dOYW1lUm93SW5kZW50ID0gbnVsbDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSB8fCBjdXJyZW50SW5kZW50IDw9IHdpbmRvd05hbWVSb3dJbmRlbnQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gV0lORE9XX1RJVExFX1BBVFRFUk4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY3VycmVudFdpbmRvd05hbWUgPSBudWxsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbWF0Y2hbMV07XG4gICAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSkge1xuICAgICAgICB3aW5kb3dOYW1lUm93SW5kZW50ID0gY3VycmVudEluZGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRXaW5kb3dOYW1lIHx8IGN1cnJlbnRJbmRlbnQgPD0gd2luZG93TmFtZVJvd0luZGVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzQXJyYXkod2luZG93c1tjdXJyZW50V2luZG93TmFtZV0pKSB7XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXSA9IFtdO1xuICAgIH1cbiAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXS5wdXNoKGxpbmUpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkod2luZG93cykpIHtcbiAgICBsb2cuZGVidWcobGluZXMuam9pbignXFxuJykpO1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGFueSB3aW5kb3cgaW5mb3JtYXRpb24gZnJvbSB0aGUgZHVtcHN5cyBvdXRwdXQnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtzdGF0dXNCYXI6IG51bGwsIG5hdmlnYXRpb25CYXI6IG51bGx9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wc10gb2YgXy50b1BhaXJzKHdpbmRvd3MpKSB7XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5zdGF0dXNCYXIgPSBwYXJzZVdpbmRvd1Byb3BlcnRpZXMobmFtZSwgcHJvcHMpO1xuICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5uYXZpZ2F0aW9uQmFyID0gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzKG5hbWUsIHByb3BzKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5tYXRjaGVkV2luZG93cyA9IFtcbiAgICBbJ3N0YXR1c0JhcicsIFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYXSxcbiAgICBbJ25hdmlnYXRpb25CYXInLCBOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVhdXG4gIF0uZmlsdGVyKChbbmFtZV0pID0+IF8uaXNOaWwocmVzdWx0W25hbWVdKSk7XG4gIGZvciAoY29uc3QgW3dpbmRvdywgbmFtZVByZWZpeF0gb2YgdW5tYXRjaGVkV2luZG93cykge1xuICAgIGxvZy5pbmZvKGBObyB3aW5kb3dzIGhhdmUgYmVlbiBmb3VuZCB3aG9zZSB0aXRsZSBtYXRjaGVzIHRvIGAgK1xuICAgICAgYCcke25hbWVQcmVmaXh9Jy4gQXNzdW1pbmcgaXQgaXMgaW52aXNpYmxlLiBgICtcbiAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgd2luZG93cyBhcmUgYXZhaWxhYmxlOiAke18ua2V5cyh3aW5kb3dzKX1gKTtcbiAgICByZXN1bHRbd2luZG93XSA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbW1hbmRzLmdldFN5c3RlbUJhcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRTeXN0ZW1CYXJzICgpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnd2luZG93JywgJ3dpbmRvd3MnXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSBzeXN0ZW0gYmFycyBkZXRhaWxzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlV2luZG93cyhzdGRvdXQpO1xufTtcblxuLy8gZm9yIHVuaXQgdGVzdHNcbmV4cG9ydCB7IHBhcnNlV2luZG93cywgcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL3N5c3RlbS1iYXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
138
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zeXN0ZW0tYmFycy5qcyJdLCJuYW1lcyI6WyJXSU5ET1dfVElUTEVfUEFUVEVSTiIsIkZSQU1FX1BBVFRFUk4iLCJTVVJGQUNFX1BBVFRFUk4iLCJTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIk5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIkRFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMiLCJ2aXNpYmxlIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImNvbW1hbmRzIiwicGFyc2VXaW5kb3dQcm9wZXJ0aWVzIiwibmFtZSIsInByb3BzIiwibG9nIiwicmVzdWx0IiwiXyIsImNsb25lRGVlcCIsInByb3BMaW5lcyIsImpvaW4iLCJmcmFtZU1hdGNoIiwiZXhlYyIsImRlYnVnIiwiRXJyb3IiLCJwYXJzZUZsb2F0IiwibGVmdCIsInRvcCIsInZpc2liaWxpdHlNYXRjaCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwid2luZG93TmFtZVJvd0luZGVudCIsImxpbmUiLCJzcGxpdCIsIm1hcCIsInRyaW1FbmQiLCJjdXJyZW50SW5kZW50IiwibGVuZ3RoIiwidHJpbVN0YXJ0IiwiaXNOaWwiLCJtYXRjaCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJ3aW5kb3ciLCJuYW1lUHJlZml4IiwiaW5mbyIsImtleXMiLCJnZXRTeXN0ZW1CYXJzIiwic3Rkb3V0IiwiYWRiIiwic2hlbGwiLCJlIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLHdEQUE3QjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxnRUFBdEI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsbUNB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QUF0QixDQUFmLENBQWY7QUFDRCxHQUZELENBRUUsT0FBT0MsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJcEMsS0FBSixDQUFXLHdEQUF1RG9DLENBQUMsQ0FBQ0MsT0FBUSxFQUE1RSxDQUFOO0FBQ0Q7O0FBQ0QsU0FBT2hDLFlBQVksQ0FBQzRCLE1BQUQsRUFBUyxLQUFLMUMsR0FBZCxDQUFuQjtBQUNELENBUkQ7O2VBWWVKLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCBXSU5ET1dfVElUTEVfUEFUVEVSTiA9IC9eXFxzK1dpbmRvd1xccyNcXGQrXFxzV2luZG93XFx7WzAtOWEtZl0rXFxzXFx3K1xccyhbXFx3LV0rKVxcfTokLztcbmNvbnN0IEZSQU1FX1BBVFRFUk4gPSAvXlxccyttRnJhbWU9XFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdXFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdL207XG5jb25zdCBTVVJGQUNFX1BBVFRFUk4gPSAvXlxccytTdXJmYWNlOlxcc3Nob3duPSh0cnVlfGZhbHNlKS9tO1xuY29uc3QgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnU3RhdHVzQmFyJztcbmNvbnN0IE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCA9ICdOYXZpZ2F0aW9uQmFyJztcbmNvbnN0IERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMgPSB7XG4gIHZpc2libGU6IGZhbHNlLFxuICB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxufTtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXaW5kb3dQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpc2libGUgV2hldGhlciB0aGUgd2luZG93IGlzIHZpc2libGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IFdpbmRvdyB4IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IFdpbmRvdyB5IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaW5kb3cgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgV2luZG93IGhlaWdodFxuICovXG5cbi8qKlxuICogUGFyc2VzIHdpbmRvdyBwcm9wZXJ0aWVzIGZyb20gYWRiIGR1bXBzeXMgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBwYXJzZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvcHMgVGhlIGxpc3Qgb2YgcGFydGljdWxhciB3aW5kb3cgcHJvcGVydHkgbGluZXMuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHJldHVybnMge1dpbmRvd1Byb3BlcnRpZXN9IFBhcnNlZCBwcm9wZXJ0aWVzIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBpc3N1ZSB3aGlsZSBwYXJzaW5nIHRoZSBwcm9wZXJ0aWVzIHN0cmluZ1xuICovXG5mdW5jdGlvbiBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgKG5hbWUsIHByb3BzLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IHJlc3VsdCA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICBjb25zdCBwcm9wTGluZXMgPSBwcm9wcy5qb2luKCdcXG4nKTtcbiAgY29uc3QgZnJhbWVNYXRjaCA9IEZSQU1FX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIWZyYW1lTWF0Y2gpIHtcbiAgICBsb2c/LmRlYnVnKHByb3BMaW5lcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGZyYW1lIHNpemUgZnJvbSAnJHtuYW1lfScgd2luZG93IHByb3BlcnRpZXNgKTtcbiAgfVxuICByZXN1bHQueCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsxXSk7XG4gIHJlc3VsdC55ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzJdKTtcbiAgY29uc3QgbGVmdCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFszXSk7XG4gIGNvbnN0IHRvcCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFs0XSk7XG4gIHJlc3VsdC53aWR0aCA9IGxlZnQgLSByZXN1bHQueDtcbiAgcmVzdWx0LmhlaWdodCA9IHRvcCAtIHJlc3VsdC55O1xuICBjb25zdCB2aXNpYmlsaXR5TWF0Y2ggPSBTVVJGQUNFX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIXZpc2liaWxpdHlNYXRjaCkge1xuICAgIGxvZz8uZGVidWcocHJvcExpbmVzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgdmlzaWJpbGl0eSB2YWx1ZSBmcm9tICcke25hbWV9JyB3aW5kb3cgcHJvcGVydGllc2ApO1xuICB9XG4gIHJlc3VsdC52aXNpYmxlID0gdmlzaWJpbGl0eU1hdGNoWzFdID09PSAndHJ1ZSc7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgc3RhdHVzIGFuZCBuYXZpZ2F0aW9uIGJhciBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3aW5kb3cgbWFuYWdlciBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsaW5lcyBPdXRwdXQgZnJvbSBkdW1wc3lzIGNvbW1hbmQuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0d28gaXRlbXMgd2hlcmUga2V5cyBhcmUgc3RhdHVzQmFyIGFuZCBuYXZpZ2F0aW9uQmFyLFxuICogYW5kIHZhbHVlcyBhcmUgY29ycmVzcG9uZGluZyBXaW5kb3dQcm9wZXJ0aWVzIG9iamVjdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyB3aW5kb3cgcHJvcGVydGllcyBjb3VsZCBiZSBwYXJzZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dzIChsaW5lcywgbG9nID0gbnVsbCkge1xuICBjb25zdCB3aW5kb3dzID0ge307XG4gIGxldCBjdXJyZW50V2luZG93TmFtZSA9IG51bGw7XG4gIGxldCB3aW5kb3dOYW1lUm93SW5kZW50ID0gbnVsbDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSB8fCBjdXJyZW50SW5kZW50IDw9IHdpbmRvd05hbWVSb3dJbmRlbnQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gV0lORE9XX1RJVExFX1BBVFRFUk4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY3VycmVudFdpbmRvd05hbWUgPSBudWxsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbWF0Y2hbMV07XG4gICAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSkge1xuICAgICAgICB3aW5kb3dOYW1lUm93SW5kZW50ID0gY3VycmVudEluZGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRXaW5kb3dOYW1lIHx8IGN1cnJlbnRJbmRlbnQgPD0gd2luZG93TmFtZVJvd0luZGVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzQXJyYXkod2luZG93c1tjdXJyZW50V2luZG93TmFtZV0pKSB7XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXSA9IFtdO1xuICAgIH1cbiAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXS5wdXNoKGxpbmUpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkod2luZG93cykpIHtcbiAgICBsb2c/LmRlYnVnKGxpbmVzLmpvaW4oJ1xcbicpKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSBhbnkgd2luZG93IGluZm9ybWF0aW9uIGZyb20gdGhlIGR1bXBzeXMgb3V0cHV0Jyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7c3RhdHVzQmFyOiBudWxsLCBuYXZpZ2F0aW9uQmFyOiBudWxsfTtcbiAgZm9yIChjb25zdCBbbmFtZSwgcHJvcHNdIG9mIF8udG9QYWlycyh3aW5kb3dzKSkge1xuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVgpKSB7XG4gICAgICByZXN1bHQuc3RhdHVzQmFyID0gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzKG5hbWUsIHByb3BzLCBsb2cpO1xuICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5uYXZpZ2F0aW9uQmFyID0gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzKG5hbWUsIHByb3BzLCBsb2cpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bm1hdGNoZWRXaW5kb3dzID0gW1xuICAgIFsnc3RhdHVzQmFyJywgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVhdLFxuICAgIFsnbmF2aWdhdGlvbkJhcicsIE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWF1cbiAgXS5maWx0ZXIoKFtuYW1lXSkgPT4gXy5pc05pbChyZXN1bHRbbmFtZV0pKTtcbiAgZm9yIChjb25zdCBbd2luZG93LCBuYW1lUHJlZml4XSBvZiB1bm1hdGNoZWRXaW5kb3dzKSB7XG4gICAgbG9nPy5pbmZvKGBObyB3aW5kb3dzIGhhdmUgYmVlbiBmb3VuZCB3aG9zZSB0aXRsZSBtYXRjaGVzIHRvIGAgK1xuICAgICAgYCcke25hbWVQcmVmaXh9Jy4gQXNzdW1pbmcgaXQgaXMgaW52aXNpYmxlLiBgICtcbiAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgd2luZG93cyBhcmUgYXZhaWxhYmxlOiAke18ua2V5cyh3aW5kb3dzKX1gKTtcbiAgICByZXN1bHRbd2luZG93XSA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbW1hbmRzLmdldFN5c3RlbUJhcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRTeXN0ZW1CYXJzICgpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnd2luZG93JywgJ3dpbmRvd3MnXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSBzeXN0ZW0gYmFycyBkZXRhaWxzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlV2luZG93cyhzdGRvdXQsIHRoaXMubG9nKTtcbn07XG5cbi8vIGZvciB1bml0IHRlc3RzXG5leHBvcnQgeyBwYXJzZVdpbmRvd3MsIHBhcnNlV2luZG93UHJvcGVydGllcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9zeXN0ZW0tYmFycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9