appium-adb 9.0.0 → 9.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.
@@ -37,12 +37,13 @@ const APKS_CACHE = new _lruCache.default({
37
37
  });
38
38
  const APKS_CACHE_GUARD = new _asyncLock.default();
39
39
  const BUNDLETOOL_TIMEOUT_MS = 4 * 60 * 1000;
40
+ const apksUtilsMethods = {};
40
41
  process.on('exit', () => {
41
- if (APKS_CACHE.itemCount === 0) {
42
+ if (!APKS_CACHE.size) {
42
43
  return;
43
44
  }
44
45
 
45
- const paths = APKS_CACHE.values();
46
+ const paths = [...APKS_CACHE.values()];
46
47
 
47
48
  _logger.default.debug(`Performing cleanup of ${paths.length} cached .apks ` + _support.util.pluralize('package', paths.length));
48
49
 
@@ -92,8 +93,6 @@ async function extractFromApks(apks, dstPath) {
92
93
  });
93
94
  }
94
95
 
95
- let apksUtilsMethods = {};
96
-
97
96
  apksUtilsMethods.execBundletool = async function execBundletool(args, errorMsg) {
98
97
  await this.initBundletool();
99
98
  args = ['-jar', this.binaries.bundletool, ...args];
@@ -209,7 +208,7 @@ apksUtilsMethods.extractLanguageApk = async function extractLanguageApk(apks, la
209
208
  return await this.extractBaseApk(apks);
210
209
  };
211
210
 
212
- apksUtilsMethods.isTestPackageOnlyError = function (output) {
211
+ apksUtilsMethods.isTestPackageOnlyError = function isTestPackageOnlyError(output) {
213
212
  return /\[INSTALL_FAILED_TEST_ONLY\]/.test(output);
214
213
  };
215
214
 
@@ -217,4 +216,4 @@ var _default = apksUtilsMethods;
217
216
  exports.default = _default;require('source-map-support').install();
218
217
 
219
218
 
220
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGtzLXV0aWxzLmpzIl0sIm5hbWVzIjpbIkJBU0VfQVBLIiwiTEFOR1VBR0VfQVBLIiwibGFuZyIsIkFQS1NfQ0FDSEUiLCJMUlUiLCJtYXgiLCJkaXNwb3NlIiwiYXBrc0hhc2giLCJleHRyYWN0ZWRGaWxlc1Jvb3QiLCJmcyIsInJpbXJhZiIsIkFQS1NfQ0FDSEVfR1VBUkQiLCJBc3luY0xvY2siLCJCVU5ETEVUT09MX1RJTUVPVVRfTVMiLCJwcm9jZXNzIiwib24iLCJpdGVtQ291bnQiLCJwYXRocyIsInZhbHVlcyIsImxvZyIsImRlYnVnIiwibGVuZ3RoIiwidXRpbCIsInBsdXJhbGl6ZSIsImFwcFBhdGgiLCJyaW1yYWZTeW5jIiwiZSIsIndhcm4iLCJtZXNzYWdlIiwiZXh0cmFjdEZyb21BcGtzIiwiYXBrcyIsImRzdFBhdGgiLCJfIiwiaXNBcnJheSIsImFjcXVpcmUiLCJoYXNoIiwiaGFzIiwicmVzdWx0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0IiwiZXhpc3RzIiwiZGVsIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiRXJyb3IiLCJqb2luIiwic2VwIiwic2V0IiwiYXBrc1V0aWxzTWV0aG9kcyIsImV4ZWNCdW5kbGV0b29sIiwiYXJncyIsImVycm9yTXNnIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJlbnYiLCJhZGJQb3J0IiwiQU5EUk9JRF9BREJfU0VSVkVSX1BPUlQiLCJhZGJIb3N0IiwiQU5EUk9JRF9BREJfU0VSVkVSX0hPU1QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3Rkb3V0IiwidGltZW91dCIsInRydW5jYXRlIiwic3RkZXJyIiwiZ2V0RGV2aWNlU3BlYyIsInNwZWNMb2NhdGlvbiIsImV4ZWN1dGFibGUiLCJjdXJEZXZpY2VJZCIsImluc3RhbGxNdWx0aXBsZUFwa3MiLCJhcGtQYXRoc1RvSW5zdGFsbCIsIm9wdGlvbnMiLCJpbnN0YWxsQXJncyIsImdldEFwaUxldmVsIiwiYWRiRXhlYyIsInRpbWVvdXRDYXBOYW1lIiwiaW5zdGFsbEFwa3MiLCJncmFudFBlcm1pc3Npb25zIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJBUEtTX0lOU1RBTExfVElNRU9VVCIsInB1c2giLCJ0YXNrcyIsImJhc2VuYW1lIiwiZ2V0QXBrSW5mbyIsImFwa0luZm8iLCJCIiwiYWxsIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsIm5hbWUiLCJleHRyYWN0QmFzZUFwayIsImV4dHJhY3RMYW5ndWFnZUFwayIsImxhbmd1YWdlIiwiaW5mbyIsImRlZmF1bHRMYW5ndWFnZXMiLCJpZ24iLCJpc1Rlc3RQYWNrYWdlT25seUVycm9yIiwib3V0cHV0IiwidGVzdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFFQSxNQUFNQSxRQUFRLEdBQUcsaUJBQWpCOztBQUNBLE1BQU1DLFlBQVksR0FBSUMsSUFBRCxJQUFXLFFBQU9BLElBQUssTUFBNUM7O0FBQ0EsTUFBTUMsVUFBVSxHQUFHLElBQUlDLGlCQUFKLENBQVE7QUFDekJDLEVBQUFBLEdBQUcsRUFBRSxFQURvQjtBQUV6QkMsRUFBQUEsT0FBTyxFQUFFLENBQUNDLFFBQUQsRUFBV0Msa0JBQVgsS0FBa0NDLFlBQUdDLE1BQUgsQ0FBVUYsa0JBQVY7QUFGbEIsQ0FBUixDQUFuQjtBQUlBLE1BQU1HLGdCQUFnQixHQUFHLElBQUlDLGtCQUFKLEVBQXpCO0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsSUFBSSxFQUFKLEdBQVMsSUFBdkM7QUFFQUMsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNO0FBQ3ZCLE1BQUlaLFVBQVUsQ0FBQ2EsU0FBWCxLQUF5QixDQUE3QixFQUFnQztBQUM5QjtBQUNEOztBQUVELFFBQU1DLEtBQUssR0FBR2QsVUFBVSxDQUFDZSxNQUFYLEVBQWQ7O0FBQ0FDLGtCQUFJQyxLQUFKLENBQVcseUJBQXdCSCxL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LE1BQU05RixJQUFYLElBQW1COEYsZ0JBQW5CLEVBQXFDO0FBQ25DLFFBQUk7QUFDRixhQUFPLE1BQU1uRSxlQUFlLENBQUNDLElBQUQsRUFBTyxDQUFDLFFBQUQsRUFBVzdCLFlBQVksQ0FBQ0MsSUFBRCxDQUF2QixDQUFQLENBQTVCO0FBQ0QsS0FGRCxDQUVFLE9BQU8rRixHQUFQLEVBQVksQ0FBRTtBQUNqQjs7QUFFRDlFLGtCQUFJNEUsSUFBSixDQUFVLHVEQUFzRGpDLElBQUksQ0FBQ0MsU0FBTCxDQUFlaUMsZ0JBQWYsQ0FBaUMsSUFBeEYsR0FDTixpQ0FESDs7QUFFQSxTQUFPLE1BQU0sS0FBS0osY0FBTCxDQUFvQjlELElBQXBCLENBQWI7QUFDRCxDQXRCRDs7QUF3QkFvQixnQkFBZ0IsQ0FBQ2dELHNCQUFqQixHQUEwQyxVQUFVQyxNQUFWLEVBQWtCO0FBQzFELFNBQU8sK0JBQStCQyxJQUEvQixDQUFvQ0QsTUFBcEMsQ0FBUDtBQUNELENBRkQ7O2VBSWVqRCxnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHtcbiAgZ2V0SmF2YUZvck9zLCB1bnppcEZpbGUsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS1NfSU5TVEFMTF9USU1FT1VUXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQkFTRV9BUEsgPSAnYmFzZS1tYXN0ZXIuYXBrJztcbmNvbnN0IExBTkdVQUdFX0FQSyA9IChsYW5nKSA9PiBgYmFzZS0ke2xhbmd9LmFwa2A7XG5jb25zdCBBUEtTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAsXG4gIGRpc3Bvc2U6IChhcGtzSGFzaCwgZXh0cmFjdGVkRmlsZXNSb290KSA9PiBmcy5yaW1yYWYoZXh0cmFjdGVkRmlsZXNSb290KSxcbn0pO1xuY29uc3QgQVBLU19DQUNIRV9HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IEJVTkRMRVRPT0xfVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGlmIChBUEtTX0NBQ0hFLml0ZW1Db3VudCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gQVBLU19DQUNIRS52YWx1ZXMoKTtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGNsZWFudXAgb2YgJHtwYXRocy5sZW5ndGh9IGNhY2hlZCAuYXBrcyBgICtcbiAgICB1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhdGhzLmxlbmd0aCkpO1xuICBmb3IgKGNvbnN0IGFwcFBhdGggb2YgcGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQXN5bmNocm9ub3VzIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG9uRXhpdCBoYW5kbGVyXG4gICAgICBmcy5yaW1yYWZTeW5jKGFwcFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcGFydGljdWxhciBhcGtzIHBhY2thZ2UgaW50byBhIHRlbXBvcmFyeSBmb2xkZXIsXG4gKiBmaW5kcyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5lZCBpbiB0aGlzIGFway5cbiAqIFRoZSByZXN1bHRpbmcgdGVtcG9yYXJ5IHBhdGgsIHdoZXJlIHRoZSAuYXBrcyBmaWxlIGhhcyBiZWVuIGV4dHJhY3RlZCxcbiAqIHdpbGwgYmUgc3RvcmVkIGludG8gdGhlIGludGVybmFsIExSVSBjYWNoZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8U3RyaW5nPn0gZHN0UGF0aCAtIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgZXh0cmFjdGVkLCB3aGVyZSBlYWNoIHBhdGggY29tcG9uZW50IGlzIGFuIGFycmF5IGl0ZW1cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgZXh0cmFjdGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGl0ZW0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV4dHJhY3RlZCBhcmNoaXZlIG9yIHRoZSBwcm92aWRlc1xuICogYXBrcyBmaWxlIGlzIG5vdCBhIHZhbGlkIGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RnJvbUFwa3MgKGFwa3MsIGRzdFBhdGgpIHtcbiAgaWYgKCFfLmlzQXJyYXkoZHN0UGF0aCkpIHtcbiAgICBkc3RQYXRoID0gW2RzdFBhdGhdO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IEFQS1NfQ0FDSEVfR1VBUkQuYWNxdWlyZShhcGtzLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gSXQgbWlnaHQgYmUgdGhhdCB0aGUgb3JpZ2luYWwgZmlsZSBoYXMgYmVlbiByZXBsYWNlZCxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGtlZXAgdGhlIGhhc2ggc3VtcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgZmlsZSBwYXRoc1xuICAgIC8vIGFzIGNhY2hpbmcga2V5c1xuICAgIGNvbnN0IGFwa3NIYXNoID0gYXdhaXQgZnMuaGFzaChhcGtzKTtcbiAgICBsb2cuZGVidWcoYENhbGN1bGF0ZWQgJyR7YXBrc30nIGhhc2g6ICR7YXBrc0hhc2h9YCk7XG5cbiAgICBpZiAoQVBLU19DQUNIRS5oYXMoYXBrc0hhc2gpKSB7XG4gICAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKEFQS1NfQ0FDSEUuZ2V0KGFwa3NIYXNoKSwgLi4uZHN0UGF0aCk7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRQYXRoO1xuICAgICAgfVxuICAgICAgQVBLU19DQUNIRS5kZWwoYXBrc0hhc2gpO1xuICAgIH1cblxuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBsb2cuZGVidWcoYFVucGFja2luZyBhcHBsaWNhdGlvbiBidW5kbGUgYXQgJyR7YXBrc30nIHRvICcke3RtcFJvb3R9J2ApO1xuICAgIGF3YWl0IHVuemlwRmlsZShhcGtzLCB0bXBSb290KTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIC4uLmRzdFBhdGgpO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZHN0UGF0aC5qb2luKHBhdGguc2VwKX0gY2Fubm90IGJlIGZvdW5kIGluICcke2Fwa3N9JyBidW5kbGUuIGAgK1xuICAgICAgICBgRG9lcyB0aGUgYXJjaGl2ZSBjb250YWluIGEgdmFsaWQgYXBwbGljYXRpb24gYnVuZGxlP2ApO1xuICAgIH1cbiAgICBBUEtTX0NBQ0hFLnNldChhcGtzSGFzaCwgdG1wUm9vdCk7XG4gICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gIH0pO1xufVxuXG5sZXQgYXBrc1V0aWxzTWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIEV4ZWN1dGVzIGJ1bmRsZXRvb2wgdXRpbGl0eSB3aXRoIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgYWN0dWFsIHN0ZG91dFxuICpcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gYXJncyAtIHRoZSBsaXN0IG9mIGJ1bmRsZXRvb2wgYXJndW1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgLSBUaGUgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFjdHVhbCBjb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGJ1bmRsZXRvb2wgamFyIGRvZXMgbm90IGV4aXN0IGluIFBBVEggb3IgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlXG4gKiBleGVjdXRpbmcgaXRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leGVjQnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWNCdW5kbGV0b29sIChhcmdzLCBlcnJvck1zZykge1xuICBhd2FpdCB0aGlzLmluaXRCdW5kbGV0b29sKCk7XG4gIGFyZ3MgPSBbXG4gICAgJy1qYXInLCB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wsXG4gICAgLi4uYXJnc1xuICBdO1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgaWYgKHRoaXMuYWRiUG9ydCkge1xuICAgIGVudi5BTkRST0lEX0FEQl9TRVJWRVJfUE9SVCA9IGAke3RoaXMuYWRiUG9ydH1gO1xuICB9XG4gIGlmICh0aGlzLmFkYkhvc3QpIHtcbiAgICBlbnYuQU5EUk9JRF9BREJfU0VSVkVSX0hPU1QgPSB0aGlzLmFkYkhvc3Q7XG4gIH1cbiAgbG9nLmRlYnVnKGBFeGVjdXRpbmcgYnVuZGxldG9vbCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKGF3YWl0IGdldEphdmFGb3JPcygpLCBhcmdzLCB7XG4gICAgICBlbnYsXG4gICAgICB0aW1lb3V0OiBCVU5ETEVUT09MX1RJTUVPVVRfTVMsXG4gICAgfSkpO1xuICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7Xy50cnVuY2F0ZShzdGRvdXQsIHtsZW5ndGg6IDMwMH0pfWApO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5zdGRvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7ZS5zdGRvdXR9YCk7XG4gICAgfVxuICAgIGlmIChlLnN0ZGVycikge1xuICAgICAgbG9nLmRlYnVnKGBDb21tYW5kIHN0ZGVycjogJHtlLnN0ZGVycn1gKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTXNnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjTG9jYXRpb24gLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgZGV2aWNlIHNwZWMgbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGBzcGVjTG9jYXRpb25gIHZhbHVlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHRoZSBzcGVjIGZvciB0aGUgY3VycmVudCBkZXZpY2VcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5nZXREZXZpY2VTcGVjID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3BlYyAoc3BlY0xvY2F0aW9uKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2dldC1kZXZpY2Utc3BlYycsXG4gICAgJy0tYWRiJywgdGhpcy5leGVjdXRhYmxlLnBhdGgsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgICAnLS1vdXRwdXQnLCBzcGVjTG9jYXRpb24sXG4gIF07XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyB0aGUgc3BlYyBmb3IgdGhlIGRldmljZSAnJHt0aGlzLmN1ckRldmljZUlkfSdgKTtcbiAgYXdhaXQgdGhpcy5leGVjQnVuZGxldG9vbChhcmdzLCAnQ2Fubm90IHJldHJpZXZlIHRoZSBkZXZpY2Ugc3BlYycpO1xuICByZXR1cm4gc3BlY0xvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc1xuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gdGltZW91dCBbMjAwMDBdIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbFxuICogdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcGtzIGludG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcGtQYXRoc1RvSW5zdGFsbCAtIFRoZSBmdWxsIHBhdGhzIHRvIGluc3RhbGwgYXBrc1xuICogQHBhcmFtIHs/aW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnN9IG9wdGlvbnMgLSBJbnN0YWxsYXRpb24gb3B0aW9uc1xuICovXG5hcGtzVXRpbHNNZXRob2RzLmluc3RhbGxNdWx0aXBsZUFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTXVsdGlwbGVBcGtzIChhcGtQYXRoc1RvSW5zdGFsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGluc3RhbGxBcmdzID0gYnVpbGRJbnN0YWxsQXJncyhhd2FpdCB0aGlzLmdldEFwaUxldmVsKCksIG9wdGlvbnMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnaW5zdGFsbC1tdWx0aXBsZScsIC4uLmluc3RhbGxBcmdzLCAuLi5hcGtQYXRoc1RvSW5zdGFsbF0sIHtcbiAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6IG9wdGlvbnMudGltZW91dENhcE5hbWUsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzEyMDAwMF0gLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsXG4gKiB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVvdXRDYXBOYW1lIFthbmRyb2lkSW5zdGFsbFRpbWVvdXRdIC0gVGhlIHRpbWVvdXQgb3B0aW9uIG5hbWVcbiAqIHVzZXJzIGNhbiBpbmNyZWFzZSB0aGUgdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gLmFwa3MgcGFja2FnZSBpbnRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHs/SW5zdGFsbEFwa3NPcHRpb25zfSBvcHRpb25zIC0gSW5zdGFsbGF0aW9uIG9wdGlvbnNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgLmFwa3MgYnVuZGxlIGNhbm5vdCBiZSBpbnN0YWxsZWRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5pbnN0YWxsQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGtzIChhcGtzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGdyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgdGltZW91dCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnaW5zdGFsbC1hcGtzJyxcbiAgICAnLS1hZGInLCB0aGlzLmV4ZWN1dGFibGUucGF0aCxcbiAgICAnLS1hcGtzJywgYXBrcyxcbiAgICAnLS10aW1lb3V0LW1pbGxpcycsIHRpbWVvdXQgfHwgQVBLU19JTlNUQUxMX1RJTUVPVVQsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgXTtcbiAgaWYgKGFsbG93VGVzdFBhY2thZ2VzKSB7XG4gICAgYXJncy5wdXNoKCctLWFsbG93LXRlc3Qtb25seScpO1xuICB9XG4gIGNvbnN0IHRhc2tzID0gW1xuICAgIHRoaXMuZXhlY0J1bmRsZXRvb2woYXJncywgYENhbm5vdCBpbnN0YWxsICcke3BhdGguYmFzZW5hbWUoYXBrcyl9JyB0byB0aGUgZGV2aWNlICR7dGhpcy5jdXJEZXZpY2VJZH1gKVxuICBdO1xuICBpZiAoZ3JhbnRQZXJtaXNzaW9ucykge1xuICAgIHRhc2tzLnB1c2godGhpcy5nZXRBcGtJbmZvKGFwa3MpKTtcbiAgfVxuICBjb25zdCBbLCBhcGtJbmZvXSA9IGF3YWl0IEIuYWxsKHRhc2tzKTtcbiAgaWYgKGdyYW50UGVybWlzc2lvbnMgJiYgYXBrSW5mbykge1xuICAgIC8vIFRPRE86IFNpbXBsaWZ5IGl0IGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbC9pc3N1ZXMvMjQ2IGlzIGltcGxlbWVudGVkXG4gICAgYXdhaXQgdGhpcy5ncmFudEFsbFBlcm1pc3Npb25zKGFwa0luZm8ubmFtZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgbWFzdGVyIC5hcGsgZmlsZSBpbnNpZGUgdGhlIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIG1hc3RlciBidW5kbGUgLmFwa1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0QmFzZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCYXNlQXBrIChhcGtzKSB7XG4gIHJldHVybiBhd2FpdCBleHRyYWN0RnJvbUFwa3MoYXBrcywgWydzcGxpdHMnLCBCQVNFX0FQS10pO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrLCB3aGljaCBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZ1xuICogcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaW4gdGhlIC5hcGtzIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBUaGUgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLiBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpc1xuICogZ29pbmcgdG8gYmUgc2VsZWN0ZWQgaWYgaXQgaXMgbm90IHNldC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGFuZ3VhZ2UgLmFwayBvciB0aGUgbWFzdGVyIC5hcGtcbiAqIGlmIGxhbmd1YWdlIHNwbGl0IGlzIG5vdCBlbmFibGVkIGZvciB0aGUgYnVuZGxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0TGFuZ3VhZ2VBcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0TGFuZ3VhZ2VBcGsgKGFwa3MsIGxhbmd1YWdlID0gbnVsbCkge1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3RGcm9tQXBrcyhhcGtzLCBbJ3NwbGl0cycsIExBTkdVQUdFX0FQSyhsYW5ndWFnZSldKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgIGxvZy5pbmZvKGBBc3N1bWluZyB0aGF0IHNwbGl0dGluZyBieSBsYW5ndWFnZSBpcyBub3QgZW5hYmxlZCBmb3IgdGhlICcke2Fwa3N9JyBidW5kbGUgYCArXG4gICAgICAgIGBhbmQgcmV0dXJuaW5nIHRoZSBtYWluIGFwayBpbnN0ZWFkYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcGtzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2VzID0gWydlbicsICdlbl91cyddO1xuICBmb3IgKGNvbnN0IGxhbmcgb2YgZGVmYXVsdExhbmd1YWdlcykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdEZyb21BcGtzKGFwa3MsIFsnc3BsaXRzJywgTEFOR1VBR0VfQVBLKGxhbmcpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG5cbiAgbG9nLmluZm8oYENhbm5vdCBmaW5kIGFueSBzcGxpdCBhcGsgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlcyAke0pTT04uc3RyaW5naWZ5KGRlZmF1bHRMYW5ndWFnZXMpfS4gYCArXG4gICAgYFJldHVybmluZyB0aGUgbWFpbiBhcGsgaW5zdGVhZC5gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0cmFjdEJhc2VBcGsoYXBrcyk7XG59O1xuXG5hcGtzVXRpbHNNZXRob2RzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3IgPSBmdW5jdGlvbiAob3V0cHV0KSB7XG4gIHJldHVybiAvXFxbSU5TVEFMTF9GQUlMRURfVEVTVF9PTkxZXFxdLy50ZXN0KG91dHB1dCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhcGtzVXRpbHNNZXRob2RzO1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvYXBrcy11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
219
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hcGtzLXV0aWxzLmpzIl0sIm5hbWVzIjpbIkJBU0VfQVBLIiwiTEFOR1VBR0VfQVBLIiwibGFuZyIsIkFQS1NfQ0FDSEUiLCJMUlUiLCJtYXgiLCJkaXNwb3NlIiwiYXBrc0hhc2giLCJleHRyYWN0ZWRGaWxlc1Jvb3QiLCJmcyIsInJpbXJhZiIsIkFQS1NfQ0FDSEVfR1VBUkQiLCJBc3luY0xvY2siLCJCVU5ETEVUT09MX1RJTUVPVVRfTVMiLCJhcGtzVXRpbHNNZXRob2RzIiwicHJvY2VzcyIsIm9uIiwic2l6ZSIsInBhdGhzIiwidmFsdWVzIiwibG9nIiwiZGVidWciLCJsZW5ndGgiLCJ1dGlsIiwicGx1cmFsaXplIiwiYXBwUGF0aCIsInJpbXJhZlN5bmMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJleHRyYWN0RnJvbUFwa3MiLCJhcGtzIiwiZHN0UGF0aCIsIl8iLCJpc0FycmF5IiwiYWNxdWlyZSIsImhhc2giLCJoYXMiLCJyZXN1bHRQYXRoIiwicGF0aCIsInJlc29sdmUiLCJnZXQiLCJleGlzdHMiLCJkZWwiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJFcnJvciIsImpvaW4iLCJzZXAiLCJzZXQiLCJleGVjQnVuZGxldG9vbCIsImFyZ3MiLCJlcnJvck1zZyIsImluaXRCdW5kbGV0b29sIiwiYmluYXJpZXMiLCJidW5kbGV0b29sIiwiZW52IiwiYWRiUG9ydCIsIkFORFJPSURfQURCX1NFUlZFUl9QT1JUIiwiYWRiSG9zdCIsIkFORFJPSURfQURCX1NFUlZFUl9IT1NUIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0ZG91dCIsInRpbWVvdXQiLCJ0cnVuY2F0ZSIsInN0ZGVyciIsImdldERldmljZVNwZWMiLCJzcGVjTG9jYXRpb24iLCJleGVjdXRhYmxlIiwiY3VyRGV2aWNlSWQiLCJpbnN0YWxsTXVsdGlwbGVBcGtzIiwiYXBrUGF0aHNUb0luc3RhbGwiLCJvcHRpb25zIiwiaW5zdGFsbEFyZ3MiLCJnZXRBcGlMZXZlbCIsImFkYkV4ZWMiLCJ0aW1lb3V0Q2FwTmFtZSIsImluc3RhbGxBcGtzIiwiZ3JhbnRQZXJtaXNzaW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJwdXNoIiwidGFza3MiLCJiYXNlbmFtZSIsImdldEFwa0luZm8iLCJhcGtJbmZvIiwiQiIsImFsbCIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJuYW1lIiwiZXh0cmFjdEJhc2VBcGsiLCJleHRyYWN0TGFuZ3VhZ2VBcGsiLCJsYW5ndWFnZSIsImluZm8iLCJkZWZhdWx0TGFuZ3VhZ2VzIiwiaWduIiwiaXNUZXN0UGFja2FnZU9ubHlFcnJvciIsIm91dHB1dCIsInRlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLGlCQUFqQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUlDLElBQUQsSUFBVyxRQUFPQSxJQUFLLE1BQTVDOztBQUNBLE1BQU1DLFVBQVUsR0FBRyxJQUFJQyxpQkFBSixDQUFRO0FBQ3pCQyxFQUFBQSxHQUFHLEVBQUUsRUFEb0I7QUFFekJDLEVBQUFBLE9BQU8sRUFBRSxDQUFDQyxRQUFELEVBQVdDLGtCQUFYLEtBQWtDQyxZQUFHQyxNQUFILENBQVVGLGtCQUFWO0FBRmxCLENBQVIsQ0FBbkI7QUFJQSxNQUFNRyxnQkFBZ0IsR0FBRyxJQUFJQyxrQkFBSixFQUF6QjtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLElBQUksRUFBSixHQUFTLElBQXZDO0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUcsRUFBekI7QUFFQUMsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNO0FBQ3ZCLE1BQUksQ0FBQ2IsVUFBVSxDQUFDYyxJQUFoQixFQUFzQjtBQUNwQjtBQUNEOztBQUVELFFBQU1DLEtBQUssR0FBRyxDQUFDLEdBQUdmLFVBQVUsQ0FBQ2dCLE1BQVgsRUFBSixDQUFk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T0FBSyxNQUFNOUYsSUFBWCxJQUFtQjhGLGdCQUFuQixFQUFxQztBQUNuQyxRQUFJO0FBQ0YsYUFBTyxNQUFNbEUsZUFBZSxDQUFDQyxJQUFELEVBQU8sQ0FBQyxRQUFELEVBQVc5QixZQUFZLENBQUNDLElBQUQsQ0FBdkIsQ0FBUCxDQUE1QjtBQUNELEtBRkQsQ0FFRSxPQUFPK0YsR0FBUCxFQUFZLENBQUU7QUFDakI7O0FBRUQ3RSxrQkFBSTJFLElBQUosQ0FBVSx1REFBc0RqQyxJQUFJLENBQUNDLFNBQUwsQ0FBZWlDLGdCQUFmLENBQWlDLElBQXhGLEdBQ04saUNBREg7O0FBRUEsU0FBTyxNQUFNLEtBQUtKLGNBQUwsQ0FBb0I3RCxJQUFwQixDQUFiO0FBQ0QsQ0F0QkQ7O0FBd0JBakIsZ0JBQWdCLENBQUNvRixzQkFBakIsR0FBMEMsU0FBU0Esc0JBQVQsQ0FBaUNDLE1BQWpDLEVBQXlDO0FBQ2pGLFNBQU8sK0JBQStCQyxJQUEvQixDQUFvQ0QsTUFBcEMsQ0FBUDtBQUNELENBRkQ7O2VBSWVyRixnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHtcbiAgZ2V0SmF2YUZvck9zLCB1bnppcEZpbGUsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS1NfSU5TVEFMTF9USU1FT1VUXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQkFTRV9BUEsgPSAnYmFzZS1tYXN0ZXIuYXBrJztcbmNvbnN0IExBTkdVQUdFX0FQSyA9IChsYW5nKSA9PiBgYmFzZS0ke2xhbmd9LmFwa2A7XG5jb25zdCBBUEtTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAsXG4gIGRpc3Bvc2U6IChhcGtzSGFzaCwgZXh0cmFjdGVkRmlsZXNSb290KSA9PiBmcy5yaW1yYWYoZXh0cmFjdGVkRmlsZXNSb290KSxcbn0pO1xuY29uc3QgQVBLU19DQUNIRV9HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IEJVTkRMRVRPT0xfVElNRU9VVF9NUyA9IDQgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGFwa3NVdGlsc01ldGhvZHMgPSB7fTtcblxucHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgaWYgKCFBUEtTX0NBQ0hFLnNpemUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRocyA9IFsuLi5BUEtTX0NBQ0hFLnZhbHVlcygpXTtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGNsZWFudXAgb2YgJHtwYXRocy5sZW5ndGh9IGNhY2hlZCAuYXBrcyBgICtcbiAgICB1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhdGhzLmxlbmd0aCkpO1xuICBmb3IgKGNvbnN0IGFwcFBhdGggb2YgcGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQXN5bmNocm9ub3VzIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG9uRXhpdCBoYW5kbGVyXG4gICAgICBmcy5yaW1yYWZTeW5jKGFwcFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcGFydGljdWxhciBhcGtzIHBhY2thZ2UgaW50byBhIHRlbXBvcmFyeSBmb2xkZXIsXG4gKiBmaW5kcyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5lZCBpbiB0aGlzIGFway5cbiAqIFRoZSByZXN1bHRpbmcgdGVtcG9yYXJ5IHBhdGgsIHdoZXJlIHRoZSAuYXBrcyBmaWxlIGhhcyBiZWVuIGV4dHJhY3RlZCxcbiAqIHdpbGwgYmUgc3RvcmVkIGludG8gdGhlIGludGVybmFsIExSVSBjYWNoZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8U3RyaW5nPn0gZHN0UGF0aCAtIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgZXh0cmFjdGVkLCB3aGVyZSBlYWNoIHBhdGggY29tcG9uZW50IGlzIGFuIGFycmF5IGl0ZW1cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byB0aGUgZXh0cmFjdGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGl0ZW0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGV4dHJhY3RlZCBhcmNoaXZlIG9yIHRoZSBwcm92aWRlc1xuICogYXBrcyBmaWxlIGlzIG5vdCBhIHZhbGlkIGJ1bmRsZVxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RnJvbUFwa3MgKGFwa3MsIGRzdFBhdGgpIHtcbiAgaWYgKCFfLmlzQXJyYXkoZHN0UGF0aCkpIHtcbiAgICBkc3RQYXRoID0gW2RzdFBhdGhdO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IEFQS1NfQ0FDSEVfR1VBUkQuYWNxdWlyZShhcGtzLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gSXQgbWlnaHQgYmUgdGhhdCB0aGUgb3JpZ2luYWwgZmlsZSBoYXMgYmVlbiByZXBsYWNlZCxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGtlZXAgdGhlIGhhc2ggc3VtcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgZmlsZSBwYXRoc1xuICAgIC8vIGFzIGNhY2hpbmcga2V5c1xuICAgIGNvbnN0IGFwa3NIYXNoID0gYXdhaXQgZnMuaGFzaChhcGtzKTtcbiAgICBsb2cuZGVidWcoYENhbGN1bGF0ZWQgJyR7YXBrc30nIGhhc2g6ICR7YXBrc0hhc2h9YCk7XG5cbiAgICBpZiAoQVBLU19DQUNIRS5oYXMoYXBrc0hhc2gpKSB7XG4gICAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKEFQS1NfQ0FDSEUuZ2V0KGFwa3NIYXNoKSwgLi4uZHN0UGF0aCk7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRQYXRoO1xuICAgICAgfVxuICAgICAgQVBLU19DQUNIRS5kZWwoYXBrc0hhc2gpO1xuICAgIH1cblxuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBsb2cuZGVidWcoYFVucGFja2luZyBhcHBsaWNhdGlvbiBidW5kbGUgYXQgJyR7YXBrc30nIHRvICcke3RtcFJvb3R9J2ApO1xuICAgIGF3YWl0IHVuemlwRmlsZShhcGtzLCB0bXBSb290KTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIC4uLmRzdFBhdGgpO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZHN0UGF0aC5qb2luKHBhdGguc2VwKX0gY2Fubm90IGJlIGZvdW5kIGluICcke2Fwa3N9JyBidW5kbGUuIGAgK1xuICAgICAgICBgRG9lcyB0aGUgYXJjaGl2ZSBjb250YWluIGEgdmFsaWQgYXBwbGljYXRpb24gYnVuZGxlP2ApO1xuICAgIH1cbiAgICBBUEtTX0NBQ0hFLnNldChhcGtzSGFzaCwgdG1wUm9vdCk7XG4gICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGJ1bmRsZXRvb2wgdXRpbGl0eSB3aXRoIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgYWN0dWFsIHN0ZG91dFxuICpcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gYXJncyAtIHRoZSBsaXN0IG9mIGJ1bmRsZXRvb2wgYXJndW1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgLSBUaGUgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFjdHVhbCBjb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGJ1bmRsZXRvb2wgamFyIGRvZXMgbm90IGV4aXN0IGluIFBBVEggb3IgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlXG4gKiBleGVjdXRpbmcgaXRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leGVjQnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWNCdW5kbGV0b29sIChhcmdzLCBlcnJvck1zZykge1xuICBhd2FpdCB0aGlzLmluaXRCdW5kbGV0b29sKCk7XG4gIGFyZ3MgPSBbXG4gICAgJy1qYXInLCB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wsXG4gICAgLi4uYXJnc1xuICBdO1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgaWYgKHRoaXMuYWRiUG9ydCkge1xuICAgIGVudi5BTkRST0lEX0FEQl9TRVJWRVJfUE9SVCA9IGAke3RoaXMuYWRiUG9ydH1gO1xuICB9XG4gIGlmICh0aGlzLmFkYkhvc3QpIHtcbiAgICBlbnYuQU5EUk9JRF9BREJfU0VSVkVSX0hPU1QgPSB0aGlzLmFkYkhvc3Q7XG4gIH1cbiAgbG9nLmRlYnVnKGBFeGVjdXRpbmcgYnVuZGxldG9vbCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKGF3YWl0IGdldEphdmFGb3JPcygpLCBhcmdzLCB7XG4gICAgICBlbnYsXG4gICAgICB0aW1lb3V0OiBCVU5ETEVUT09MX1RJTUVPVVRfTVMsXG4gICAgfSkpO1xuICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7Xy50cnVuY2F0ZShzdGRvdXQsIHtsZW5ndGg6IDMwMH0pfWApO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5zdGRvdXQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7ZS5zdGRvdXR9YCk7XG4gICAgfVxuICAgIGlmIChlLnN0ZGVycikge1xuICAgICAgbG9nLmRlYnVnKGBDb21tYW5kIHN0ZGVycjogJHtlLnN0ZGVycn1gKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTXNnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjTG9jYXRpb24gLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgZGV2aWNlIHNwZWMgbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGBzcGVjTG9jYXRpb25gIHZhbHVlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHRoZSBzcGVjIGZvciB0aGUgY3VycmVudCBkZXZpY2VcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5nZXREZXZpY2VTcGVjID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3BlYyAoc3BlY0xvY2F0aW9uKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2dldC1kZXZpY2Utc3BlYycsXG4gICAgJy0tYWRiJywgdGhpcy5leGVjdXRhYmxlLnBhdGgsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgICAnLS1vdXRwdXQnLCBzcGVjTG9jYXRpb24sXG4gIF07XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyB0aGUgc3BlYyBmb3IgdGhlIGRldmljZSAnJHt0aGlzLmN1ckRldmljZUlkfSdgKTtcbiAgYXdhaXQgdGhpcy5leGVjQnVuZGxldG9vbChhcmdzLCAnQ2Fubm90IHJldHJpZXZlIHRoZSBkZXZpY2Ugc3BlYycpO1xuICByZXR1cm4gc3BlY0xvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc1xuICogQHByb3BlcnR5IHs/bnVtYmVyfHN0cmluZ30gdGltZW91dCBbMjAwMDBdIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbFxuICogdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lb3V0Q2FwTmFtZSBbYW5kcm9pZEluc3RhbGxUaW1lb3V0XSAtIFRoZSB0aW1lb3V0IG9wdGlvbiBuYW1lXG4gKiB1c2VycyBjYW4gaW5jcmVhc2UgdGhlIHRpbWVvdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcGtzIGludG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcGtQYXRoc1RvSW5zdGFsbCAtIFRoZSBmdWxsIHBhdGhzIHRvIGluc3RhbGwgYXBrc1xuICogQHBhcmFtIHs/aW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnN9IG9wdGlvbnMgLSBJbnN0YWxsYXRpb24gb3B0aW9uc1xuICovXG5hcGtzVXRpbHNNZXRob2RzLmluc3RhbGxNdWx0aXBsZUFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTXVsdGlwbGVBcGtzIChhcGtQYXRoc1RvSW5zdGFsbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGluc3RhbGxBcmdzID0gYnVpbGRJbnN0YWxsQXJncyhhd2FpdCB0aGlzLmdldEFwaUxldmVsKCksIG9wdGlvbnMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnaW5zdGFsbC1tdWx0aXBsZScsIC4uLmluc3RhbGxBcmdzLCAuLi5hcGtQYXRoc1RvSW5zdGFsbF0sIHtcbiAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgdGltZW91dENhcE5hbWU6IG9wdGlvbnMudGltZW91dENhcE5hbWUsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzEyMDAwMF0gLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsXG4gKiB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVvdXRDYXBOYW1lIFthbmRyb2lkSW5zdGFsbFRpbWVvdXRdIC0gVGhlIHRpbWVvdXQgb3B0aW9uIG5hbWVcbiAqIHVzZXJzIGNhbiBpbmNyZWFzZSB0aGUgdGltZW91dC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvblxuICogaXMgY29tcGxldGVkIHVuZGVyIEFuZHJvaWQgNisuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gLmFwa3MgcGFja2FnZSBpbnRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtzIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgLmFwa3MgZmlsZVxuICogQHBhcmFtIHs/SW5zdGFsbEFwa3NPcHRpb25zfSBvcHRpb25zIC0gSW5zdGFsbGF0aW9uIG9wdGlvbnNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgLmFwa3MgYnVuZGxlIGNhbm5vdCBiZSBpbnN0YWxsZWRcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5pbnN0YWxsQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGtzIChhcGtzLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGdyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgdGltZW91dCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnaW5zdGFsbC1hcGtzJyxcbiAgICAnLS1hZGInLCB0aGlzLmV4ZWN1dGFibGUucGF0aCxcbiAgICAnLS1hcGtzJywgYXBrcyxcbiAgICAnLS10aW1lb3V0LW1pbGxpcycsIHRpbWVvdXQgfHwgQVBLU19JTlNUQUxMX1RJTUVPVVQsXG4gICAgJy0tZGV2aWNlLWlkJywgdGhpcy5jdXJEZXZpY2VJZCxcbiAgXTtcbiAgaWYgKGFsbG93VGVzdFBhY2thZ2VzKSB7XG4gICAgYXJncy5wdXNoKCctLWFsbG93LXRlc3Qtb25seScpO1xuICB9XG4gIGNvbnN0IHRhc2tzID0gW1xuICAgIHRoaXMuZXhlY0J1bmRsZXRvb2woYXJncywgYENhbm5vdCBpbnN0YWxsICcke3BhdGguYmFzZW5hbWUoYXBrcyl9JyB0byB0aGUgZGV2aWNlICR7dGhpcy5jdXJEZXZpY2VJZH1gKVxuICBdO1xuICBpZiAoZ3JhbnRQZXJtaXNzaW9ucykge1xuICAgIHRhc2tzLnB1c2godGhpcy5nZXRBcGtJbmZvKGFwa3MpKTtcbiAgfVxuICBjb25zdCBbLCBhcGtJbmZvXSA9IGF3YWl0IEIuYWxsKHRhc2tzKTtcbiAgaWYgKGdyYW50UGVybWlzc2lvbnMgJiYgYXBrSW5mbykge1xuICAgIC8vIFRPRE86IFNpbXBsaWZ5IGl0IGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbC9pc3N1ZXMvMjQ2IGlzIGltcGxlbWVudGVkXG4gICAgYXdhaXQgdGhpcy5ncmFudEFsbFBlcm1pc3Npb25zKGFwa0luZm8ubmFtZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgbWFzdGVyIC5hcGsgZmlsZSBpbnNpZGUgdGhlIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIG1hc3RlciBidW5kbGUgLmFwa1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0QmFzZUFwayA9IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCYXNlQXBrIChhcGtzKSB7XG4gIHJldHVybiBhd2FpdCBleHRyYWN0RnJvbUFwa3MoYXBrcywgWydzcGxpdHMnLCBCQVNFX0FQS10pO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSAuYXBrLCB3aGljaCBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZ1xuICogcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaW4gdGhlIC5hcGtzIGJ1bmRsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrcyAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIC5hcGtzIGZpbGVcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBUaGUgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uLiBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpc1xuICogZ29pbmcgdG8gYmUgc2VsZWN0ZWQgaWYgaXQgaXMgbm90IHNldC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGFuZ3VhZ2UgLmFwayBvciB0aGUgbWFzdGVyIC5hcGtcbiAqIGlmIGxhbmd1YWdlIHNwbGl0IGlzIG5vdCBlbmFibGVkIGZvciB0aGUgYnVuZGxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleHRyYWN0aW5nL2ZpbmRpbmcgdGhlIGZpbGVcbiAqL1xuYXBrc1V0aWxzTWV0aG9kcy5leHRyYWN0TGFuZ3VhZ2VBcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0TGFuZ3VhZ2VBcGsgKGFwa3MsIGxhbmd1YWdlID0gbnVsbCkge1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3RGcm9tQXBrcyhhcGtzLCBbJ3NwbGl0cycsIExBTkdVQUdFX0FQSyhsYW5ndWFnZSldKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgIGxvZy5pbmZvKGBBc3N1bWluZyB0aGF0IHNwbGl0dGluZyBieSBsYW5ndWFnZSBpcyBub3QgZW5hYmxlZCBmb3IgdGhlICcke2Fwa3N9JyBidW5kbGUgYCArXG4gICAgICAgIGBhbmQgcmV0dXJuaW5nIHRoZSBtYWluIGFwayBpbnN0ZWFkYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcGtzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2VzID0gWydlbicsICdlbl91cyddO1xuICBmb3IgKGNvbnN0IGxhbmcgb2YgZGVmYXVsdExhbmd1YWdlcykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdEZyb21BcGtzKGFwa3MsIFsnc3BsaXRzJywgTEFOR1VBR0VfQVBLKGxhbmcpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG5cbiAgbG9nLmluZm8oYENhbm5vdCBmaW5kIGFueSBzcGxpdCBhcGsgZm9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlcyAke0pTT04uc3RyaW5naWZ5KGRlZmF1bHRMYW5ndWFnZXMpfS4gYCArXG4gICAgYFJldHVybmluZyB0aGUgbWFpbiBhcGsgaW5zdGVhZC5gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXh0cmFjdEJhc2VBcGsoYXBrcyk7XG59O1xuXG5hcGtzVXRpbHNNZXRob2RzLmlzVGVzdFBhY2thZ2VPbmx5RXJyb3IgPSBmdW5jdGlvbiBpc1Rlc3RQYWNrYWdlT25seUVycm9yIChvdXRwdXQpIHtcbiAgcmV0dXJuIC9cXFtJTlNUQUxMX0ZBSUxFRF9URVNUX09OTFlcXF0vLnRlc3Qob3V0cHV0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFwa3NVdGlsc01ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hcGtzLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -27,6 +27,8 @@ var _apkUtils = _interopRequireDefault(require("./apk-utils.js"));
27
27
 
28
28
  var _apksUtils = _interopRequireDefault(require("./apks-utils.js"));
29
29
 
30
+ var _aabUtils = _interopRequireDefault(require("./aab-utils.js"));
31
+
30
32
  var _adbEmuCommands = _interopRequireDefault(require("./adb-emu-commands.js"));
31
33
 
32
34
  var _settingsClientCommands = _interopRequireDefault(require("./settings-client-commands"));
@@ -39,9 +41,9 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
39
41
 
40
42
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
41
43
 
42
- Object.assign(_adbCommands.default, _androidManifest.default, _systemCalls.default, _adbEmuCommands.default, _apkSigning.default, _apkUtils.default, _apksUtils.default, _settingsClientCommands.default, _lockmgmt.default, _keyboardCommands.default);
44
+ Object.assign(_adbCommands.default, _androidManifest.default, _systemCalls.default, _adbEmuCommands.default, _apkSigning.default, _apkUtils.default, _apksUtils.default, _aabUtils.default, _settingsClientCommands.default, _lockmgmt.default, _keyboardCommands.default);
43
45
  var _default = _adbCommands.default;
44
46
  exports.default = _default;require('source-map-support').install();
45
47
 
46
48
 
47
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9pbmRleC5qcyJdLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJtZXRob2RzIiwibWFuaWZlc3RNZXRob2RzIiwic3lzdGVtQ2FsbE1ldGhvZHMiLCJlbXVNZXRob2RzIiwiYXBrU2lnbmluZ01ldGhvZHMiLCJhcGtVdGlsc01ldGhvZHMiLCJhcGtzVXRpbHNNZXRob2RzIiwic2V0dGluZ3NDbGllbnRDb21tYW5kcyIsImxvY2tNYW5hZ2VtZW50Q29tbWFuZHMiLCJrZXlib2FyZENvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsTUFBTSxDQUFDQyxNQUFQLENBQ0lDLG9CQURKLEVBRUlDLHdCQUZKLEVBR0lDLG9CQUhKLEVBSUlDLHVCQUpKLEVBS0lDLG1CQUxKLEVBTUlDLGlCQU5KLEVBT0lDLGtCQVBKLEVBUUlDLCtCQVJKLEVBU0lDLGlCQVRKLEVBVUlDLHlCQVZKO2VBYWVULG9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1ldGhvZHMgZnJvbSAnLi9hZGItY29tbWFuZHMuanMnO1xuaW1wb3J0IG1hbmlmZXN0TWV0aG9kcyBmcm9tICcuL2FuZHJvaWQtbWFuaWZlc3QuanMnO1xuaW1wb3J0IHN5c3RlbUNhbGxNZXRob2RzLCB7IGdldEFuZHJvaWRCaW5hcnlQYXRoIH0gZnJvbSAnLi9zeXN0ZW0tY2FsbHMuanMnO1xuaW1wb3J0IGFwa1NpZ25pbmdNZXRob2RzIGZyb20gJy4vYXBrLXNpZ25pbmcuanMnO1xuaW1wb3J0IGFwa1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fway11dGlscy5qcyc7XG5pbXBvcnQgYXBrc1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fwa3MtdXRpbHMuanMnO1xuaW1wb3J0IGVtdU1ldGhvZHMgZnJvbSAnLi9hZGItZW11LWNvbW1hbmRzLmpzJztcbmltcG9ydCBzZXR0aW5nc0NsaWVudENvbW1hbmRzIGZyb20gJy4vc2V0dGluZ3MtY2xpZW50LWNvbW1hbmRzJztcbmltcG9ydCBsb2NrTWFuYWdlbWVudENvbW1hbmRzIGZyb20gJy4vbG9ja21nbXQnO1xuaW1wb3J0IGtleWJvYXJkQ29tbWFuZHMgZnJvbSAnLi9rZXlib2FyZC1jb21tYW5kcyc7XG5cbk9iamVjdC5hc3NpZ24oXG4gICAgbWV0aG9kcyxcbiAgICBtYW5pZmVzdE1ldGhvZHMsXG4gICAgc3lzdGVtQ2FsbE1ldGhvZHMsXG4gICAgZW11TWV0aG9kcyxcbiAgICBhcGtTaWduaW5nTWV0aG9kcyxcbiAgICBhcGtVdGlsc01ldGhvZHMsXG4gICAgYXBrc1V0aWxzTWV0aG9kcyxcbiAgICBzZXR0aW5nc0NsaWVudENvbW1hbmRzLFxuICAgIGxvY2tNYW5hZ2VtZW50Q29tbWFuZHMsXG4gICAga2V5Ym9hcmRDb21tYW5kcyxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG5leHBvcnQgeyBnZXRBbmRyb2lkQmluYXJ5UGF0aCB9O1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
49
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9pbmRleC5qcyJdLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJtZXRob2RzIiwibWFuaWZlc3RNZXRob2RzIiwic3lzdGVtQ2FsbE1ldGhvZHMiLCJlbXVNZXRob2RzIiwiYXBrU2lnbmluZ01ldGhvZHMiLCJhcGtVdGlsc01ldGhvZHMiLCJhcGtzVXRpbHNNZXRob2RzIiwiYWFiVXRpbHNNZXRob2RzIiwic2V0dGluZ3NDbGllbnRDb21tYW5kcyIsImxvY2tNYW5hZ2VtZW50Q29tbWFuZHMiLCJrZXlib2FyZENvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsTUFBTSxDQUFDQyxNQUFQLENBQ0lDLG9CQURKLEVBRUlDLHdCQUZKLEVBR0lDLG9CQUhKLEVBSUlDLHVCQUpKLEVBS0lDLG1CQUxKLEVBTUlDLGlCQU5KLEVBT0lDLGtCQVBKLEVBUUlDLGlCQVJKLEVBU0lDLCtCQVRKLEVBVUlDLGlCQVZKLEVBV0lDLHlCQVhKO2VBY2VWLG9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1ldGhvZHMgZnJvbSAnLi9hZGItY29tbWFuZHMuanMnO1xuaW1wb3J0IG1hbmlmZXN0TWV0aG9kcyBmcm9tICcuL2FuZHJvaWQtbWFuaWZlc3QuanMnO1xuaW1wb3J0IHN5c3RlbUNhbGxNZXRob2RzLCB7IGdldEFuZHJvaWRCaW5hcnlQYXRoIH0gZnJvbSAnLi9zeXN0ZW0tY2FsbHMuanMnO1xuaW1wb3J0IGFwa1NpZ25pbmdNZXRob2RzIGZyb20gJy4vYXBrLXNpZ25pbmcuanMnO1xuaW1wb3J0IGFwa1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fway11dGlscy5qcyc7XG5pbXBvcnQgYXBrc1V0aWxzTWV0aG9kcyBmcm9tICcuL2Fwa3MtdXRpbHMuanMnO1xuaW1wb3J0IGFhYlV0aWxzTWV0aG9kcyBmcm9tICcuL2FhYi11dGlscy5qcyc7XG5pbXBvcnQgZW11TWV0aG9kcyBmcm9tICcuL2FkYi1lbXUtY29tbWFuZHMuanMnO1xuaW1wb3J0IHNldHRpbmdzQ2xpZW50Q29tbWFuZHMgZnJvbSAnLi9zZXR0aW5ncy1jbGllbnQtY29tbWFuZHMnO1xuaW1wb3J0IGxvY2tNYW5hZ2VtZW50Q29tbWFuZHMgZnJvbSAnLi9sb2NrbWdtdCc7XG5pbXBvcnQga2V5Ym9hcmRDb21tYW5kcyBmcm9tICcuL2tleWJvYXJkLWNvbW1hbmRzJztcblxuT2JqZWN0LmFzc2lnbihcbiAgICBtZXRob2RzLFxuICAgIG1hbmlmZXN0TWV0aG9kcyxcbiAgICBzeXN0ZW1DYWxsTWV0aG9kcyxcbiAgICBlbXVNZXRob2RzLFxuICAgIGFwa1NpZ25pbmdNZXRob2RzLFxuICAgIGFwa1V0aWxzTWV0aG9kcyxcbiAgICBhcGtzVXRpbHNNZXRob2RzLFxuICAgIGFhYlV0aWxzTWV0aG9kcyxcbiAgICBzZXR0aW5nc0NsaWVudENvbW1hbmRzLFxuICAgIGxvY2tNYW5hZ2VtZW50Q29tbWFuZHMsXG4gICAga2V5Ym9hcmRDb21tYW5kcyxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG5leHBvcnQgeyBnZXRBbmRyb2lkQmluYXJ5UGF0aCB9O1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,158 @@
1
+ import log from '../logger.js';
2
+ import path from 'path';
3
+ import { fs, tempDir, util } from '@appium/support';
4
+ import LRU from 'lru-cache';
5
+ import { unzipFile } from '../helpers.js';
6
+ import AsyncLock from 'async-lock';
7
+ import B from 'bluebird';
8
+ import crypto from 'crypto';
9
+
10
+ const AAB_CACHE = new LRU({
11
+ max: 10,
12
+ dispose: (hash, extractedFilesRoot) => fs.rimraf(extractedFilesRoot),
13
+ });
14
+ const AAB_CACHE_GUARD = new AsyncLock();
15
+ const UNIVERSAL_APK = 'universal.apk';
16
+
17
+ const aabUtilsMethods = {};
18
+
19
+ process.on('exit', () => {
20
+ if (!AAB_CACHE.size) {
21
+ return;
22
+ }
23
+
24
+ const paths = [...AAB_CACHE.values()];
25
+ log.debug(`Performing cleanup of ${paths.length} cached .aab ` +
26
+ util.pluralize('package', paths.length));
27
+ for (const appPath of paths) {
28
+ try {
29
+ // Asynchronous calls are not supported in onExit handler
30
+ fs.rimrafSync(appPath);
31
+ } catch (e) {
32
+ log.warn(e.message);
33
+ }
34
+ }
35
+ });
36
+
37
+ /**
38
+ * @typedef {Object} ApkCreationOptions
39
+ * @property {string} keystore Specifies the path to the deployment keystore used
40
+ * to sign the APKs. This flag is optional. If you don't include it,
41
+ * bundletool attempts to sign your APKs with a debug signing key.
42
+ * If the .apk has been already signed and cached then it is not going to be resigned
43
+ * unless a different keystore or key alias is used.
44
+ * @property {string} keystorePassword Specifies your keystore’s password.
45
+ * It is mandatory to provide this value if `keystore` one is assigned
46
+ * otherwise it is going to be ignored.
47
+ * @property {string} keyAlias Specifies the alias of the signing key you want to use.
48
+ * It is mandatory to provide this value if `keystore` one is assigned
49
+ * otherwise it is going to be ignored.
50
+ * @property {string} keyPassword Specifies the password for the signing key.
51
+ * It is mandatory to provide this value if `keystore` one is assigned
52
+ * otherwise it is going to be ignored.
53
+ */
54
+
55
+ /**
56
+ * Builds a universal .apk from the given .aab package. See
57
+ * https://developer.android.com/studio/command-line/bundletool#generate_apks
58
+ * for more details.
59
+ *
60
+ * @param {string} aabPath Full path to the source .aab package
61
+ * @param {ApkCreationOptions} opts
62
+ * @returns The path to the resulting universal .apk. The .apk is stored in the internal cache
63
+ * by default.
64
+ * @throws {Error} If there was an error while creating the universal .apk
65
+ */
66
+ aabUtilsMethods.extractUniversalApk = async function extractUniversalApk (aabPath, opts = {}) {
67
+ if (!await fs.exists(aabPath)) {
68
+ throw new Error(`The file at '${aabPath}' either does not exist or is not accessible`);
69
+ }
70
+
71
+ const aabName = path.basename(aabPath);
72
+ const apkName = aabName.substring(0, aabName.length - path.extname(aabName).length) + '.apk';
73
+ const tmpRoot = await tempDir.openDir();
74
+ const tmpApksPath = path.join(tmpRoot, `${aabName}.apks`);
75
+ try {
76
+ return await AAB_CACHE_GUARD.acquire(aabPath, async () => {
77
+ const aabHash = await fs.hash(aabPath);
78
+ const {
79
+ keystore,
80
+ keystorePassword,
81
+ keyAlias,
82
+ keyPassword,
83
+ } = opts;
84
+ let cacheHash = aabHash;
85
+ if (keystore) {
86
+ if (!await fs.exists(keystore)) {
87
+ throw new Error(`The keystore file at '${keystore}' either does not exist ` +
88
+ `or is not accessible`);
89
+ }
90
+ if (!keystorePassword || !keyAlias || !keyPassword) {
91
+ throw new Error('It is mandatory to also provide keystore password, key alias, ' +
92
+ 'and key password if the keystore path is set');
93
+ }
94
+ const keystoreHash = await fs.hash(keystore);
95
+ const keyAliasHash = crypto.createHash('sha1');
96
+ keyAliasHash.update(keyAlias);
97
+ cacheHash = [cacheHash, keystoreHash, keyAliasHash.digest('hex')].join(':');
98
+ }
99
+ log.debug(`Calculated the cache key for '${aabPath}': ${cacheHash}`);
100
+ if (AAB_CACHE.has(cacheHash)) {
101
+ const resultPath = path.resolve(AAB_CACHE.get(cacheHash), apkName);
102
+ if (await fs.exists(resultPath)) {
103
+ return resultPath;
104
+ }
105
+ AAB_CACHE.del(cacheHash);
106
+ }
107
+
108
+ await this.initAapt2();
109
+ const args = [
110
+ 'build-apks',
111
+ '--aapt2', this.binaries.aapt2,
112
+ '--bundle', aabPath,
113
+ '--output', tmpApksPath,
114
+ ...(keystore ? [
115
+ '--ks', keystore,
116
+ '--ks-pass', `pass:${keystorePassword}`,
117
+ '--ks-key-alias', keyAlias,
118
+ '--key-pass', `pass:${keyPassword}`,
119
+ ] : []),
120
+ '--mode=universal'
121
+ ];
122
+ log.debug(`Preparing universal .apks bundle from '${aabPath}'`);
123
+ await this.execBundletool(args, `Cannot build a universal .apks bundle from '${aabPath}'`);
124
+
125
+ log.debug(`Unpacking universal application bundle at '${tmpApksPath}' to '${tmpRoot}'`);
126
+ await unzipFile(tmpApksPath, tmpRoot);
127
+ let universalApkPath;
128
+ const fileDeletionPromises = [];
129
+ const allFileNames = await fs.readdir(tmpRoot);
130
+ for (const fileName of allFileNames) {
131
+ const fullPath = path.join(tmpRoot, fileName);
132
+ if (fileName === UNIVERSAL_APK) {
133
+ universalApkPath = fullPath;
134
+ } else {
135
+ fileDeletionPromises.push(fs.rimraf(fullPath));
136
+ }
137
+ }
138
+ try {
139
+ await B.all(fileDeletionPromises);
140
+ } catch (ign) {}
141
+ if (!universalApkPath) {
142
+ log.debug(`The following items were extracted from the .aab bundle: ${allFileNames}`);
143
+ throw new Error(`${UNIVERSAL_APK} cannot be found in '${aabPath}' bundle. ` +
144
+ `Does the archive contain a valid application bundle?`);
145
+ }
146
+ const resultPath = path.join(tmpRoot, apkName);
147
+ log.debug(`Found ${UNIVERSAL_APK} at '${universalApkPath}'. Caching it to '${resultPath}'`);
148
+ await fs.mv(universalApkPath, resultPath);
149
+ AAB_CACHE.set(cacheHash, tmpRoot);
150
+ return resultPath;
151
+ });
152
+ } catch (e) {
153
+ await fs.rimraf(tmpRoot);
154
+ throw e;
155
+ }
156
+ };
157
+
158
+ export default aabUtilsMethods;
@@ -47,7 +47,7 @@ apkSigningMethods.executeApksigner = async function executeApksigner (args = [])
47
47
  log.debug(`Starting apksigner: ${util.quote(fullCmd)}`);
48
48
  // It is necessary to specify CWD explicitly; see https://github.com/appium/appium/issues/14724#issuecomment-737446715
49
49
  const {stdout, stderr} = await exec(fullCmd[0], fullCmd.slice(1), {
50
- cwd: path.dirname(apkSignerJar)
50
+ cwd: path.dirname(apkSignerJar), windowsVerbatimArguments: system.isWindows()
51
51
  });
52
52
  for (let [name, stream] of [['stdout', stdout], ['stderr', stderr]]) {
53
53
  if (!_.trim(stream)) {
@@ -132,7 +132,7 @@ apkSigningMethods.signWithCustomCert = async function signWithCustomCert (apk) {
132
132
  '-keypass', this.keyPassword,
133
133
  apk, this.keyAlias];
134
134
  log.debug(`Starting jarsigner: ${util.quote(fullCmd)}`);
135
- await exec(fullCmd[0], fullCmd.slice(1));
135
+ await exec(fullCmd[0], fullCmd.slice(1), { windowsVerbatimArguments: system.isWindows() });
136
136
  } catch (e) {
137
137
  throw new Error(`Could not sign with custom certificate. ` +
138
138
  `Original error: ${e.stderr || e.message}`);
@@ -337,7 +337,7 @@ apkSigningMethods.getKeystoreHash = async function getKeystoreHash () {
337
337
  ];
338
338
  log.info(`Running '${keytool}' with arguments: ${util.quote(args)}`);
339
339
  try {
340
- const {stdout} = await exec(keytool, args);
340
+ const {stdout} = await exec(keytool, args, { windowsVerbatimArguments: system.isWindows() });
341
341
  const result = {};
342
342
  for (const hashName of [SHA512, SHA256, SHA1, MD5]) {
343
343
  const hashRe = new RegExp(`^\\s*${hashName}:\\s*([a-f0-9:]+)`, 'mi');
@@ -15,8 +15,7 @@ import os from 'os';
15
15
  import LRU from 'lru-cache';
16
16
  import ApkReader from 'adbkit-apkreader';
17
17
 
18
-
19
- let apkUtilsMethods = {};
18
+ const apkUtilsMethods = {};
20
19
 
21
20
  const ACTIVITIES_TROUBLESHOOTING_LINK =
22
21
  'https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md';
@@ -460,8 +459,8 @@ apkUtilsMethods.cacheApk = async function cacheApk (apkPath, options = {}) {
460
459
  log.info(`The application at '${apkPath}' is already cached to '${remotePath}'`);
461
460
  // Update the application timestamp asynchronously in order to bump its position
462
461
  // in the sorted ls output
463
- this.shell(['touch', '-am', remotePath])
464
- .catch(() => {});
462
+ // eslint-disable-next-line promise/prefer-await-to-then
463
+ this.shell(['touch', '-am', remotePath]).catch(() => {});
465
464
  } else {
466
465
  log.info(`Caching the application at '${apkPath}' to '${remotePath}'`);
467
466
  const timer = new timing.Timer().start();
@@ -476,7 +475,7 @@ apkUtilsMethods.cacheApk = async function cacheApk (apkPath, options = {}) {
476
475
  });
477
476
  }
478
477
  // Cleanup the invalid entries from the cache
479
- _.difference(this.remoteAppsCache.keys(), remoteCachedFiles.map(toHash))
478
+ _.difference([...this.remoteAppsCache.keys()], remoteCachedFiles.map(toHash))
480
479
  .forEach((hash) => this.remoteAppsCache.del(hash));
481
480
  // Bump the cache record for the recently cached item
482
481
  this.remoteAppsCache.set(appHash, remotePath);
@@ -484,7 +483,7 @@ apkUtilsMethods.cacheApk = async function cacheApk (apkPath, options = {}) {
484
483
  const entriesToCleanup = remoteCachedFiles
485
484
  .map((x) => path.posix.join(REMOTE_CACHE_ROOT, x))
486
485
  .filter((x) => !this.remoteAppsCache.has(toHash(x)))
487
- .slice(this.remoteAppsCacheLimit - this.remoteAppsCache.keys().length);
486
+ .slice(this.remoteAppsCacheLimit - [...this.remoteAppsCache.keys()].length);
488
487
  if (!_.isEmpty(entriesToCleanup)) {
489
488
  try {
490
489
  await this.shell(['rm', '-f', ...entriesToCleanup]);
@@ -19,12 +19,14 @@ const APKS_CACHE = new LRU({
19
19
  const APKS_CACHE_GUARD = new AsyncLock();
20
20
  const BUNDLETOOL_TIMEOUT_MS = 4 * 60 * 1000;
21
21
 
22
+ const apksUtilsMethods = {};
23
+
22
24
  process.on('exit', () => {
23
- if (APKS_CACHE.itemCount === 0) {
25
+ if (!APKS_CACHE.size) {
24
26
  return;
25
27
  }
26
28
 
27
- const paths = APKS_CACHE.values();
29
+ const paths = [...APKS_CACHE.values()];
28
30
  log.debug(`Performing cleanup of ${paths.length} cached .apks ` +
29
31
  util.pluralize('package', paths.length));
30
32
  for (const appPath of paths) {
@@ -83,8 +85,6 @@ async function extractFromApks (apks, dstPath) {
83
85
  });
84
86
  }
85
87
 
86
- let apksUtilsMethods = {};
87
-
88
88
  /**
89
89
  * Executes bundletool utility with given arguments and returns the actual stdout
90
90
  *
@@ -271,7 +271,7 @@ apksUtilsMethods.extractLanguageApk = async function extractLanguageApk (apks, l
271
271
  return await this.extractBaseApk(apks);
272
272
  };
273
273
 
274
- apksUtilsMethods.isTestPackageOnlyError = function (output) {
274
+ apksUtilsMethods.isTestPackageOnlyError = function isTestPackageOnlyError (output) {
275
275
  return /\[INSTALL_FAILED_TEST_ONLY\]/.test(output);
276
276
  };
277
277
 
@@ -4,6 +4,7 @@ import systemCallMethods, { getAndroidBinaryPath } from './system-calls.js';
4
4
  import apkSigningMethods from './apk-signing.js';
5
5
  import apkUtilsMethods from './apk-utils.js';
6
6
  import apksUtilsMethods from './apks-utils.js';
7
+ import aabUtilsMethods from './aab-utils.js';
7
8
  import emuMethods from './adb-emu-commands.js';
8
9
  import settingsClientCommands from './settings-client-commands';
9
10
  import lockManagementCommands from './lockmgmt';
@@ -17,6 +18,7 @@ Object.assign(
17
18
  apkSigningMethods,
18
19
  apkUtilsMethods,
19
20
  apksUtilsMethods,
21
+ aabUtilsMethods,
20
22
  settingsClientCommands,
21
23
  lockManagementCommands,
22
24
  keyboardCommands,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-adb",
3
- "version": "9.0.0",
3
+ "version": "9.2.1",
4
4
  "description": "Android Debug Bridge interface",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -49,9 +49,9 @@
49
49
  "async-lock": "^1.0.0",
50
50
  "asyncbox": "^2.6.0",
51
51
  "bluebird": "^3.4.7",
52
- "ini": "^2.0.0",
52
+ "ini": "^3.0.0",
53
53
  "lodash": "^4.0.0",
54
- "lru-cache": "^6.0.0",
54
+ "lru-cache": "^7.3.0",
55
55
  "semver": "^7.0.0",
56
56
  "source-map-support": "^0.x",
57
57
  "teen_process": "^1.11.0",
@@ -67,18 +67,16 @@
67
67
  "@appium/test-support": "^1.0.0",
68
68
  "@babel/core": "^7.16.0",
69
69
  "@babel/eslint-parser": "^7.16.3",
70
+ "@semantic-release/git": "^10.0.1",
70
71
  "chai": "^4.1.0",
71
72
  "chai-as-promised": "^7.1.1",
72
- "eslint": "^7.32.0",
73
- "eslint-plugin-import": "^2.25.3",
74
- "eslint-plugin-mocha": "^9.0.0",
75
- "eslint-plugin-promise": "^6.0.0",
76
73
  "gulp": "^4.0.0",
77
74
  "mocha": "^9.0.0",
78
75
  "mocha-junit-reporter": "^2.0.0",
79
76
  "mocha-multi-reporters": "^1.1.7",
80
77
  "pre-commit": "^1.1.3",
81
- "sinon": "^12.0.0",
78
+ "semantic-release": "^19.0.2",
79
+ "sinon": "^13.0.0",
82
80
  "temp": "^0.x"
83
81
  }
84
82
  }
package/lib/.DS_Store DELETED
Binary file